初めに
今回は、SSM Inventoryを使ったマルチアカウント環境でのInventory情報の収集方法について解説します。
SSM Inventoryとは
SSM AgentがインストールされたEC2やオンプレミスのサーバから、そのサーバのメタデータを収集する機能し、一覧表示する機能です。
詳細はblackbeltをご参照ください。
(引用元:20200212 AWS Black Belt Online Seminar AWS Systems Managerの35ページ)
収集できるインベントリはこちら。
カスタムインベントリについては別のブログで書きたいと思います。
(引用元:20200212 AWS Black Belt Online Seminar AWS Systems Managerの36ページ)
なぜ検証したのか?
複数の部署で異なるシステムを管理しているお客様からの依頼により検証しました。
お客様はそれぞれのシステムでどのようなアプリやWindowsサービスが稼働しているのかを管理するためにエクセルをご利用でした。
それはしんどいということで、運用を簡素化するためにSSM Inventoryが有効かどうかを検証することになりました。
お客様環境の構成
部署ごとにAWSアカウントを持ち、セキュリティやログ管理用に管理者アカウントがある マルチアカウント構成 です。
SSM Inventoryの構成
構成はとてもシンプルです。
中央アカウント側で S3バケットを作って、中央と部署のアカウントそれぞれで SSM Inventoryの「リソースデータの同期」を作るだけ。
構築手順
- [管理者アカウント]S3バケットを作成
- [管理者アカウント]SSM Inventoryの「リソースデータの同期」を作成
- [部署アカウント]SSM Inventoryの「リソースデータの同期」を作成
1. [管理者アカウント]S3バケットを作成
S3バケットを作成します。
- バケット名:任意のバケット名
- AWSリージョン:アジアパシフィック(東京)ap-northeast-1
- デフォルトの暗号化:「有効にする」を選択し、SSE-S3とする
上記以外はデフォルトの設定とします。
バケットポリシー の設定も必要です。
設定するべきポリシーについては公式ドキュメントに記載がされています。
実際は上記記載のバケットポリシーの記載のうちConditionの部分を少し変更しなくてはいけません。
ドキュメントでは StringEquals 、ArnLike を使っていますが
複数AWSアカウントのSSMから、S3へインベントリデータをputできるよう、集合演算子 「ForAnyValue」 を利用します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SSMBucketPermissionsCheck",
"Effect": "Allow",
"Principal": {
"Service": "ssm.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::管理者アカウントのS3バケット名"
},
{
"Sid": " SSMBucketDelivery",
"Effect": "Allow",
"Principal": {
"Service": "ssm.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": [
"arn:aws:s3:::管理者アカウントのS3バケット名/*/accountid=部署AアカウントのAWSアカウントID/*",
"arn:aws:s3:::管理者アカウントのS3バケット名/*/accountid=部署BアカウントのAWSアカウントID/*",
"arn:aws:s3:::管理者アカウントのS3バケット名/*/accountid=部署CアカウントのAWSアカウントID/*"
],
"Condition": {
"ForAnyValue:StringEquals": {
"aws:SourceAccount": [
"管理者アカウントのAWSアカウントID",
"部署AアカウントのAWSアカウントID",
"部署BアカウントのAWSアカウントID",
"部署CアカウントのAWSアカウントID"
],
"s3:x-amz-acl": "bucket-owner-full-control"
},
"ForAnyValue:ArnLike": {
"aws:SourceArn": [
"arn:aws:ssm:*:管理者アカウントのAWSアカウントID:resource-data-sync/*",
"arn:aws:ssm:*:部署AアカウントのAWSアカウントID:resource-data-sync/*",
"arn:aws:ssm:*:部署BアカウントのAWSアカウントID:resource-data-sync/*",
"arn:aws:ssm:*:部署CアカウントのAWSアカウントID:resource-data-sync/*"
]
}
}
}
]
}
特定のリソースデータ同期からのみS3への書き込みを許可したい場合は
"ForAnyValue:ArnLike": {
"aws:SourceArn": [
"arn:aws:ssm:${Region}:AWSアカウントID:resource-data-sync/${SyncName}",
"arn:aws:ssm:${Region}:AWSアカウントID:resource-data-sync/${SyncName}"
]
}
と書きます。
2. [管理者アカウント]SSM Inventoryの「リソースデータの同期」を作成
Systems Managerからフリートマネージャーを選択し、
「アカウント管理」から「リソースデータの同期」を選択します。
任意のリソースデータ同期名と、先ほど設定したS3バケット名を指定します。
リージョンはap-northeast-1を指定します。
S3 prefixは指定した場合としなかった場合との挙動の違いは別のブログで書きたいと思います。
3. [部署アカウント]SSM Inventoryの「リソースデータの同期」を作成
[管理者アカウント]側で行った手順と同様に、リソースデータ同期を作成します。
リソースデータ同期名は任意の値で結構です。
S3バケットは手順1で作成したバケット名を指定します。
結果
こちらのように管理者アカウントのS3バケットにインベントリデータが集約されます。
AWSアカウントIDごとにオブジェクトが作成されていることがわかります。
インベントリ情報がjsonファイルでS3に出力されていることがわかります。
管理者アカウントのSSMでも確認しましょう。
Systems Managerの[インベントリ]で[詳細ビュー]を選択します。
上記で作成したリソース同期を選択します。
ぐるぐるするのでチョット待ちます。
なぜこんな簡単な手順のブログを書いたのか
上記の通り、簡単に設定が出来ました。
しかし カスタムインベントリの取得を検証中に凄くトラブりました 。
恐らく何度もリソースデータ同期の作成・削除を繰り返したからだと思いますが、
根本原因として SSM Inventoryの裏の仕組みを知らなかったから トラブルシュートできなかったのだと思います。
よって次回のブログでSSM Inventoryの裏の仕組みを解説します。