cloudposse / cloudposse/terraform-aws-codebuild
IAM permissions are not adopted for custom S3 bucket
- 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
Assessment
This issue has not been assessed yet.