IAMのポリシーを定義するためのaws_iam_policy_documentというdata sourceがあるがあんまり好きではなくて
- terraformの差分はjsonencodeで出るので、aws_iam_policy_documentとマッピングしにくい
- aws_iam_policy_documentだと意図せず差分が大きくなることがある
- リソース定義とポリシーの定義が分離される
- data sourceごとに論理名が必要になる
といったデメリットがある。
ある程度入力値を制限できるが、個人的にはjsonencodeを使うことが多い。
そうはいってもaws_iam_policy_documentが好まれることもあるので、jsonencodeで同等の機能を代替できるようにaws_iam_policy_documentよりももう少し検証機能を強くして、かつJSONとそのままマッピング可能なHCLを渡せるユーザー定義関数を作ってみた。
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/*" } ] }) }
エラーはこんな感じ
