EventBridge ルールから Systems Manager Run Command のログを出力する方法を教えてください

2023.04.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていること

EventBridge にてルールタイプがスケジュールである EventBridge ルールを作成し、そのターゲットとして Systems Manager Run Command を指定してます。
Run Command 出力オプションで、「S3 バケットへの書き込みを有効化する」 のチェックボックスにチェックを行いバケット選択も行っていますが、ログが出力されません。
Systems Manager の Run Command 対象ドキュメントを選択してもログ出力先オプションがないため時間通り EventBridge が実行されてもその実行結果がどうだったかは、マネジメントコンソールのコマンド履歴からのみしか確認できない状況です。

ドキュメント より S3 バケットへの出力や CloudWatch Logs への出力が可能であるかと思いますが、何か良い方法があれば教えてください。

どう対応すればいいの?

Run Command では S3 バケットや CloudWatch Logs へログを出力することが可能です。 ログを出力するためには、Run Command の実行時 (SendCommand API 実行時) に、S3 バケットや CloudWatch Logs へのログ出力に関連するパラメータを指定する必要があります。
一方で、EventBridge ルールでは現時点で(ブログ執筆時) Run Command のログ出力を設定する方法を提供していません。

代替案として、以下の 3 点が考えられます。

  • EventBridge ルールのターゲットとして Run Command の代わりに Lambda を使用する方法
  • EventBridge ルールのターゲットとして Run Command の代わりに Automation を使用する方法
  • EventBridge Scheduler を使用する方法(お勧め)

1.EventBridge ルールのターゲットとして Run Command の代わりに Lambda を使用する方法

EventBridge ルールのターゲットに Lambda を指定し、Lambda 関数のコード内から AWS SDK を用いて SendCommand API を実行する際に、S3 バケットや CloudWatch Logs へのログ出力設定を行う方法があります。
Lambda 関数で実行するコードに関しては、ご自身でご用意いただく必要があるので多少難易度が高くなるかと思いますが、お試しください。

2.EventBridge ルールのターゲットとして Run Command の代わりに Automation を使用する方法

EventBridge ルールのターゲットに Systems Manager Automation を指定する方法です。
なお、Systems Manager Automation ではデフォルトで Run Command を実行するためのドキュメントが現時点で(ブログ執筆時)存在しないことを確認しています。
先に紹介した Lambda を使用する方法と同様 aws:runCommand アクションを使用して Run Command を実行するドキュメントをご自身でご用意いただき、実行する方法となるので、多少難易度が高くなるかと思います。 ドキュメントを参考 に aws:runCommand アクションの入力として、S3 バケットや CloudWatch Logs へのログ出力の設定を行うことが可能ですのでお試しください。

3.EventBridge Scheduler を使用する方法

EventBridge ルールではなく EventBridge Scheduler を使用してスケジュールを作成することで、Run Command の実行 (SendCommend API の実行) に対して、S3 バケットや CloudWatch Logs へのログ出力に関するパラメータを入力として指定することが可能です。
Event Bridge Scheduler のターゲットとして SendCommand API を選択し、その入力としてログ出力に対応するパラメータをご指定ください。
設定方法に関しましては、SendCommand API のドキュメントEventBridge Scheduler の開始方法をご参照ください。
「インスタンスプロファイルの設定」「実行ロールの信頼関係」などのポイントを押さえれば、先に紹介した 2 つよりも比較的簡単に実装可能ですので、お勧めします。
例えば、以下のような設定や入力を指定することで、S3 バケットならびに CloudWatch Logs へのログ出力を設定することが可能ですので、お試しください。

※例:SendCommand API 1

{
   "CloudWatchOutputConfig": { 
      "CloudWatchLogGroupName": "string",
      "CloudWatchOutputEnabled": boolean
   },
   "DocumentName": "string",
   "InstanceIds": [ "string" ],
   "OutputS3BucketName": "string",
   "OutputS3KeyPrefix": "string",
   "OutputS3Region": "string"
}

S3 バケットへの出力の場合

※例:SendCommand API 2

{ 
    "DocumentName": "対象のドキュメント名", 
    "OutputS3BucketName": "作成済みの出力先 S3 バケット名",
    "OutputS3KeyPrefix": "出力したいプレフィックス名",
    "Targets": [
                {
                    "Key": "InstanceIds",
                    "Values": [
                        "対象となるインスタンス ID",
                        "対象となるインスタンス ID"
                    ]
                }
			]
}

※例:Scheduler 実行ロールの信頼関係

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

※例:インスタンスプロファイル
対象 EC2 インスタンスにアタッチ

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::aws-ssm-region/*",  ← リージョン名の記述例: ap-northeast-1 (以下同様)
                "arn:aws:s3:::aws-windows-downloads-region/*",
                "arn:aws:s3:::amazon-ssm-region/*",
                "arn:aws:s3:::amazon-ssm-packages-region/*",
                "arn:aws:s3:::region-birdwatcher-prod/*",
                "arn:aws:s3:::aws-ssm-distributor-file-region/*",
                "arn:aws:s3:::aws-ssm-document-attachments-region/*",
                "arn:aws:s3:::patch-baseline-snapshot-region/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetEncryptionConfiguration"
            ],
            "Resource": [
                "arn:aws:s3:::作成済みの出力先 S3 バケット名/*",
                "arn:aws:s3:::作成済みの出力先 S3 バケット名"
            ]
        }
    ]
}

上記の方法を参考に、ご自身のワークロードに合わせて S3 バケットへの出力や CloudWatch Logs への出力を実装してください。

参考資料