新機能の予兆ない? AWS 管理ポリシーのアップデートを見つめていたいあなたに捧げる AWS CLI エイリアス三銃士

aws policy-ls と aws policy-diff と aws policy-cat を連れてきたよ

AWS アップデートの前に AWS 管理ポリシーがアップデートされていることがある

コンバンハ、千葉(幸)です。

AWS のアップデートや新機能の追加が行われる場合、先行して AWS 管理ポリシーにアップデートがかかっている場合があります。まったく新しい AWS サービスロール用ポリシーが増えることもあれば、既存のポリシーにアクションが追加される場合もあります。

そうなると……いつまでも見つめていたいですよね。目を離したくない。とは言え四六時中 見張っているわけにもいかないので、せめて楽に AWS 管理ポリシーの更新をチェックできる AWS CLI エイリアスを考えてみました。

3つを組み合わせて使います。

AWS 管理ポリシーアップデートチェックのための AWS CLI エイリアス三銃士

連れてきたよ。

指定した日数分さかのぼって更新をチェックする aws policy-ls

  • 指定が必要な引数:さかのぼる日数

10日間さかのぼって確認する場合の例です。期間内に更新された AWS 管理ポリシーが更新日付が古い順にソートされて表示されます。

$ aws policy-ls 10
List policies updated after 2022-03-18T15:19:34 (UTC).
-------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                    ListPolicies                                                                     |
+------------------------------------------------------------------------------------------------------------+----------------------------+-----------+
|                                                     Arn                                                    |           Date             |  Version  |
+------------------------------------------------------------------------------------------------------------+----------------------------+-----------+
|  arn:aws:iam::aws:policy/aws-service-role/AmazonRDSServiceRolePolicy                                       |  2022-03-21T15:03:27+00:00 |  v11      |
|  arn:aws:iam::aws:policy/AmazonSageMakerAdmin-ServiceCatalogProductsServiceRolePolicy                      |  2022-03-21T17:33:28+00:00 |  v5       |
|  arn:aws:iam::aws:policy/AWSMigrationHubRefactorSpacesFullAccess                                           |  2022-03-21T17:41:49+00:00 |  v3       |
|  arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy                                                         |  2022-03-21T22:39:36+00:00 |  v2       |
|  arn:aws:iam::aws:policy/AWSIdentitySyncFullAccess                                                         |  2022-03-23T23:29:33+00:00 |  v1       |
|  arn:aws:iam::aws:policy/AWSIdentitySyncReadOnlyAccess                                                     |  2022-03-23T23:29:52+00:00 |  v1       |
|  arn:aws:iam::aws:policy/service-role/AmazonSageMakerServiceCatalogProductsApiGatewayServiceRolePolicy     |  2022-03-25T04:25:36+00:00 |  v1       |
|  arn:aws:iam::aws:policy/service-role/AmazonSageMakerServiceCatalogProductsCloudformationServiceRolePolicy |  2022-03-25T04:26:40+00:00 |  v1       |
|  arn:aws:iam::aws:policy/AmazonSageMakerServiceCatalogProductsCodeBuildServiceRolePolicy                   |  2022-03-25T04:27:46+00:00 |  v1       |
|  arn:aws:iam::aws:policy/AWSSSOMasterAccountAdministrator                                                  |  2022-03-25T18:53:19+00:00 |  v5       |
|  arn:aws:iam::aws:policy/AWSSSOMemberAccountAdministrator                                                  |  2022-03-25T20:11:32+00:00 |  v4       |
|  arn:aws:iam::aws:policy/AWSSSODirectoryAdministrator                                                      |  2022-03-25T20:31:19+00:00 |  v3       |
|  arn:aws:iam::aws:policy/AWSSSODirectoryReadOnly                                                           |  2022-03-25T20:57:20+00:00 |  v3       |
+------------------------------------------------------------------------------------------------------------+----------------------------+-----------+

ポリシーの ARN、更新日時、バージョンを表示します。

指定した管理ポリシーの直近のバージョンとの比較をする aws policy-diff

  • 指定が必要な引数:チェックしたい管理ポリシーの ARN

aws policy-lsでポリシーの ARN が確認できたので、気になるポリシーをチェックしてみましょう。

