S3のバケットポリシー作成でError putting S3 policy: AccessDenied: Access Denied

TerraformでS3のバケットポリシーでPrincipalに対してすべてを許可しようとするとエラーとなる。

data "aws_iam_policy_document" "example" {
  statement {
    actions   = ["s3:GetObject"]
    resources = ["${aws_s3_bucket.example.arn}/*"]
    principals {
      type        = "AWS"
      identifiers = ["*"] # すべてのPrincipalに許可
    }
  }
}

apply時に発生するエラーは以下の通り。

│ Error: Error putting S3 policy: AccessDenied: Access Denied
...

Principalに*以外を指定する

上記エラーを修正するにはPrincipal*以外を指定する。

例えば特定のIAMロールに対して許可する場合はそのIAMロールのARNを指定する。

data "aws_iam_policy_document" "example" {
  statement {
    actions   = ["s3:GetObject"]
    resources = ["${aws_s3_bucket.example.arn}/*"]
    principals {
      type        = "AWS"
      identifiers = ["arn:aws:iam::123456789012:role/role-name"] # 特定のIAMロールに許可
    }
  }
}

特定のAWSアカウントを指定する場合はそのAWSアカウントのアカウントIDを指定する。

data "aws_iam_policy_document" "example" {
  statement {
    actions   = ["s3:GetObject"]
    resources = ["${aws_s3_bucket.example.arn}/*"]
    principals {
      type        = "AWS"
      identifiers = ["123456789012"] # 特定のAWSアカウントに許可
    }
  }
}