Разрешить CloudFront доступ к корзине S3 с исходным удостоверением доступа

Я создал статический веб-сайт с корзиной S3, который обслуживается CloudFront. Я хотел бы ограничить доступ к корзинам напрямую только из CloudFront через Origin Access Identity.

Я попытался обновить политику корзины 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 
}

person Obivan    schedule 17.05.2018    source источник


Ответы (1)


Как указано в документации aws_cloudfront_origin_access_identity лучший способ сделать это — создать документ политики IAM с aws_iam_policy_document источник данных, а затем прикрепить его напрямую.

Пример будет выглядеть примерно так:

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 
}
person ydaetskcoR    schedule 17.05.2018
comment
Спасибо. Я реализую это. - person Obivan; 18.05.2018
comment
Имейте в виду, что будет круговая зависимость, которой можно избежать, если вы используете третий ресурс aws_s3_bucket_policy для присоединения политики к корзине. подробнее здесь: github.com/hashicorp/terraform/issues/ - person Ivailo Bardarov; 24.09.2018