$ aws policy-diff arn:aws:iam::aws:policy/AWSSSODirectoryAdministrator
diff Vesion2 and Vesion3.
*** Version2:"2020-08-18T17:17:40+00:00"
--- Version3:"2022-03-25T20:31:19+00:00"
***************
*** 8 ****
--- 9 ----
+         "identitystore:*",

「デフォルトバージョンのひとつ前」のバージョンと、デフォルトバージョンとを比較します。デフォルトバージョンがv1のものはここでは指定しないでください。

指定した管理ポリシーのポリシードキュメントを表示する aws policy-cat

  • 指定が必要な引数:チェックしたい管理ポリシーの ARN

差分だけ見てもピンとこない、あるいはデフォルトバージョンv1のものの中身をみたい、という場合はそのポリシーの中身を参照してみましょう。

$ aws policy-cat arn:aws:iam::aws:policy/AWSSSODirectoryAdministrator
View v3 policy document.
     1	{
     2	  "Version": "2012-10-17",
     3	  "Statement": [
     4	    {
     5	      "Sid": "AWSSSODirectoryAdministrator",
     6	      "Effect": "Allow",
     7	      "Action": [
     8	        "sso-directory:*",
     9	        "identitystore:*",
    10	        "sso:ListDirectoryAssociations"
    11	      ],
    12	      "Resource": "*"
    13	    }
    14	  ]
    15	}

エイリアス三銃士により紡がれるトライアングル

こうです。

エイリアス三銃士をまとめて定義するエイリアスファイル

  • aws policy-ls
  • aws policy-diff
  • aws policy-cat

上記のエイリアスをまとめて定義したファイルが以下です。Mac で動作確認しています。

~/.aws/cli/alias

[toplevel]
policy-ls =
    !f() {
        DATE=$(TZ=0 date -v-"$1"d +%Y-%m-%dT%H:%M:%S)
        echo "List policies updated after $DATE (UTC)."
        aws iam list-policies \
        --scope AWS \
        --query "sort_by(Policies[? UpdateDate >= '$DATE'].{Arn:Arn,Version:DefaultVersionId,Date:UpdateDate},&Date)" \
        --output table
    }; f

policy-diff =
    !f() {
        VERSION=$(aws iam get-policy --policy-arn $1 --query 'Policy.DefaultVersionId' --output text | tr -d "v")
        BEFORE_VERSION=$((VERSION-1))

        echo "diff Vesion$BEFORE_VERSION and Vesion$VERSION."

        BEFORE_RESULT=$(aws iam get-policy-version --policy-arn $1 --version-id v$BEFORE_VERSION)
        AFTER_RESULT=$(aws iam get-policy-version --policy-arn $1 --version-id v$VERSION)

        echo $BEFORE_RESULT | jq .PolicyVersion.Document >> /tmp/policy_before
        echo $AFTER_RESULT | jq .PolicyVersion.Document >> /tmp/policy_after

        BEFORE_DATE=$(echo $BEFORE_RESULT | jq .PolicyVersion.CreateDate)
        AFTER_DATE=$(echo $AFTER_RESULT | jq .PolicyVersion.CreateDate)

        diff -C 0 --label "Version$BEFORE_VERSION:$BEFORE_DATE" --label "Version$VERSION:$AFTER_DATE" /tmp/policy_before /tmp/policy_after
        rm /tmp/policy_*
  }; f

policy-cat =
    !f() {
        VERSION=$(aws iam get-policy --policy-arn $1 --query 'Policy.DefaultVersionId' --output text)
        echo "View $VERSION policy document."
        aws iam get-policy-version --policy-arn $1 --version-id $VERSION | jq .PolicyVersion.Document | nl
    }; f

AWS CloudShell で使用する場合、aws policy-lsの date コマンドを使用する部分を以下のように変更してください。

policy-ls =
    !f() {
        DATE=$(TZ=0 date --date "$1 days ago" +%Y-%m-%dT%H:%M:%S)
        echo "List policies updated after $DATE (UTC)."
        aws iam list-policies \
        --scope AWS \
        --query "sort_by(Policies[? UpdateDate >= '$DATE'].{Arn:Arn,Version:DefaultVersionId,Date:UpdateDate},&Date)" \
        --output table
    }; f

