Amazon Web Services ブログ

AWS Systems Manager Automation を使用して複数のアカウントとリージョンにある AWS リソースを管理する

AWS Systems Manager Automation で AWS リソースの一般的な管理およびメンテナンスタスクが容易になります。Systems Manager Automation を使用すると、ご自分で記述したりコミュニティで公開されたドキュメントを使用したりできる AWS Systems Manager ドキュメント(SSM ドキュメント)の形式で前もって定義済みのタスクやワークフローを実行できます。SSM ドキュメントは、Systems Manager が AWS リソースに対して実行するアクションを定義しますこれらのドキュメントは Systems Manager メンテナンスウィンドウを使ってスケジューリングが可能です。さらに、Amazon CloudWatch Events を使用して、AWS リソースへの変更に基づいてドキュメントをトリガーしたり、AWS マネジメントコンソール、AWS CLI、または AWS SDK を通して直接実行したりできます。ドキュメントの各ステップでの実行を追跡したり、ステップの承認を要求したりできます。また、変更を段階的にロールアウトして、エラーが発生した際に自動停止することもできます。

AWS のお客様の多くは複数の AWS アカウントを使用しています。たいていは、AWS Organizations を使用してアカウントを階層に配置し、それらを組織単位(OU)にグループ化しています。OU は、一括請求 (コンソリデーティッドビリング)、ワークロードの分離、管理の分離など、さまざまな目的に使用できます。お客様は、アプリケーションごとに開発、テスト、ステージング、および本番用に個別のアカウントを組織内で作成することがよくあります。

すべてのアカウントに共通する反復的なタスクがあっても、前述のマルチアカウント構造ではそれらを個別に管理することは困難な場合があります。お客様から、次のような一般的なタスクを 1 つの中央/管理アカウントから実行したいとの要望がありました。

  • パッチ管理
  • ゴールデン Amazon マシンイメージ (AMI) の作成
  • SSM エージェントを使用したソフトウェアエージェントの更新
  • Amazon EC2 インスタンスの開始/停止/再起動
  • Amazon S3 バケットの暗号化

マルチアカウントとマルチリージョンのオートメーションのご紹介

こうしたお客様の課題に対処するため、最近 AWS では Systems Manager Automation のマルチアカウントおよびリージョンのサポートを開始しました。この機能を使用することで、マスター AWS アカウントで数回クリックするだけで、複数の AWS アカウントやリージョンで独自のオートメーションドキュメントを実行できるようになります。これは AWS が管理するオートメーションドキュメントでも機能します。

常に、クロスアカウントベースで機能します。管理者またはマスターアカウントが 1 つまたは複数のオートメーションドキュメントを所有し、1 つまたは複数のターゲットアカウントへのデプロイを制御します。管理者アカウントには想定される AWS Identity and Access Management (IAM) ロールが含まれており、またターゲットアカウントは信頼を管理者アカウントに委任する必要があります。

マルチアカウントオートメーションの使用

すべてのアカウントとリージョンで AWS CloudTrail を有効にし、マスター/中央 AWS アカウントの中央 Amazon S3 バケットに CloudTrail ログを保存するユースケースを考えてみましょう。一元化した CloudTrail のログ記録は、コンプライアンスや監査を監督する中央 IT 部門を持つ組織にとって重要な要件です。次の図は、このアーキテクチャを表しています。

 

 

AWS が提供するドキュメント AWS-EnableCloudTrail を使用するか、次のようなカスタムオートメーションドキュメントを作成して、ターゲットアカウントにマルチリージョン証跡を作成できます。このドキュメントは指定されたすべてのターゲットアカウントとリージョンに「Multi-Account-Trail」という名前の証跡を作成し、選択した中央の S3 バケットにそれらのログをプッシュします。

 

---
description: "Automation Document for Central CloudTrail logging YAML Template"
schemaVersion: "0.3"
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
  S3Bucket:
    type: "String"
    description: "(Required) Central Amazon S3 bucket for storing copies of all AWS CloudTrail from multiple accounts in all Regions"
  S3KeyPrefix:
    type: "String"
    description: "(Optional) Central Bucket Key prefix"
    default: ""
  TrailName:
    type: "String"
    description: "(Optional) Name to be assigned to this trail"
    default: "Multi-Account-Trail"

  MultiRegionTrail:
    type: "Boolean"
    description: 
    default: True
  AutomationAssumeRole:
    type: "String"
    description: "(Optional) The ARN of the role that allows Automation to perform the actions on your behalf."
    default: ""

mainSteps:

- name: CreateTrail
  action: aws:executeAwsApi
  inputs:
    Service: cloudtrail
    Api: CreateTrail
    Name: "{{TrailName}}"
    IsMultiRegionTrail: True
    S3BucketName: "{{ S3Bucket }}"
    S3KeyPrefix: "{{ S3KeyPrefix }}"

- name: StartLogging
  action: aws:executeAwsApi
  inputs:
    Service: cloudtrail
    Api: StartLogging
    Name: "{{TrailName}}"

 

このドキュメントを AWS アカウントに「Centralized-cloudtrail」として作成しました。

 

 

