aws_iam_policy_document の代わりとして terraform-provider-iamencode を作った

IAMのポリシーを定義するためのaws_iam_policy_documentというdata sourceがあるがあんまり好きではなくて

  1. terraformの差分はjsonencodeで出るので、aws_iam_policy_documentとマッピングしにくい
  2. aws_iam_policy_documentだと意図せず差分が大きくなることがある
  3. リソース定義とポリシーの定義が分離される
  4. data sourceごとに論理名が必要になる

といったデメリットがある。

ある程度入力値を制限できるが、個人的にはjsonencodeを使うことが多い。

そうはいってもaws_iam_policy_documentが好まれることもあるので、jsonencodeで同等の機能を代替できるようにaws_iam_policy_documentよりももう少し検証機能を強くして、かつJSONとそのままマッピング可能なHCLを渡せるユーザー定義関数を作ってみた。

github.com

terraform {
  required_providers {
    iamencode = {
      source = "winebarrel/iamencode"
    }
  }
}

output "policy" {
  value = provider::iamencode::policy({
    Version = "2012-10-17"
    Statement = [
      {
        Effect   = "Allow"
        Action   = ["s3:GetObject", "s3:PutObject"]
        Resource = "arn:aws:s3:::my-bucket/*"
      }
    ]
  })
}

エラーはこんな感じ