DATE=$(TZ=0 date --date "$1 days ago" +%Y-%m-%dT%H:%M:%S)

簡単に中身を解説していきます。

aws policy-ls

policy-ls =
    !f() {
        DATE=$(TZ=0 date -v-"$1"d +%Y-%m-%dT%H:%M:%S)
        echo "List policies updated after $DATE (UTC)."
        aws iam list-policies \
        --scope AWS \
        --query "sort_by(Policies[? UpdateDate >= '$DATE'].{Arn:Arn,Version:DefaultVersionId,Date:UpdateDate},&Date)" \
        --output table
    }; f

大まかに以下の処理を行います。

  • 指定した日数分さかのぼった日時(UTC)を取得
  • メッセージを出力
  • aws iam list-policiesを実行
    • 更新時刻が指定した期間より新しいものでフィルター
    • Arn,DefaultVersionId,UpdateDateのみ出力
    • UpdateDateで昇順にソート

--queryの処理の部分がお気に入りです。aws iam list-policiesの詳細は以下を参照してください。

aws policy-diff

policy-diff =
    !f() {
        VERSION=$(aws iam get-policy --policy-arn $1 --query 'Policy.DefaultVersionId' --output text | tr -d "v")
        BEFORE_VERSION=$((VERSION-1))

        echo "diff Vesion$BEFORE_VERSION and Vesion$VERSION."

        BEFORE_RESULT=$(aws iam get-policy-version --policy-arn $1 --version-id v$BEFORE_VERSION)
        AFTER_RESULT=$(aws iam get-policy-version --policy-arn $1 --version-id v$VERSION)

        echo $BEFORE_RESULT | jq .PolicyVersion.Document >> /tmp/policy_before
        echo $AFTER_RESULT | jq .PolicyVersion.Document >> /tmp/policy_after

        BEFORE_DATE=$(echo $BEFORE_RESULT | jq .PolicyVersion.CreateDate)
        AFTER_DATE=$(echo $AFTER_RESULT | jq .PolicyVersion.CreateDate)

        diff -C 0 --label "Version$BEFORE_VERSION:$BEFORE_DATE" --label "Version$VERSION:$AFTER_DATE" /tmp/policy_before /tmp/policy_after
        rm /tmp/policy_*
  }; f

大まかに以下の処理を行います。

  • 引数として指定したポリシーのデフォルトバージョン、その直前のバージョンを取得
  • メッセージを出力
  • デフォルトバージョン、その直前のバージョンのポリシーの内訳を取得
    • ポリシードキュメントをtmpファイルに出力
    • ポリシーバージョンの作成日時を取得
  • tmpファイルを対象に diff を実施
  • tmpファイルを削除

こちらについての詳細は以下エントリで独立して取り上げています。

エイリアスの名前を少し変えたほか、メッセージの出力処理を追加しています。

このコマンドで使用している AWS CLI コマンドは以下です。

aws policy-cat

policy-cat =
    !f() {
        VERSION=$(aws iam get-policy --policy-arn $1 --query 'Policy.DefaultVersionId' --output text)
        echo "View $VERSION policy document."
        aws iam get-policy-version --policy-arn $1 --version-id $VERSION | jq .PolicyVersion.Document | nl
    }; f

処理の内訳は以下です。

  • 引数として指定したポリシーのデフォルトバージョンを取得
  • メッセージを出力
  • ポリシードキュメントの内容を行番号付きで出力

aws policy-diffで差分がある行が出力されるので、その箇所も含めて確認したいかと思いnlコマンドをかませています。不要な場合は削ってください。

エイリアス三銃士により紡がれるトライアングル(再掲)

こうです。

AWS CLI エイリアスでお手軽にニヤニヤしよう

AWS 管理ポリシーの更新に目を光らせるための AWS CLI エイリアス3点セットを考えてみました。

およそ一年前に以下のエントリを書いており、当時から AWS 管理ポリシーの更新に首ったけでした。エイリアス化したことで、当時より楽にニヤニヤできるようになったかと思います。

エラーハンドリングなど一切考慮してない簡易なものですが、興味がある方はご活用ください。

わたしは今、AWSIdentitySyncFullAccessってなんだろうなと思いながらニヤニヤしています。

以上、 チバユキ (@batchicchi) がお送りしました。

参考