AWS 管理ポリシーの一覧や各種情報を AWS CLI で一括取得してニッコリする

AWS管理ポリシーの一覧をお手軽に取得する方法をまとめました。あなたの AWS 管理ポリシーライフが少しでも充実したものとなりますように。

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

突然ですがわたしは 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 管理ポリシーに限定して取得できます。ここではポリシー名のみ取得したいので、--queryjqなどのクライアントサイトのフィルタリングを行います。

--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_Managed_Policy_csv

こういうの眺めている時が一番楽しいですよね。

AWS 管理ポリシーにおける IsAttachable とは?

パラメータIsAttachableの意味がスッと分からなかった方もいるかもしれません。これは「アタッチ可能か」を表すもので、ほとんどのポリシーではtrueになっています。

これがfalseになるのは非推奨(Deprecated)となった AWS 管理ポリシーです。

非推奨となった AWS 管理ポリシーは以下の特徴を持ちます。

  • IAM リソース(ユーザー/グループ/ロール)にアタッチ済みであれば継続して使用可能
  • 新たに IAM リソースにアタッチできない
  • ひとつ以上の IAM リソースにアタッチされていない場合、当該ポリシーは一覧に現れない

冒頭で述べたCloudWatchFullAccessは、いずれこの非推奨になります。なので、現時点で何かの IAM リソースにアタッチし、非推奨となった後にaws iam list policiesを実行すれば、IsAttachablefalseとして結果に現れます。

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 がつくポリシーはないのかい?

はい。ないです。

参考

関連