AWS Terraform

TerraformデプロイでS3バケットポリシー付与失敗する件

最近、業務でTerraformを触るようになったのですがすごく便利ですね

前職ではCDKを導入したりしましたがTerraformが人気な理由が少しわかった気がします
リソースごとにファイルを分けるやり方が管理しやすくて、半分Terraform派になってます

それはさておき、TerraformでS3バケットを作成しようとしたところバケットポリシーの付与にAccess Denied で失敗したので調査してみました

何が起きたのか

TerraformでS3バケットと、S3バケットポリシーのresourceを定義してterraform applyしたところ
バケットポリシーだけAccess Deniedで付与できてませんでした

Terraformのソースコードは以下 ※簡略版

# s3.tf

resource "aws_s3_bucket" "test_bucket" {
  bucket = "${var.bucket_name}"
}

resource "aws_s3_bucket_policy" "test_bucket_policy" {
  bucket = aws_s3_bucket.test_bucket.id
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid       = "PutRequestWriteOnly"
        Effect    = "Allow"
        Principal = "*"
        Action    = "s3:PutObject"
        Resource  = "${aws_s3_bucket.test_bucket.arn}/*"
      }
    ]
  })
}

原因

S3バケットのブロックパブリックアクセスが全てデフォルトでオンになっていたためでした

ブロックパブリックアクセスはS3コンソールでバケットを選択後「アクセス許可」タブ にて設定を確認・編集できます

今回バケットポリシーが付与できなかった直接の原因は3番目の項目である
新しいパブリックバケットポリシーまたはアクセスポイントポリシーを介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックする」がオンになっていたからでした

AWSのre:postによると2023年4月以降からこういった対応になっていたようです

S3 ブロックパブリックアクセス設定のオン/オフ
注:2023 年 4 月以降、新しく作成された S3 バケットはすべて S3 ブロックパブリックアクセスがデフォルトでオンになっています。

この設定は、アカウントレベル、バケットレベル、またはその両方で有効にできます。

https://repost.aws/ja/knowledge-center/s3-block-public-access-setting

対策

ブロックパブリックアクセスのうち問題となっている3番目の項目のチェックを外して保存します

そして再度Terraformからリソースをデプロイします

$ terraform apply

バケットポリシーが付与されたのを確認したら再度ブロックパブリックアクセスのすべてをオンにして保存しなおします

最後に

最初AWSでの権限不足ということで IAMユーザーの権限回りや組織全体のセキュリティ管理であるSCPなどかと思いましたが、
まさかのS3バケット自体のデフォルト設定に阻まれてデプロイ失敗するとは思いませんでした。

実は同じファイルに同じように記載されたS3バケットのポリシー付与があり、そちらは問題なく動いていたので
それが余計混乱した原因でした

terraform applyだけでリソース構築しきれないのがすごくもどかしいのですが、これからもっとうまいやり方を探しておこうと思います

またS3バケットにはネットワークACLやバケットポリシー、今回問題になったブロックパブリックアクセスなどセキュリティに関わる
様々な設定が存在しているので他の設定についてもこれを機に確認しておこうと思います

-AWS, Terraform
-, , , ,