Joh*_*rna 6 acl amazon-s3 terraform
我一直在尝试使用 Terraform 重新创建现有基础设施,所需的服务之一是 S3 存储桶,其中应包含可公开访问的图像。
这是存储桶的 Terraform 代码:
resource "aws_s3_bucket" "foo_icons" {
bucket = join("-", [local.prefix, "foo", "icons"])
tags = {
Name = join("-", [local.prefix, "foo", "icons"])
Environment = var.environment
}
}
resource "aws_s3_bucket_acl" "icons_bucket_acl" {
bucket = aws_s3_bucket.foo_icons.id
acl = "public-read"
}
Run Code Online (Sandbox Code Playgroud)
存储桶的填充方式如下:
resource "aws_s3_object" "icon_repository_files" {
for_each = fileset("../files/icon-repository/", "**")
bucket = aws_s3_bucket.foo_icons.id
key = each.value
source = "../files/icon-repository/${each.value}"
etag = filemd5("../files/icon-repository/${each.value}")
}
Run Code Online (Sandbox Code Playgroud)
我在控制台上看到的结果是,该存储桶实际上是可公开访问的,但根据显示的 ACL,该存储桶中的每个对象都不是公开的。我也无法通过显示的 url 访问 S3 对象:这会导致访问被拒绝。
在 Terraform 中创建包含可公开访问的对象的存储桶的最佳方法是什么?我读到 ACL 不再“现代”,所以如果有更好的方法来实现这一点,我会很高兴听到。
公共存储桶并不意味着其中的所有对象也是公共的。权限比这更细粒度。要允许任何人全面访问存储桶中的每个对象,您可以使用资源向每个人aws_s3_bucket_policy
授予权限s3:GetObject
。
这是一个公共存储桶的示例,使用最新的aws_s3_bucket_public_access_block
资源,正如您提到的,旨在替换参数acl
。
resource "aws_s3_bucket" "foo_icons" {
bucket = join("-", [local.prefix, "foo", "icons"])
}
resource "aws_s3_bucket_ownership_controls" "foo_icons" {
bucket = aws_s3_bucket.foo_icons.id
rule {
object_ownership = "BucketOwnerPreferred"
}
}
resource "aws_s3_bucket_public_access_block" "foo_icons" {
bucket = aws_s3_bucket.foo_icons.id
block_public_acls = false
block_public_policy = false
ignore_public_acls = false
restrict_public_buckets = false
}
resource "aws_s3_bucket_acl" "foo_icons" {
bucket = aws_s3_bucket.foo_icons.id
acl = "public-read"
depends_on = [
aws_s3_bucket_ownership_controls.foo_icons,
aws_s3_bucket_public_access_block.foo_icons,
]
}
data "aws_iam_policy_document" "s3_bucket_foo_icons" {
policy_id = "s3_bucket_foo_icons"
statement {
actions = [
"s3:GetObject"
]
effect = "Allow"
resources = [
"${aws_s3_bucket.foo_icons.arn}/*"
]
principals {
type = "*"
identifiers = ["*"]
}
sid = "S3IconsBucketPublicAccess"
}
}
resource "aws_s3_bucket_policy" "foo_icons" {
bucket = aws_s3_bucket.foo_icons.id
policy = data.aws_iam_policy_document.s3_bucket.foo_icons.json
}
Run Code Online (Sandbox Code Playgroud)
应注意不要意外地将策略应用到其他存储桶,因为我们故意覆盖 S3 存储桶在创建时默认获得的几乎所有预防措施和权限。
归档时间: |
|
查看次数: |
1694 次 |
最近记录: |