Pythonで AWSの組織に属する Account一覧 を取得してみました

# 

## 概要

AWSの組織に所属する Account一覧を取得する Pythonプログラムを作成してみました。

- Account一覧の取得データの戻り値を 以下２パターンで作成
  - リスト型
  - 辞書型

### 実行環境

macOS Monterey 12.3.1 
python 3.8.12


### 実行プログラム

```python:GetUsers.py
import boto3
import pprint
import pandas as pd
from tabulate import tabulate


# 組織の全アカウント情報の取得：リスト型
def get_organization_accounts_list(master_acct):

    # AWSに認証情報プロファイルを利用して親組織へ接続する
    session = boto3.session.Session(profile_name=master_acct)
    organizations = session.client('organizations')

    # 全組織のアカウント情報を取得する
    pagenator = organizations.get_paginator('list_accounts')
    response_iterator = pagenator.paginate()

    # アカウント情報の為のキーと値の定義
    row_key = ["Id", "Name"]
    row_value = []

    # 各アカウントの Account ID と Account Name の取得
    for response in response_iterator:
        for acct in response['Accounts']:

            # 取得するアカウント情報のリスト化
            val = [acct['Id'], acct['Name']]
            row_value.append(val)

    # 取得した全アカウント情報の結合
    row_list = [dict(zip(row_key, item)) for item in row_value]
    print(tabulate(row_list, headers='keys'), "\n")

    # アカウント名で昇順ソートする
    accounts = sorted(row_list, key=lambda x:x['Name'], reverse=False)
    return accounts


# 組織の全アカウント情報の取得：辞書型
def get_organization_accounts_dict(master_acct):

    # AWSに認証情報プロファイルを利用して親組織へ接続する
    session = boto3.session.Session(profile_name=master_acct)
    organizations = session.client('organizations')

    # 全組織のアカウント情報を取得する
    pagenator = organizations.get_paginator('list_accounts')
    response_iterator = pagenator.paginate()

    # アカウント情報用リストの定義
    row_id = []
    row_name = []

    # 各アカウントの Account ID と Account Name の取得
    for response in response_iterator:
        for acct in response['Accounts']:

            # 取得するアカウント情報のリスト化
            row_id.append(acct['Id'])
            row_name.append(acct['Name'])

    # 取得した全アカウント情報を辞書型へ
    accounts = pd.DataFrame({"Id":row_id, "Name":row_name})
    print(tabulate(accounts, headers='keys'), "\n")

    # アカウント名で昇順ソートする
    accounts.sort_values(by='Name',ascending=True, inplace=True)
    return accounts


# メイン
if __name__ == '__main__':
    print("\n組織の全アカウント情報の取得：リスト型\n")
    accounts = get_organization_accounts_list('iapp')
    pprint.pprint(accounts)
    print(type(accounts), "\n")

    print("\n組織の全アカウント情報の取得：辞書型\n")
    accounts = get_organization_accounts_dict('iapp')
    print(accounts)
    print(type(accounts), "\n")
```

### プログラムの実行

```
## それぞれの方法による Account一覧の取得
$ python GetOrganizationAccount.py

組織の全アカウント情報の取得：リスト型

          Id  Name
------------  ------------------
988888888888  tech-sss
677777777777  tech-nnn
655555555555  tech-yaya
900000000000  dede-rrr
688888888888  tech-ccc
722222222222  aws-master

[{'Id': '722222222222', 'Name': 'aws-master'},
 {'Id': '900000000000', 'Name': 'dede-rrr'},
 {'Id': '688888888888', 'Name': 'tech-ccc'},
 {'Id': '677777777777', 'Name': 'tech-nnn'},
 {'Id': '988888888888', 'Name': 'tech-sss'},
 {'Id': '655555555555', 'Name': 'tech-yaya'}]
<class 'list'> 


組織の全アカウント情報の取得：辞書型

              Id  Name
--  ------------  ------------------
 0  988888888888  tech-sss
 1  677777777777  tech-nnn
 2  655555555555  tech-yaya
 3  900000000000  dede-rrr
 4  688888888888  tech-ccc
 5  722222222222  aws-master

              Id                Name
5   722222222222          aws-master
3   900000000000            dede-rrr
4   688888888888            tech-ccc
1   677777777777            tech-nnn
0   988888888888            tech-sss
2   655555555555           tech-yaya
<class 'pandas.core.frame.DataFrame'> 
```

### まとめ

これで AWSの組織内の Account一覧情報を取得し、その戻り値を利用形態に合わせて list型/dict型のどちらかを利用することができるようになりました。

### 参考記事

以下の記事を参考にさせていただきました。感謝申し上げます。
[AWS Organizationsに登録されているアカウントリストをすべて取得する](https://hacknote.jp/archives/58680/)