AWS 管理ポリシーの一覧や各種情報を AWS CLI で一括取得してニッコリする
コンバンハ、千葉(幸)です。
突然ですがわたしは AWS 管理ポリシーが好きです。いいえ、わたしのほうが好きです。
「AWS 管理ポリシーっていま全部で何個あるのかな?」「アンダースコアを含む AWS 管理ポリシーってどんなのがあるのかな?」など、ふとした時に確認したくなります。
そんな折、CloudWatchFullAccess
というAWS管理ポリシーが廃止され、CloudWatchFullAccessV2 という新しいポリシーができると耳にしました。
AWS 管理ポリシーが廃止(非推奨化)され新しいポリシーが作成される、というのは稀によくある話です。ここで、「末尾にV2
がついた AWS 管理ポリシー」がどのくらいあるのかを確認したくなりました。
せっかくなのでそれを確認しつつ、以下の操作の実行手順を整理してみます。
- AWS 管理ポリシーのポリシー名のみの一覧をテキストで取得する
- AWS 管理ポリシーの各種情報を CSV で取得する
- AWS 管理ポリシーの「ポリシー名」と「説明」を CSV で取得する
実行環境
手元の macOS と AWS CloudShell で動作確認をしています。
それぞれで使用した AWS CLI のバージョンは以下です。
- macOS:
aws-cli/2.9.1 Python/3.9.11 Darwin/22.6.0 exe/x86_64 prompt/off
- AWS CloudShell:
aws-cli/2.13.27 Python/3.11.6 Linux/4.14.255-322-265.538.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off
AWS 管理ポリシーの一覧をテキストで取得したい
以下の AWS CLI コマンドを使用します。
--scope
オプションでAWS
を指定することで、AWS 管理ポリシーに限定して取得できます。ここではポリシー名のみ取得したいので、--query
やjq
などのクライアントサイトのフィルタリングを行います。
--query
を使用する場合の例。
aws iam list-policies --scope AWS --query 'Policies[].[PolicyName]' --output text
jq
を使用する場合の例。
aws iam list-policies --scope AWS --output json | jq -r '.Policies[].PolicyName'
いずれの場合でも、以下のような形式でポリシー一覧が出力されます。
AdministratorAccess PowerUserAccess ReadOnlyAccess AWSCloudFormationReadOnlyAccess CloudFrontFullAccess AWSCloudHSMFullAccess AWSCloudHSMReadOnlyAccess ResourceGroupsandTagEditorFullAccess ResourceGroupsandTagEditorReadOnlyAccess CloudFrontReadOnlyAccess CloudSearchFullAccess CloudSearchReadOnlyAccess CloudWatchFullAccess CloudWatchReadOnlyAccess CloudWatchLogsFullAccess ...以下略
ちなみに、上記のポリシーは作成日時(CreateDate
)が古い順に並んでいます。
AWS 管理ポリシーの数をカウントする
ポリシー数をカウントしたい場合はパイプを挟んでwc -l
を実行しましょう。
$ aws iam list-policies --scope AWS --output json | jq -r '.Policies[].PolicyName' | wc -l 1132
2023/10/24現在で AWS 管理ポリシーは1132個ありました。念のためコンソールから確認した数とも一致しています。
一度のコマンド実行で取得できるポリシー数の上限が1000であると勘違いしていたのですが、それ以上の数を問題なく取得できています。
AWS 管理ポリシー名で grep する
特定の文字列を含むポリシー名のみ抜粋したい場合はgrep
を用います。
まずV2
を含むポリシーを抽出してみます。
% aws iam list-policies --scope AWS --query 'Policies[].[PolicyName]' --output text | grep V2 WAFV2LoggingServiceRolePolicy AmazonLexV2BotPolicy AWSCompromisedKeyQuarantineV2 AmazonRedshiftQueryEditorV2FullAccess AmazonRedshiftQueryEditorV2NoSharing AmazonRedshiftQueryEditorV2ReadSharing AmazonRedshiftQueryEditorV2ReadWriteSharing AWSElementalMediaPackageV2FullAccess AWSElementalMediaPackageV2ReadOnly CloudWatchFullAccessV2 AmazonLaunchWizardFullAccessV2
↑ポリシー名の任意の場所にV2
を含むポリシーがリストされました。
今回は「末尾にV2
がつく」に限定したいので、V2$
にしてみます。
$ aws iam list-policies --scope AWS --query 'Policies[].[PolicyName]' --output text | grep V2$ AWSCompromisedKeyQuarantineV2 CloudWatchFullAccessV2 AmazonLaunchWizardFullAccessV2
正規表現の利用を表す-E
オプションを付与してgrep -E V2$
としても同じ結果が得られます。
「V2
じゃなくて小文字のv2
がつく AWS 管理ポリシーもあったよな?」という記憶が蘇ってきたので、大文字と小文字を区別しないことを表す-i
オプションを追加してみます。
$ aws iam list-policies --scope AWS --query 'Policies[].[PolicyName]' --output text | grep -iE V2$ AmazonEMRServicePolicy_v2 AmazonEMRReadOnlyAccessPolicy_v2 AmazonEMRFullAccessPolicy_v2 AWSCompromisedKeyQuarantineV2 AWSApplicationMigrationAgentPolicy_v2 AWSElasticDisasterRecoveryStagingAccountPolicy_v2 CloudWatchFullAccessV2 AmazonLaunchWizardFullAccessV2 AmazonKeyspacesReadOnlyAccess_v2
_v2
接尾辞がつく AWS 管理ポリシーがあることもわかりました。この辺りの命名の多様さがね、好きなんですよね。
AmazonConnectFullAccess
というポリシーが廃止されてAmazonConnect_FullAccess
というポリシーが新たに作成されたこともありますからね。枠に囚われるのはやめましょう。
grep からさらにパイプを繋ぐ
わざわざ書くほどのことでもないですが、grep した後にさらにパイプを繋げられます。例えば特定の条件に合致するポリシー数をカウントする、ができます。
% aws iam list-policies --scope AWS --query 'Policies[].[PolicyName]' --output text | grep -iE V2$ \ | wc -l 9
nl コマンドで行番号をつける、というのも好きです。
% aws iam list-policies --scope AWS --query 'Policies[].[PolicyName]' --output text | grep -iE V2$ \ | nl 1 AmazonEMRServicePolicy_v2 2 AmazonEMRReadOnlyAccessPolicy_v2 3 AmazonEMRFullAccessPolicy_v2 4 AWSCompromisedKeyQuarantineV2 5 AWSApplicationMigrationAgentPolicy_v2 6 AWSElasticDisasterRecoveryStagingAccountPolicy_v2 7 CloudWatchFullAccessV2 8 AmazonLaunchWizardFullAccessV2 9 AmazonKeyspacesReadOnlyAccess_v2
AWS 管理ポリシーの各種情報を CSV で取得したい
ポリシー名以外にも以下コマンドで取得できる情報はさまざまあります。
リファレンスから出力例を一部引用すると、以下の通りです。
"Policies": [ { "PolicyName": "AdministratorAccess", "CreateDate": "2015-02-06T18:39:46Z", "AttachmentCount": 5, "IsAttachable": true, "PolicyId": "ANPAIWMBCKSKIEE64ZLYK", "DefaultVersionId": "v1", "Path": "/", "Arn": "arn:aws:iam::aws:policy/AdministratorAccess", "UpdateDate": "2015-02-06T18:39:46Z" },
これらのうち複数の項目を取得する際のコマンド例です。手軽に CSV にしたいので、jq
を使用します。
aws iam list-policies\ --scope AWS\ | jq -r ' ["ポリシー名","パス","デフォルトバージョン","作成日時","更新日時","アタッチ可否"], (.Policies[] | [.PolicyName,.Path,.DefaultVersionId,.CreateDate,.UpdateDate,.IsAttachable]) | @csv'
標準出力にそのまま出力すると膨大な量になるので、リダイレクトでファイルに出力したり macOS であればpbcopy
でクリップボードにコピーすると良いでしょう。
あとはお好きな形でスプレッドシートなどで取り扱いましょう。
こういうの眺めている時が一番楽しいですよね。
AWS 管理ポリシーにおける IsAttachable とは?
パラメータIsAttachable
の意味がスッと分からなかった方もいるかもしれません。これは「アタッチ可能か」を表すもので、ほとんどのポリシーではtrue
になっています。
これがfalse
になるのは非推奨(Deprecated)となった AWS 管理ポリシーです。
非推奨となった AWS 管理ポリシーは以下の特徴を持ちます。
- IAM リソース(ユーザー/グループ/ロール)にアタッチ済みであれば継続して使用可能
- 新たに IAM リソースにアタッチできない
- ひとつ以上の IAM リソースにアタッチされていない場合、当該ポリシーは一覧に現れない
冒頭で述べたCloudWatchFullAccess
は、いずれこの非推奨になります。なので、現時点で何かの IAM リソースにアタッチし、非推奨となった後にaws iam list policies
を実行すれば、IsAttachable
がfalse
として結果に現れます。
AWS 管理ポリシーの「説明」も取得したい
list-policies
コマンドではポリシーの「説明(Description
)」が出力に含まれません。そのため、別のコマンドを使用する必要があります。
aws iam get-policy
コマンドは一つずつ対象のポリシーを指定する必要があります。まずlist-policies
でポリシー ARN の一覧を取得し、それを順次渡していく形がよいでしょう。
一括で「ポリシー名」「説明」を CSV 形式で取得する場合のコマンド例は以下です。
aws iam list-policies --scope AWS --output json | jq -r '.Policies[].Arn' \ | xargs -I {} -P 10 aws iam get-policy --policy-arn {} --output json \ | jq -r ".Policy | [.PolicyName,.Description] | @csv" >> policies.csv
xargs コマンドで並列に実行することで処理速度を高めています。-P
の引数で、並列数をコントロール可能です。
while read
でループさせる処理も好きなのですが、今回のように1000を超える対象があると流石に時間がかかり過ぎました。
while read の場合はおよそ30分。(あくまでわたしの端末の場合。)
% date; aws iam list-policies --scope AWS --output json | jq -r '.Policies[].Arn' \ | while read policy; do aws iam get-policy --policy-arn $policy --output json | jq -r '.Policy | [.PolicyName,.Description] | @csv' >> policies.csv done; date 2023年 10月24日 火曜日 19時26分31秒 JST 2023年 10月24日 火曜日 19時56分04秒 JST
xargs での場合はおよそ 3分でした。(同上。)
% date; aws iam list-policies --scope AWS --output json | jq -r '.Policies[].Arn' \ | xargs -I {} -P 10 aws iam get-policy --policy-arn {} --output json \ | jq -r ".Policy | [.PolicyName,.Description] | @csv" >> policies.csv; date 2023年 10月24日 火曜日 19時57分44秒 JST 2023年 10月24日 火曜日 20時00分34秒 JST
aws iam get-policy で各種情報を取得したい
list-policies
で基本的な情報を取得し、get-policy
で「説明」を取得する- 両者の紐付けはスプレッドシートでよしなにやる
……で ずっとやっていたのですが、get-policy
でも各種情報は取得できます。
例えば以下のようにすれば、list-policies
を使う必要はありません。
echo '"ポリシー名","パス","デフォルトバージョン","作成日時","更新日時","アタッチ可否","説明"' > policies.csv ; \ aws iam list-policies --scope AWS --output json | jq -r '.Policies[].Arn' \ | xargs -I {} -P 10 aws iam get-policy --policy-arn {} --output json \ | jq -r ".Policy | [.PolicyName,.Path,.DefaultVersionId,.CreateDate,.UpdateDate,.IsAttachable,.Description] | @csv" >> policies.csv
お好みの方をご利用ください。
終わりに
AWS CLI で AWS 管理ポリシーの一覧を取得する方法のまとめでした。
ポリシーの一覧を取得する時のコマンドを毎回組み立てていたので、この機会にまとめてみました。
aws iam list-policies --scope AWS --query 'Policies[].[PolicyName]' --output text
aws iam list-policies --scope AWS --output json | jq -r '.Policies[].PolicyName'
--max-items
で指定できる値の上限が1000なのに、1000個以上のポリシーも一度のコマンド実行で取得してくれるんだなぁというのが個人的な学びでした。
皆さんが AWS 管理ポリシーを愛でる時の参考になれば幸いです。
以上、 チバユキ (@batchicchi) がお送りしました。
おまけ:V3 がつくポリシーはないのかい?
V3 という響きがかっこいいですからね。調べたくなりますね。
でも流石にないですかね、V2 はまだしもね、だって 3 っていうのはk
ありました!
% aws iam list-policies --scope AWS --query 'Policies[].[PolicyName]' --output text \ | grep -iE V3$ AmazonMachineLearningRoleforRedshiftDataSourceV3
あるんですね。
V4 がつくポリシーはないのかい?
はい。ないです。