COLUMN

AWS Configアグリゲーターを使ってアカウント横断でリソースを棚卸ししよう

川原です。普段はクラスメソッド株式会社でソリューションアーキテクトとして活動しています。今回は縁あってこちらのコラムに寄稿することになりました。

クラウド利用における「アジリティとガバナンスの両立」は永遠の課題です。

特にAWSにおいて、ガバナンスを効かせるためによく取られる手法として「マルチアカウント管理」があります。これは特定の単位や基準でAWSアカウントを分けて運用する戦略のことを言います。

マルチアカウント管理においては「識別」がとても重要です。各アカウント上にどのような資産(AWSリソース)があるのか、管理者は把握しておく必要があります。

今回は、この「AWSリソースの識別」で役立つツールとして AWS Config 、およびその1機能である Configアグリゲーター を紹介していきます。

1.AWS Config, Configアグリゲーターについて

1-1.そもそも AWS Config とは

AWS Config は 主に以下 2つの機能を持つサービスです。

  • Record: 設定レコーダーによるリソースの継続的な記録
  • Evaluate: Configルールによる構成情報の評価

根幹の機能が「設定レコーダー(Configuration Recorder)」です。

AWSリソースに関する「今どのような設定か」や「いつ、どのような更新がされたか」、「他のリソースとどう関連するか」を継続的に記録してくれます。

そして、その構成情報が「理想的な状態かどうか」を評価してくれるものが Configルールになります。評価の例としては「セキュリティグループでSSH全開放になっていないか」や「S3バケットがパブリック公開されていないか」などがあります。

クラウド(AWS)を使うメリットとして、良く挙げられるフレーズとして

「アジリティとガバナンスの両立」がありますよね。AWS Config は ガバナンスを引き上げるために必要不可欠なサービス となります。

AWS Configの無い世界を考えてみます。AWSのアジリティにより迅速にリソースを展開できるのはメリットですが、沢山のリソースが山積みになってきます。どのリソースがどんな設定なのか、追えなくなってきますよね。そのままにしていると、潜在的なセキュリティリスクのある設定を見逃すかもしれません。

そういった事態にならないために、AWS Configは役立ちます。

1-2.Config アグリゲーターとは

Configアグリゲーターは複数アカウント・複数リージョンのConfigデータ(リソース構成情報や Configルールの評価結果)を集約してくれる、とても便利な機能です。特にマルチアカウント管理において役に立ちます。

Configアグリゲーターをざっくりと理解するにあたって、ソースアカウントとアグリゲーターアカウントは把握しておきたいです。

アグリゲーターアカウントは、そのままで「アグリゲーターを作成するアカウント(リージョン)」になります。ここに複数アカウント(複数リージョン)のConfigデータが集約されます。"集約先" になるアカウントです。

ソースアカウントが "集約元" になるAWSアカウント群になります。「個々のアカウントIDを明示的に指定する方法」と「AWS Organizations の組織全体を指定する方法」の2つがあります。

ちなみに、Configアグリゲーター自体には料金はかかりません。それぞれのアカウントで使っているConfig記録やConfigルールにのみ料金がかかります。

2.Configアグリゲーターのセットアップ手順

それではConfigアグリゲーターをセットアップしていきましょう。今回はAWS CLI を使ってセットアップします。

なお、前提条件として集約元、集約先のAWSアカウントにて AWS Configの基本的なセットアップ は完了しているものとします。この部分のセットアップについては以下を参照ください。

2-1.AWS Organizations を利用していない場合

まずは、AWS Organizationsを利用していない場合の手順を解説します。

最初にアグリゲーターアカウントにて、アグリゲーターを作成します。AccountIds 部分にソースアカウントをカンマ区切りで記載していきます。

aws configservice put-configuration-aggregator \
--output yaml --region ap-northeast-1 \
--configuration-aggregator-name test-aggregator \
--account-aggregation-sources \
AccountIds=111111111111,222222222222,\
AwsRegions=ap-northeast-1

次に各ソースアカウントにて、「アグリゲータアカウントの承認」を実行します。具体的には以下のようなコマンドを実行してください。authorized-account-id 部分にアグリゲータアカウントIDを記載します。

 aws configservice put-aggregation-authorization \
 --output yaml --region ap-northeast-1 \
 --authorized-account-id ${アグリゲータアカウントID} \
 --authorized-aws-region ap-northeast-1