S3 バケットには、次のようなバケットポリシーが必要です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSCloudTrailAclCheck20150319",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudtrail.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::{BUCKETNAME}"
        },
        {
            "Sid": "AWSCloudTrailWrite20150319",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudtrail.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::{BUCKETNAME}/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}


 

クロスアカウントオートメーション機能を使用するには、最初にマスターアカウントとターゲットアカウントの両方に適切なロールを設定する必要があります。マスターアカウントで、管理者ロール AWS-SystemsManager-AutomationAdministrationRole をプロビジョニングし、すべてのターゲットアカウントで実行ロール AWS-SystemsManager-AutomationExecutionRole をプロビジョニングします。これらのロールを作成するためのステップバイステップの説明は、こちらにあります。

ロールを作成したら、クロスアカウントオートメーション機能を使ってこのブログで提供しているドキュメントを実行し、各ターゲットアカウントで AWS CloudTrail を有効にして、ログをすべてのターゲットアカウントから S3 バケットにプッシュし、一元的なログの収集と分析を行います。

次のスナップショットは、前で作成した Centralized-cloudtrail ドキュメントを実行する方法を示しています。マルチアカウントとマルチリージョンの実行オプションを選択し、ターゲットアカウントを入力して、ターゲットリージョンを選択します。(選択した名前がターゲットアカウントオートメーションにすでに存在する場合)一意の証跡名を選択し、S3 バケットの名前を入力します。ここで、ターゲットアカウントから CloudTrail ログを受け取ります。オプションで、ログを保存する S3 バケットにプレフィックスを入力することもできます。Systems Manager Automation はデフォルトで AWS-SystemsManager-AutomationAdministrationRole を使用して、クロスアカウントオートメーションを実行します。ただし、必要に応じて別のロールをオプションで選択することもできます。

 

 

オートメーションの実行後、成功したことを確認できます。

ターゲットアカウントで Multi-Account-Trail が正常に作成されたことがわかります。

 

 

同様に、次の CLI コマンドを使用して、このオートメーションを実行することもできます。

aws ssm start-automation-execution —document-name Centralized-cloudtrail —parameters AutomationAssumeRole=arn:aws:iam::<Master_ACCOUNTID>:role/AWS-SystemsManager-AutomationAdministrationRole,S3Bucket=<Central_S3_Bucket_Name> —target-locations Accounts=<Target_AccountIDs>,Regions=us-west-2,ExecutionRoleName=AWS-SystemsManager-AutomationExecutionRole —target-parameter-name TrailName —targets Key=ParameterValues,Values=Multi-Account-Trail Values —region us-west-2

追加のユースケース

この機能には、いくつかの異なるアカウントで、本番ではない EC2 インスタンスを停止/開始してコストを節約するという別の用途もあります。このようなインスタンスすべてに Name=Non-Prod のタグを付け、オートメーションドキュメント AWS-StartEC2Instance を実行し、このタグを使ってすべてのターゲットアカウントで EC2 インスタンスを同時に開始できます。そのため、AWS-StopEC2Instance を使用して、後でこれらを停止できます。皆さんの中には、いくつかの異なる AWS アカウントとリージョンで、数百または数千個の規模でインスタンスを運用している方も多いでしょう。そのような場合、この機能で時間を節約し、AWS リソースの管理を一元化して大きく簡素化できます。

これらのオペレーションを実行するための AWS CLI コマンドは、次のとおりです。

aws ssm start-automation-execution --document-name AWS-StartEC2Instance --parameters AutomationAssumeRole=arn:aws:iam::<Master_ACCOUNTID>:role/AWS-SystemsManager-AutomationAdministrationRole --target-locations Accounts=<Target_AccountIDs>,Regions=us-west-2,ExecutionRoleName=AWS-SystemsManager-AutomationExecutionRole --target-parameter-name InstanceId --targets Key=tag:Name,Values=Non-Prod --region us-west-2
aws ssm start-automation-execution --document-name AWS-StopEC2Instance --parameters AutomationAssumeRole=arn:aws:iam::<Master_ACCOUNTID>:role/AWS-SystemsManager-AutomationAdministrationRole --target-locations Accounts=<Target_AccountIDs>,Regions=us-west-2,ExecutionRoleName=AWS-SystemsManager-AutomationExecutionRole --target-parameter-name InstanceId --targets Key=tag:Name,Values=Non-Prod --region us-west-2

まとめ

このブログ投稿では、マルチアカウントおよびマルチリージョンオートメーション機能を使用して、1 つの S3 バケットにある複数の AWS アカウントから CloudTrail ログの収集を有効にする方法を説明しました。また、アイドリング中にいくつかのアカウントで本番ではない EC2 インスタンスを停止および開始して、コストを節約する例もご紹介しました。

 

著者について

Sohaib Tahir は、州および地方自治体公共セクターチームのソリューションアーキテクトで、ネットワーキングとオートメーションに取り組んでいます。AWS Systems Manager、AWS Lambda、CloudFormation などのオートメーションサービスを使ってアーキテクチャを構築し、お客様を支援することに情熱を傾けています。