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を利用している場合は、「組織のアグリゲーター」を作成できます。承認ステップが不要になり、より楽にアグリゲーターを作成できます。
前提として管理アカウント上で以下を実施する必要があります。
- Config の Organizations 連携を有効にする
- 特定メンバーアカウントへ 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の委任が完了したら、委任先メンバーアカウント上で「組織のアグリゲーター」を作成できるようになります。
委任先メンバーアカウント上で以下を実施していきます。
- アグリゲータ用のIAMロールを作成する
- 組織のアグリゲータを作成する
まずは以下のコマンドでアグリゲーター用の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リソースを棚卸しできるように、整備しておきましょう。
クラスメソッドの川原がお届けしました。
著者
クラスメソッド株式会社はアマゾン ウェブ サービスをはじめ、データ分析、モバイル、IoT、AI/機械学習等の分野で企業向け技術支援を行っています。2023年にはアジア最優秀SIパートナーとして「SI Partner of the Year – APJ」を受賞。現在までの技術支援実績は3,000社以上、AWS環境については25,000アカウント以上となりました。社員による技術情報発信にも注力し、オウンドメディア「DevelopersIO」では4万本以上の記事を公開中です。
クラスメソッド株式会社
RECOMMEND
その他のコラム
相談無料!プロが中立的にアドバイスいたします
クラウド・AWS・Azureでお困りの方はお気軽にご相談ください。