CloudFormationで作成したIAMポリシーのステートメント内のプロパティはいつも同じ順番になる/コンソールで作ったものとも順番が異なる


はじめに

IAMポリシーのステートメント内のプロパティの順番について、IAMポリシーを作成する方法が異なるとその順番も異なるということに気が付きました。

前提

CloudFormationのテンプレートでステートメント内のプロパティを以下のようにしたとします。

  • myPolicy1: Sid, Action, Effect, Resource の順に記述
  • myPolicy2: Sid, Effect, Action, Resource の順に記述

テンプレート

ActionやResourceは適当な内容にしています。

AWSTemplateFormatVersion: "2010-09-09"

Resources:
  Policy1:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      ManagedPolicyName: myPolicy1
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          # Sid, Action, Effect, Resource の順に記載
          - Sid: myPolicy1
            Action:
              - ec2:*
              - s3:*
            Effect: Allow
            Resource: "*"

  Policy2:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      ManagedPolicyName: myPolicy2
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          # Sid, Effect, Action, Resourceの順に記載
          - Sid: myPolicy2
          - Effect: Allow
            Action:
              - ec2:*
              - s3:*
            Resource: "*"

スタックを作成して、実際に出来上がったIAMポリシーを見ると、ステートメント内のプロパティの順番はテンプレートに書いた通りの順番とはならず、上記のテンプレートで記載した4つのプロパティの場合はAction, Resource, Effect, Sidの順になります。

myPolicy1

{
    "Version": "2012-10-17"
    "Statement": [
        {
            "Action:" [
                "ec2:*",
                "S3:*"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "myPolicy1"
        }
    ]
}

myPolicy2

{
    "Version": "2012-10-17"
    "Statement": [
        {
            "Action:" [
                "ec2:*",
                "S3:*"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "myPolicy2"
        }
    ]
}

AWS管理コンソールで作成した場合

なお、AWS管理コンソールでIAMポリシーを作成すると、以下のようになります。

{
    "Version": "2012-10-17"
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action:" [
                "S3:*",
                "ec2:*"
            ],
            "Resource": "*",
        }
    ]
}

何故このようなことを確認しようと思ったか?

テンプレートでIAMポリシーを作成する前に、AWS管理コンソールを操作して作成してあったIAMポリシーがありました。そのIAMポリシーをテンプレートに記載して、スタックに含めておいてほしいという要望があり、対応をしました。両者は同じAWSアカウント上に作っています。

AWS管理コンソールで作成したIAMポリシーは試作で、試作した結果を受けてスタックに取り込んでほしいという要望でした。

それでスタックは無事に作成でき、テンプレートからIAMポリシーを作成できたのですが、その後で「スタックで作ったIAMポリシーの内容が違う」と言われました。

そう言われて内容を確認したところ、ポリシーとしては何も違うところはなかったのですが、ステートメント内のプロパティの順番が両者で異なっていたのです。「スタックで作ったIAMポリシーの内容が違う」と述べた人は、プロパティそのものの内容までは見ておらず、プロパティの順番・見た目が違うだけで両者の内容が違うと言っていたことがわかりました。

その人はAWSに触れて日が浅かったために、単に見た目が違うというだけでそれぞれのポリシーは別物だと判断されてしまったのですが、見た目が違っていたのは確かだったので、それで調べてみたということでした。