最近、業務で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やバケットポリシー、今回問題になったブロックパブリックアクセスなどセキュリティに関わる
様々な設定が存在しているので他の設定についてもこれを機に確認しておこうと思います