MalformedPolicyDocumentが出たら記述の順番を厳正に守る

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"が出たら、そんな馬鹿なと思っても、記述の順番を厳正に守ってみるといいかもしれない。