cloudposse / cloudposse/terraform-aws-codebuild

IAM permissions are not adopted for custom S3 bucket

Open
#148 0 comments 0 reactions 0 assignees View on GitHub
bug
Dominant language
HCL
Stars
123
Forks
130
PR merge metrics
No merged PRs in 30d

Description

### Describe the Bug

If we enable S3 cache for AWS CodeBuild and use custom S3 bucket, we will get:
```
│ Error: creating IAM Policy (codebuild-myproject-cache-bucket): operation error IAM: CreatePolicy, https response error StatusCode: 400, RequestID: 08ef41e9-35fa-42ba-a223-06bb810a6925, MalformedPolicyDocument: Resource /* must be in ARN format or "*".

│ with module.codebuild-myproject.aws_iam_policy.default_cache_bucket[0],
│ on .terraform/modules/codebuild-myproject/main.tf line 179, in resource "aws_iam_policy" "default_cache_bucket":
│ 179: resource "aws_iam_policy" "default_cache_bucket" {
```

### Expected Behavior

An IAM policy with the required permissions to read from and write to the S3 bucket specified by the `s3_cache_bucket_name` input should be created.

### Steps to Reproduce

```
module "codebuild-myproject" {
source = "cloudposse/codebuild/aws"
version = "v2.0.2"

description = "GitHub Actions Runner"
enabled = true
name = "codebuild-myproject"

artifact_type = "NO_ARTIFACTS"

# Enabling S3 cache to the existing S3 bucket
cache_type = "S3"
s3_cache_bucket_name = "codebuild-myproject-s3-cache-bucket"
}
```

### Screenshots

`terraform plan` produces the following output for [**aws_iam_policy "default_cache_bucket"**](https://github.com/cloudposse/terraform-aws-codebuild/blob/2.0.2/main.tf#L179-L186):
```
# module.codebuild-myproject.aws_iam_policy.default_cache_bucket[0] will be created
+ resource "aws_iam_policy" "default_cache_bucket" {
+ arn = (known after apply)
+ attachment_count = (known after apply)
+ id = (known after apply)
+ name = "codebuild-myproject-cache-bucket"
+ name_prefix = (known after apply)
+ path = "/service-role/"
+ policy = jsonencode(
{
+ Statement = [
+ {
+ Action = "s3:*"
+ Effect = "Allow"
+ Resource = [
+ "/*",
+ "",
]
},
]
+ Version = "2012-10-17"
}
)
+ policy_id = (known after apply)
+ tags = {
+ "Name" = "codebuild-myproject"
}
+ tags_all = {
+ "Name" = "codebuild-myproject"
}
}
```

### Environment

- OS: MacOS 15.5
- Platform: darwin_arm64
- Module version: 2.0.2
- Terraform version: 1.12.2
* aws provider: 5.48.0
* random provider: 3.7.2

### Additional Context

### Root cause analysis

[local.s3_cache_enabled](https://github.com/cloudposse/terraform-aws-codebuild/blob/20c1b29e65f2d2fd752afd53abc0445b977cb88e/main.tf#L105) will be true if we enable S3 caching:
```
locals {
s3_cache_enabled = var.cache_type == "S3"
}
```
which results in the [IAM policy](https://github.com/cloudposse/terraform-aws-codebuild/blob/20c1b29e65f2d2fd752afd53abc0445b977cb88e/main.tf#L179-L186) with the following [IAM policy document](https://github.com/cloudposse/terraform-aws-codebuild/blob/20c1b29e65f2d2fd752afd53abc0445b977cb88e/main.tf#L318-L334):

```
data "aws_iam_policy_document" "permissions_cache_bucket" {
count = module.this.enabled && local.s3_cache_enabled ? 1 : 0
statement {
sid = ""

actions = [
"s3:*",
]

effect = "Allow"

resources = [
join("", aws_s3_bucket.cache_bucket[*].arn),
"${join("", aws_s3_bucket.cache_bucket[*].arn)}/*",
]
}
}
```
As we can see the policy document **resources** are not adopted for input `s3_cache_bucket_name` - it only works if creating a new S3 bucket. Therefore, when using a custom bucket we get empty string from join, which results in invalid Resources.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.