Systems Manager インベントリをCloudFormationでセットアップする

記事タイトルとURLをコピーする

1.AWS Systems Managerインベントリ とは

AWS Systems Managerには多くの機能がありますが、その中の一つにインベントリがあります。
これはEC2インスタンス、またはオンプレミスのコンピュータの中にどのようなソフトウェアがインストールされているか、何のプロセスが動いているか、どう設定されているか、といったデータを収集してくれるものです。

データ収集できれば、それに対して簡単なグラフ化や検索といったことが可能になります。
本格的に分析したい場合は、Amazon AthenaやAmazon QuickSightなどと連携するといいと思います。

2.マルチアカウント環境のインベントリデータを単一のS3バケットに収集したい

AWSアカウントが複数ある場合は、アカウントごとに別々のS3バケットにデータ収集では管理が煩雑になります。
S3バケットが分散していると、アクセス権限の管理や、検索・集計ツールの指定で苦労することになります。
そこで今回は単一のS3バケットに保存するようにします。

3.AWS Organizationsの対応は?

AWSのマルチアカウント管理サービスであるAWS Organizationsは、Systems Managerをサポートしています。
その機能を有効にすれば全て解決すると期待してしまうのですが、インベントリに関しては実はサポートしていません。 AWS Organizationsは、Systems Managerの中でもExplorer機能のみをサポートしています。

AWS Systems Manager は、AWS リソースの可視性と制御を可能にする一連の機能です。これらの機能の 1 つである Systems Manager Explorer は、AWS リソースに関する情報をレポートするカスタマイズ可能なオペレーションダッシュボードです。組織 と Systems Manager Explorer を使用して、組織内のすべての AWS アカウント間でオペレーションデータを同期できます。詳細については、「Systems Manager Explorer」を参照してください。

AWS Systems Manager および AWS Organizations

4.設定しよう

インベントリのリソースデータの同期の設定を参考にし、CloudFormationで設定しました。

4-1.S3バケットの作成

全てのインベントリデータを保存するためのS3バケットを1つ、任意のアカウントの任意のリージョンで作成します。 accountid=xxxxxxxxxxxxのところは、実際のアカウントIDに書き換えてください。

AWSTemplateFormatVersion: 2010-09-09
Description: Create S3 bucket for Systems Managers Inventory

Parameters:
  InventoryBucket:
    Type: String

Resources:
  S3Bucket:
      Type: "AWS::S3::Bucket"
      Properties:
        BucketName: !Ref InventoryBucket
        PublicAccessBlockConfiguration:
          BlockPublicAcls: True
          BlockPublicPolicy: True
          IgnorePublicAcls: True
          RestrictPublicBuckets: True

  S3Policy:
      Type: "AWS::S3::BucketPolicy"
      Properties:
        Bucket:
          Ref: "S3Bucket"
        PolicyDocument:
          Version: 2012-10-17
          Statement:
            - Sid: "SSMBucketPermissionsCheck"
              Action: ['s3:GetBucketAcl']
              Effect: "Allow"
              Resource:
              - !Join ['', ['arn:aws:s3:::', !Ref 'S3Bucket']]
              Principal:
                Service:
                  - ssm.amazonaws.com
            - Sid: "SSMBucketDelivery"
              Action: ['s3:PutObject']
              Effect: "Allow"
              Resource:
              - !Join ['', ['arn:aws:s3:::', !Ref 'S3Bucket','/*/accountid=xxxxxxxxxxxx/*']]
              - !Join ['', ['arn:aws:s3:::', !Ref 'S3Bucket','/*/accountid=xxxxxxxxxxxx/*']]
              - !Join ['', ['arn:aws:s3:::', !Ref 'S3Bucket','/*/accountid=xxxxxxxxxxxx/*']]
              Principal:
                Service:
                  - ssm.amazonaws.com
              Condition:
                StringEquals:
                  s3:x-amz-acl: "bucket-owner-full-control"

4-2.Systemsマネージャーの設定

2つのリソースを作成する必要があります。

AWS::SSM::Association

インスタンスからリソースデータの収集を有効化するステートマネージャーです。 今回の例では、Targetsでワイルドカード指定しているので、すべてのインスタンスを収集対象としています。

AWS::SSM::ResourceDataSync

収集したデータをS3バケットに集約するための設定です。 下記のCloudFormationで設定できます。 マルチアカウントやマルチリージョンの場合は、CloudFormation StackSetsを使うと便利です。

AWSTemplateFormatVersion: 2010-09-09
Description: Create a Resource Data Sync for Systems Manager Inventory
Parameters:
  SSMResourceDataS3Bucket:
    Type: String
  S3BucketRegion:
    Type: String
    Default: ap-northeast-1
Resources:
  StateManagerForGatherSoftwareInventory:
    Type: AWS::SSM::Association
    Properties:
      AssociationName: Inventory-Association
      Name: AWS-GatherSoftwareInventory
      Targets:
        - Key: InstanceIds
          Values:
            - "*"
  ResourceDataSync:
    Type: 'AWS::SSM::ResourceDataSync'
    Properties:
      SyncName: Resource-Data-Sync
      BucketName: !Ref SSMResourceDataS3Bucket
      BucketRegion: !Ref S3BucketRegion
      SyncFormat: JsonSerDe

5.設定できているか確認

AWS Systems Manager > インベントリ

そのリージョンにEC2インスタンスが存在しない場合は、設定ができていても下記の画面になります。

上手く表示されない場合は、インスタンス側の設定が足りない可能性もあります。 以下3点が設定が問題ないか確認してみましょう。

  • Systems Managerエージェントのインストールがされている
  • IAMロールにAmazonSSMManagedInstanceCoreポリシー相当の権限がある
  • エンドポイントへの通信経路がある

そのリージョンにEC2インスタンスが存在すれば、下記のような画面になります。

Amazon S3 > 作成したバケット

インベントリデータが保存されているのが確認できます。

渡辺 信秀 (記事一覧)