上記コマンドをソースアカウントの分だけ実行します。

その後、AWS Configコンソールの [AWS Config > アグリゲーター > (作成したアグリゲーター)] にてソースアカウントのステータスが OK になっていれば完了です。

2-2.AWS Organizations を利用している場合

AWS Organizationsを利用している場合は、「組織のアグリゲーター」を作成できます。承認ステップが不要になり、より楽にアグリゲーターを作成できます。

前提として管理アカウント上で以下を実施する必要があります。

  1. Config の Organizations 連携を有効にする
  2. 特定メンバーアカウントへ Confg を委任する

Config の Organizations 連携を有効にするには、以下のコマンドを実行します。config および config-multiaccountsetup の機能を有効化します。

aws organizations enable-aws-service-access \
  --service-principal=config.amazonaws.com
 
aws organizations enable-aws-service-access \
  --service-principal=config-multiaccountsetup.amazonaws.com

次に特定のメンバーアカウントに Configを委任させます。マルチアカウント管理では統制用のAWSアカウントを最低でも1つ運用することがベストプラクティスです。

MemberAccountID=${委任先メンバーアカウントのアカウントID}
 
# config.amazonaws.com 分
aws organizations register-delegated-administrator \
  --service-principal=config.amazonaws.com \
  --account-id "${MemberAccountID}"
 
# config-multiaccountsetup.amazonaws.com 分
aws organizations register-delegated-administrator \
  --service-principal=config-multiaccountsetup.amazonaws.com \
  --account-id "${MemberAccountID}"

Configの委任が完了したら、委任先メンバーアカウント上で「組織のアグリゲーター」を作成できるようになります。

委任先メンバーアカウント上で以下を実施していきます。

  1. アグリゲータ用のIAMロールを作成する
  2. 組織のアグリゲータを作成する

まずは以下のコマンドでアグリゲーター用のIAMロール(OrgConfigRoleとします)を作成します。

# OrgConfigRole の作成
assume_role=$(cat <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "config.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
)
 
aws iam create-role --output yaml --role-name OrgConfigRole2 \
  --assume-role-policy-document "${assume_role}" \
  --description "Role for organizational AWS Config aggregator"
 
# OrgConfigRole へ必要な権限をアタッチ
policy="arn:aws:iam::aws:policy/service-role/AWSConfigRoleForOrganizations"
aws iam attach-role-policy \
  --role-name OrgConfigRole \
  --policy-arn "${policy}"

次に Configアグリゲーターを作成します。以下のコマンドを実行してください。

# OrgConfigRole の ARNを取得する
org_config_role_arn=$(aws iam get-role --output text \
  --role-name OrgConfigRole --query "Role.Arn")
 
# Configアグリゲータを作成する
source_config=$(cat <<EOF
{
  "RoleArn": "${org_config_role_arn}",
  "AwsRegions": [
    "ap-northeast-1"
  ]
}
EOF
)
aws configservice put-configuration-aggregator --output yaml \
  --configuration-aggregator-name test-aggregator-org \
  --organization-aggregation-source "${source_config}"

マネジメントコンソール上の [AWS Config > アグリゲーター] にて、ソースタイプが 「組織」 になっているアグリゲーターがあればOKです。

3.Configアグリゲーターの活用方法

マネジメントコンソールのメニューにて、アグリゲーターが関わる機能は以下の部分です。

メニュー できること
アグリゲーター 作成しているアグリゲーターの一覧を確認できます
アグリゲーター > コンプライアンスダッシュボード コンプライアンス状況(=Configルール結果)のサマリーを確認できます
アグリゲーター > 適合パック 展開されているConfig 適合パックを検索および削除できます
アグリゲーター > ルール 展開されているConfigルール一覧を確認できます
★アグリゲーター > インベントリダッシュボード 展開されているリソース状況のサマリーを確認できます
★アグリゲーター > リソース 展開されているリソース一覧を確認できます
アグリゲーター > 認証 アグリゲーターアカウントへの承認設定を管理します
★高度なクエリ リソース構成情報をクエリできます

特に★を付けたメニュー、「リソース」、「高度なクエリ」、「インベントリダッシュボード」はリソース棚卸しに役立つので紹介していきます。

3-1.リソース

[アグリゲーター >リソース] ではアグリゲーターに集約されている Config構成情報 を検索できます。アグリゲーターを選択してから、検索欄にフィルタを入力していきます。

