TerraformでIAM Policyを作っていたら、以下のエラーが出た。
MalformedPolicyDocument: The policy failed legacy parsing
なんのこっちゃと思ったら、Policyの記述順序が違っているのが原因だった。
どういうことか
まずは正しい例から示す。これが正しい順番。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessToLogBucket", "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "arn:aws:iam::${log_archive_account_id}:role/${log_backet_name}" } ] }
そしてこれがダメな順番。何が違うかと言うと、EffectのほうがActionよりさきに来ている。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessToLogBucket", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::${log_archive_account_id}:role/${log_backet_name}" } ] }
jsonは順番など特に関係しないはずだが、IAM Policyはそうではないらしく、順番が違うとエラーを起こすことがあるようだ。初めて遭遇した。
しかもどういうわけかTerraformから実行するとダメで、コンソールから実行すると通るという謎の現象が起きていた。だから余計に原因が探りづらく頭を抱えたのである(そして頭を抱える羽目になったからわざわざ記事にしたのである)。
"MalformedPolicyDocument: The policy failed legacy parsing"が出たら、そんな馬鹿なと思っても、記述の順番を厳正に守ってみるといいかもしれない。