首页 文章

允许CloudFront访问具有原始访问标识的S3存储桶

提问于
浏览
1

我创建了一个托管S3存储桶的静态网站,由CloudFront提供服务 . 我想仅通过Origin Access Identity从CloudFront直接限制存储桶访问 .

我试图更新S3存储桶策略,但它显示错误:

Error putting S3 policy: MalformedPolicy: Invalid principal in policy status code: 400, request id

我正在尝试使用以下政策:

resource "aws_s3_bucket_policy" "default" {
  bucket = "${aws_s3_bucket.default.id}"
  policy = <<EOF
  {
"Version": "2008-10-17",
"Statement": [
    {
        "Sid": "2",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity ${aws_cloudfront_origin_access_identity.origin_access_identity.id}"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::$/*"
    }
  ]
}
EOF 
}

1 回答

  • 2

    正如在_1179737中所提到的,最好的方法是使用_1179738生成IAM策略文档,然后直接附加它 .

    一个例子看起来像这样:

    data "aws_iam_policy_document" "s3_policy" {
      statement {
        actions   = ["s3:GetObject"]
        resources = ["${module.names.s3_endpoint_arn_base}/*"]
    
        principals {
          type        = "AWS"
          identifiers = ["${aws_cloudfront_origin_access_identity.origin_access_identity.iam_arn}"]
        }
      }
    
      statement {
        actions   = ["s3:ListBucket"]
        resources = ["${module.names.s3_endpoint_arn_base}"]
    
        principals {
          type        = "AWS"
          identifiers = ["${aws_cloudfront_origin_access_identity.origin_access_identity.iam_arn}"]
        }
      }
    }
    
    resource "aws_s3_bucket" "bucket" {
      # ...
      policy = "${data.aws_iam_policy_document.s3_policy.json}"
    }
    

    如果你真的想在问题中手工制作IAM政策那么你只需要这样的东西:

    resource "aws_s3_bucket_policy" "default" {
      bucket = "${aws_s3_bucket.default.id}"
      policy = <<EOF
    {
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "2",
            "Effect": "Allow",
            "Principal": {
                "AWS": "${aws_cloudfront_origin_access_identity.origin_access_identity.id}"
            },
            "Action": "s3:*",
            "Resource": "${aws_s3_bucket.default.arn}""
        }
      ]
    }
    EOF 
    }
    

相关问题