【小ネタ】AWS Organizations の OU階層を出力するCLIエイリアスを作る

2024.03.05

皆さんは普段 AWS Organizations を触っていて、 組織単位(OU)のIDを覚えてますか? 私は覚えていません。

Organizations を使っていると SCPを適用したり CloudFormation StackSet を展開したりと、 何かと「OUに対する操作」が行われます。 その操作をCLIやSDKで実行するとなると、 OU IDをパラメータに指定する必要があります。

その都度 OU ID をマネコンから見に行くのは面倒ですよね。

そこで今回は OU階層(OU ID含む) を出力するCLIエイリアス を作ってみます。

作成したCLIエイリアス

以下設定を .aws/cli/alias に付与することで、 aws org-ou-tree を使えるようになります。

[toplevel]

org-ou-tree =
  !f () {
    function _outree(){
      local parent_name="$1"
      local parent_id="$2"
      local prefix="$3"
      ### インプット内容を出力
      echo "${prefix} ${parent_name}: ${parent_id}"
      ### 子OUに対して _outree を実行
      local child_prefix="    ${prefix}"
      aws organizations list-organizational-units-for-parent --output text \
        --parent-id "${parent_id}" --query "OrganizationalUnits[].[Name,Id]" \
      | while read child_name child_id; do
          _outree "${child_name}" "${child_id}" "${child_prefix}"
        done
    }

    root_id=$(aws organizations list-roots --query "Roots[0].Id" --output text)
    _outree "root" "${root_id}" "-"
  };f

スクリプト解説

使っているコマンドは以下 2つです。

_outree という再帰関数を使っています。以下処理を実行します。

  1. インプット内容(OU ID や OU名)を出力する
  2. OU(もしくはRoot)の子OUを取得する
  3. 子OUが無い場合は、処理を終了する
  4. 子OUがある場合は、それぞれの子OUに対して _outree を実行する

出力例

以下出力例です。

aws org-ou-tree
# - root: r-abcd
#     - Security: ou-abcd-9pexample
#     - Infrastructure: ou-abcd-1vexample
#         - SDLC: ou-abcd-ebexample
#         - PRD: ou-abcd-7mexample
#     - Workloads: ou-abcd-v9example
#         - SDLC: ou-abcd-ebexample
#         - PRD: ou-abcd-7mexample

OU階層と OU ID 情報を取得できていますね。 これでわざわざマネコンを確認することも不要になりました。

おわりに

以上、チョット便利になるCLIエイリアスでした。

参考