[Terraform] 如何使用 Terraform 代码启用 Amazon S3 ACL 访问
你好。我是加拿大办事处的 TK。加拿大今年经历了一个温和的冬天,圣诞节那天我在加拿大生平第一次下雨(通常会下雪)。
现在,这次我想简单总结一下我在使用 Terraform 构建 AWS 服务器时遇到的问题以及解决方法。
请注意,本文是针对已经在使用 Terraform 的人,因此我将省略介绍该工具等先决条件。
任务
当我配置CloudFront和S3来存储其日志时,计划期间没有发生错误,但应用期间发生以下错误。
│ 错误:创建 CloudFront 分配:InvalidArgument:您为 CloudFront 日志指定的 S3 存储桶未启用 ACL 访问:XXX-log-bucket.s3.amazonaws.com │ 状态代码:400,请求 ID:XXXXXXXXXXXXXX │ │ 带有 XXXXX。 aws_cloudfront_distribution.cf_distribution, │ 在 XXX/cloudfront.tf 第 XX 行,资源“aws_cloudfront_distribution”“cf_distribution”中: │ ........
似乎未启用 ACL 访问来将日志从 CloudFront 写入 S3 存储桶。
这是因为自 2023 年 4 月以来,已启用 S3 公共访问阻止(禁用 ACL)作为 Amazon S3 的新默认安全设置。
◎参考: https://zenn.dev/devcamp/articles/39ce7fd0272926
于是,我尝试直接在AWS控制台上启用目标S3存储桶上的ACL,并且应用没有任何问题通过,并且日志现在存储在相应的存储桶中。
我想用 Terraform 代码做同样的事情,但搜索后找不到在 Terraform 中编写它的方法,甚至当我询问 ChatGPT 时,他也只给了我没有意义的答案,所以我在亏了。
解决方案
ObjectOwnership 更改为 BucketOwnerEnforced 部分相对应的 Terraform 描述,并找到了似乎与之相对应的内容。
◎ 参考: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_ownership_controls
让我们将其添加到 S3 配置文件中。
// 日志存储桶对象所有者设置 ACL 启用资源 "aws_s3_bucket_ownership_controls" "log_ownership_controls" { bucket = aws_s3_bucket.log.id Rule { object_ownership = "BucketOwnerPreferred" } }
除非指定规则的 object_ownership,否则内容为“BucketOwnerEnforced(ACL 已禁用)”,因此显式指定为“BucketOwnerPreferred”。
然后,应用顺利通过,目标 S3 存储桶的 ACL 已启用,并且日志现在也存储在该存储桶中。
以上是如何使用 Terraform 启用 AWS ACL 访问。
做起来很简单,但我花了一段时间才找到正确的信息,所以我希望这篇文章对遇到同样情况的人有所帮助。
单击此处查看我们博客上与 Terraform 相关的文章。
感谢您的阅读。