フィルタでは4項目を指定できます。「AWSリソースタイプ」と「アカウント」あたりは良く使う項目です。

例えば S3バケット一覧を棚卸ししてみます。フィルタ条件に「AWSリソースタイプ」を選択します。フィルタするリソースの一覧が表示されますので、 “AWS::S3::Bucket”を選択しましょう。(“s3”などと打つとリソースを絞れます)

アカウント横断で S3バケットの一覧が表示されました。

「リソース識別子」の各リンクから、構成情報の詳細を確認できます。

これはTipsですが、右側にある歯車アイコンから1ページに表示するリソース数を変えられます(10 or 20 or 50)。量が多い場合は最大の 50 にすることで、より楽に一覧を見れます。

3-2.高度なクエリ

「高度なクエリ」機能を使うことで、先程の「リソース」機能よりもより柔軟な情報取得が実現できます。高度なクエリを利用するには [AWS Config > 高度なクエリ] から[新しいクエリ] を選択します。

例として EC2インスタンス一覧を取得してみます。まずは「クエリスコープ」部分を作成したアグリゲーターにします。

「新しいクエリ」範囲に以下のようなSQLを記載して、[実行]を選択しましょう。「出力」にクエリ結果が表示されるはずです。

SELECT
  accountId,
  awsRegion,
  resourceId,
  configuration.instanceType,
  tags.tag
WHERE
  resourceType = 'AWS::EC2::Instance'

結果は [名前をつけてエクスポート] 可能です。JSON もしくは CSV で保存できます。関係者に棚卸し情報を連携する際に、とても便利です。

また、実行したクエリは [クエリの保存] を選択することで保存できます。何度も繰り返し使うクエリは保存して、手早く実行できるようにしましょう。

AWS側で用意されたクエリもたくさんあります。クエリを作成する際の参考としても役立ちます。

ちなみに最近のアップデートで、なおかつ今時点(2024/04)ではプレビューですが、生成AIを使ってクエリを出力できる機能があります。バージニア北部リージョン(us-east-1) にて試せるので、ぜひ触ってみてください。

3-3.インベントリダッシュボード

インベントリダッシュボードではリソースのサマリを確認できます。

現時点(2024/04) で確認できる項目は以下の7つです。こちら側で新規項目を追加することはできません。

  • 上位10件のリソースタイプ(リソース数別)
  • リソース数(リージョン別)
  • 上位10件のアカウント(リソース数別)
  • リソース数(Amazon EC2サービスリソースタイプ別)
  • 上位10件の使用されているEC2インスタンスタイプ
  • 実行中のEC2インスタンス数と停止中のEC2インスタンス数(タイプ別)
  • EBSボリューム数(ボリュームタイプとサイズ別)

それぞれの項目で実行しているクエリを見ることができます。”View and analyze in query editor” を押下することで高度なクエリへのページへ遷移します。

また、いくつかの項目でフィルタも可能です。特定アカウント、特定タグで更に深堀りできます。

4.まとめ

本記事では AWS Config の便利な機能である Configアグリゲーターについて説明しました。

ConfigアグリゲーターはAWSリソースの識別でとても役に立ちます。特にマルチアカウントで運用しているような環境では、ほぼ必須のツールと言えるでしょう。高度なクエリも活用して、必要なときにサクッとAWSリソースを棚卸しできるように、整備しておきましょう。

クラスメソッドの川原がお届けしました。

著者

クラスメソッド株式会社

AWS事業本部 コンサルティング部

川原 征大

https://dev.classmethod.jp/author/kawahara-masahiro/

クラスメソッド株式会社はアマゾン ウェブ サービスをはじめ、データ分析、モバイル、IoT、AI/機械学習等の分野で企業向け技術支援を行っています。2023年にはアジア最優秀SIパートナーとして「SI Partner of the Year – APJ」を受賞。現在までの技術支援実績は3,000社以上、AWS環境については25,000アカウント以上となりました。社員による技術情報発信にも注力し、オウンドメディア「DevelopersIO」では4万本以上の記事を公開中です。

クラスメソッド株式会社

https://classmethod.jp/

技術ブログ「DevelopersIO」

ページ上部へ戻る

相談無料!プロが中立的にアドバイスいたします

クラウド・AWS・Azureでお困りの方はお気軽にご相談ください。