こんにちは。秋田県出身の丹(たん)です。
組織アカウント管理をしていると、AWS Organizations 組織内のAWSアカウント数を確認したくなることがあります。
更に、組織単位(OU)*1でAWSアカウント数を確認したくなることがたまにあります。
CloudWatchダッシュボードを作成して、自動的にAWSアカウント数を表示して確認できるようにするというスマートな方法もあります。
一方で、CloudWatchダッシュボードでAWSアカウント数を表示するには、Amazon EventBridge/AWS Lambda/Amazon CloudWatch の実装が必要になるため、今回は AWS Organizations と AWS CloudShell の権限さえあれば手動でアカウント数を確認できる方法を書いてみたいと思います。
私自身がAWSアカウント数をすぐに確認したいことがあるのですが、AWS CLIコマンドを忘れてしまうため、備忘も兼ねて本記事を書いています。
(実行環境)AWS CloudShell
今回は、実行環境として AWS CloudShell を利用します。
AWS CloudShellは、ブラウザベースで認証しているIAMの権限を使ったシェルであり、AWSマネジメントコンソールから直接起動できます。
コマンドラインツールのダウンロードやインストールも不要のまま、Bashなどのシェルを利用してコマンドを実行することができます。
AWS CloudShell とは? - AWS CloudShell
※CloudShellを操作する権限と必要に応じたAPI実行に必要な権限を付与したIAMが必要となります
(実行コマンド)AWS Organizations AWS CLI
AWS Organizations 上のAWSアカウント一覧やOU情報を取得するために、AWS Organizations のAWS CLIコマンドを実行します。
AWS Organizations で組織を作成していることが前提となります。
AWS Organizations AWS CLIコマンドは、AWS Organizationsの機能が利用できる(親アカウント)管理アカウントから実行する必要があります。
organizations — AWS CLI 1.27.154 Command Reference
では早速、組織内のAWSアカウント数を確認してみましょう。
組織内のAWSアカウント数を確認する
組織内のAWSアカウント数を確認するだけであれば、以下のAWS CLIコマンドで確認することができます。
$ aws organizations list-accounts --query Accounts[*].[Name,Id] --output text | wc -l <出力> 10
余談ですが、wc -l
を除けば、カウントせずにAWSアカウント名とアカウントIDを出力することができます。
$ aws organizations list-accounts --query Accounts[*].[Name,Id] --output text <出力> AccountA XXXXXXXXXXXX AccountB XXXXXXXXXXXX ... AccountN XXXXXXXXXXXX
また、json形式やtable形式でも出力できます。
AWS CLI 出力フォーマットの設定 - AWS Command Line Interface
$ aws organizations list-accounts --query Accounts[*].[Name,Id] --output json <出力> [ [ "AccountA", "XXXXXXXXXXXX" ], [ "AccountB", "XXXXXXXXXXXX" ], ... [ "AccountN", "XXXXXXXXXXXX" ] ]
組織内のAWSアカウント数を確認することができました。次に組織単位(OU)毎のAWSアカウント数を確認してみましょう。
組織単位(OU)内のAWSアカウント数を確認する
OU毎のAWSアカウント数を確認する前に、OUを指定してOU内のAWSアカウント数を確認します。
xargs
コマンドを使って、第1コマンドの出力をパイプ(|)で第2コマンドの入力値として利用しています。
最初の第1コマンドで指定する組織単位ID(OU ID)を変えれば対象OUを変更することができます。
$ echo ou-rrrr-xxxxxxxx | xargs aws organizations list-accounts-for-parent --query Accounts[*].[Name,Id] --output text --parent-id | wc -l <出力> 2
組織内の組織単位(OU)毎にAWSアカウント数を確認する
ルート配下のOU IDを表示する
組織内のOU毎にAWSアカウント数を確認する前に、ルート配下のOU IDを表示するコマンドを確認してみます。
$ echo r-rrrr | xargs aws organizations list-organizational-units-for-parent --query OrganizationalUnits[*].[Id] --output text --parent-id <出力> ou-rrrr-ouaaaaaa ou-rrrr-oubbbbbb ... ou-rrrr-ounnnnnn
このOU IDを出力する結果を利用して、OU ID毎にループさせながら、AWSアカウント数を確認してみます。
(指定OUから第二階層)ルート配下のOU毎にAWSアカウント数を確認する
【出力結果】OU ID × AWSアカウント数
$ for root_under_ou in `echo r-rrrr | xargs aws organizations list-organizational-units-for-parent --query OrganizationalUnits[*].[Id] --output text --parent-id`; do echo $root_under_ou; echo $root_under_ou | xargs aws organizations list-accounts-for-parent --query Accounts[*].[Name,Id] --output text --parent-id | wc -l; done <出力> ou-rrrr-ouaaaaaa 1 ou-rrrr-oubbbbbb 2 ... ou-rrr-ounnnnnn 0
ここまでは自力でコマンドを考えてきましたが、なんだかスマートではない気がします。
ということで、ChatGPTにAWS CLIを短縮してもらいました。
出力結果は同じになります!
$ aws organizations list-organizational-units-for-parent --query 'OrganizationalUnits[*].[Id]' --output text --parent-id r-rrrr | xargs -I{} sh -c 'echo {}; aws organizations list-accounts-for-parent --query "Accounts[*].[Name,Id]" --output text --parent-id {} | wc -l' <出力> ou-rrrr-ouaaaaaa 1 ou-rrrr-oubbbbbb 2 ... ou-rrr-ounnnnnn 0
xargs
以降の解説です。
xargs -I{} sh -c 'echo {}; aws organizations list-accounts-for-parent --query "Accounts[*].[Name,Id]" --output text --parent-id {} | wc -l'
の部分の説明をします。
まず、xargs
コマンドは、前のコマンド(aws organizations list-organizational-units-for-parent
)の出力を取り込んで実行するためのコマンドです。
-I{}
は、パイプで渡される引数を{}
に置換するためのオプションです。
sh -c
は、新しいシェルを起動してコマンドを実行するためのオプションです。
'echo {}'
は、xargs
コマンドが前のコマンドの出力を{}
に置換した後、その値を表示するためのコマンドです。つまり、ルートの組織単位のIDを表示します。
aws organizations list-accounts-for-parent --query "Accounts[*].[Name,Id]" --output text --parent-id {}
は、指定されたルート組織単位の下にあるアカウントの情報を取得するためのコマンドです。
どの組織単位にどれだけのアカウントがあるのかが分かります。
OU IDだけだと、どこのOUか分かりません。OU名も表示してみます。
(指定OUから第二階層+OU名も表示)ルート配下のOU毎にAWSアカウント数を確認する
【出力結果】:OU ID × OU名 × AWSアカウント数
$ aws organizations list-organizational-units-for-parent --query 'OrganizationalUnits[*].[Id]' --output text --parent-id r-rrrr | xargs -I{} sh -c 'echo {}; aws organizations describe-organizational-unit --query 'OrganizationalUnit.[Name]' --output text --organizational-unit-id {}; aws organizations list-accounts-for-parent --query "Accounts[*].[Name,Id]" --output text --parent-id {} | wc -l' <出力> ou-rrrr-ouaaaaaa OUAAAAAA 1 ou-rrrr-oubbbbbb OUBBBBBB 2 ... ou-rrr-ounnnnnn OUNNNNNN 0
無事に「組織内の組織単位毎にAWSアカウント数を確認する」という目的を達成しました。
CloudShellを利用して、気軽にAWSアカウント数をカウントすることができます。
さいごに
今回、使う機会が無い人の方が多いかもしれない組織内のAWSアカウント数を確認する方法について書いてみました。
一方で、最近のAWS認定試験のアップデートでも分かるように、AWS Organizations の利用やマルチアカウント管理については、押さえておく必要のある知識になってきています。
それだけ、組織アカウント管理やマルチアカウント管理の需要があり、その考え方が浸透しつつあると考えています。
数年前には、海外のre:Inforceやre:Invent等に参加した一部のAWS有識者が組織アカウント管理やマルチアカウント管理という考え方があるのか!と気づきを得て、持ち帰ってきた知見が、今では一般的になりつつあるのではないでしょうか。
今後もマルチアカウントを管理する上での考え方やちょっとした知見を中心に書いていきたいと思います。
*1:AWS Organizations で分割することができる組織の単位を組織単位「Organizational Unit(OU)」と呼びます