繁体   English   中英

terraform cloudfront 分发源 - 如何更新 s3 存储桶策略

[英]terraform cloudfront distribution origin - how to update s3 bucket policy

在通过 aws 控制台创建云端分发时,我们可以选择源访问身份,还可以让它更新存储桶策略。

我正在尝试在 terraform 中寻找类似的选项,这样我就不必手动管理云端原始访问身份的 s3 存储桶读取权限。

我已经检查了https://www.terraform.io/docs/providers/aws/r/cloudfront_distribution.html但找不到对此类选项的任何引用。

如果我错过了检查页面上的某些内容,请告诉我。

我认为您没有错过该页面上的任何内容。 但是,您还需要查看此页面:
https://www.terraform.io/docs/providers/aws/r/s3_bucket.html
此页面包含有关设置 S3 存储桶的更多详细信息。 请注意静态网站托管部分中的策略行。 您可以添加一行

policy = "${file("policy.json")}"

然后您可以将所需的任何策略写入policy.json文件中,然后将其包含在内,从而使您无需在控制台中手动配置权限。

在阅读了这里的回复并在我的端做了一些阅读和测试后,我发现以下达到了我们想要的效果。 假设您已经在某处拥有 Cloudfront 发行版:

resource "aws_s3_bucket" "my-cdn-s3" {
  bucket = "my-cdn"
}

resource "aws_cloudfront_origin_access_identity" "my-oai" {
  comment = "my-oai"
}

resource "aws_s3_bucket_policy" "cdn-cf-policy" {
  bucket = aws_s3_bucket.my-cdn-s3.id
  policy = data.aws_iam_policy_document.my-cdn-cf-policy.json
}

data "aws_iam_policy_document" "my-cdn-cf-policy" {
  statement {
    sid = "1"
    principals {
      type        = "AWS"
      identifiers = [aws_cloudfront_origin_access_identity.my-cdn-oai.iam_arn]
    }

    actions = [
      "s3:GetObject"
    ]

    resources = [
      "${aws_s3_bucket.my-cdn-s3arn}/*"
    ]
  }
}

然后,我们将在存储桶的策略中获取此信息,该策略是我从 CF 和 S3 的非 Terraform 创建中复制的。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXX"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-cdn/*"
        }
    ]
}

如果我遗漏了什么,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM