この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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) がお送りしました。