TerraformでS3のバケットポリシーを書く方法

less than 1 minute read

インフラのコード化を進める作業では、コード化のライブラリ作法に倣うため、ドキュメントを見ながら設定を書いていくことが多いです。

Terraform も例外ではないのですが、S3バケットのポリシー設定の所でふと気付いたので書いておきます。

Terraform公式のS3のバケットポリシーが…

Terraform公式の aws_s3_bucket_policy のリソースは policy の部分がヒアドキュメントで書かれています。

resource "aws_s3_bucket" "b" {
  bucket = "my_tf_test_bucket"
}

resource "aws_s3_bucket_policy" "b" {
  bucket = "${aws_s3_bucket.b.id}"
  policy =<<POLICY
{
  "Version": "2012-10-17",
  "Id": "MYBUCKETPOLICY",
  "Statement": [
    {
      "Sid": "IPAllow",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::my_tf_test_bucket/*",
      "Condition": {
         "IpAddress": {"aws:SourceIp": "8.8.8.8/32"}
      }
    }
  ]
}
POLICY
}

だめではないのですが、折角コード化を進めているので、ここもキレイにしたいですよね。

IAMポリシードキュメントのデータソース(aws_iam_policy_document)を使う

結論から言うと、 aws_iam_policy_document のデータソースを使用することができます。

データソース名から 「IAMにしか適用できないのでは?」 と思うかもしれませんが、結局はポリシードキュメントなので使えます。

resource "aws_s3_bucket" "b" {
  bucket = "my_tf_test_bucket"
}

resource "aws_s3_bucket_policy" "b" {
  bucket = "${aws_s3_bucket.b.id}"
  policy = "${aws_iam_policy_document.bucket_policy_document.json}"
}

data "aws_iam_policy_document" "bucket_policy_document" {

    statement {
        sid = "IPAllow"
        effect = "Deny"
        principals {
            type = "*"
            identifiers = ["*"]
        }
        actions = [
            "s3:*"
        ]
        resources = [
            "arn:aws:s3:::my_tf_test_bucket/*"
        ]
        condition {
            test = "IpAddress"
            variable = "aws:SourceIp"
            values = [
              "8.8.8.8/32"
            ]
        }
    }
}

ポイントは policy = "${aws_iam_policy_document.bucket_policy_document.json}" の所です。

データソースをJSON文字列にしてくれます。

AWS公式の IAM JSON ポリシーエレメント: 条件演算子 にもある通り、 IpAddress も条件演算子のひとつとして定義されているので、ちゃんと condition ブロックで使えます。

強いてクセを挙げるとしたら、

"Principal": "*",

を表現するために

principals {
    type = "*"
    identifiers = ["*"]
}

と記述しないといけない所でしょうか。

まとめ

S3バケットのポリシードキュメントも aws_iam_policy_document を使えば、Terraformのコードとして管理できます。 HCLからポリシードキュメント(JSON)を生成するために、微妙に書き方が違う部分がありますが、それは普段通りTerraformの公式を読めばなんとかなるでしょう。 さらばヒアドキュメント!!

参考にさせていただいたサイト


Comments