CloudWatch Events から実行された SSM RunCommand や Lambda のログについて

# ０．はじめに

CloudWatch Events から スケジュールドリブンで、SSM RunCommand や Lambda を実行してみた際に、それぞれのログがどう出力されるのかよくわからずに困ったことがあったので、

サポートに確認したところ、ご回答を頂いたのでシェア。

# １．CloudWatch Events

まず、原則として、

<font color="red"><b>CloudWatch Events 自体のログは、どこにも出力されない。</b></font>

とのことです。

CloudWatch Logs にも、CloudTrail にも出力されないみたいです。

# ２．SSM RunCommand

CloudWatch Events → SSM RunCommand という流れで実行しました。

SSM RunCommand のログは、以下の方法で確認出来るみたいです。

* AWS Systems Manager の RunCommand コンソール
* AWS CLI
* AWS CloudTrail の イベント履歴

それぞれ、ちょっとみてみます。

### ２−１．AWS Systems Manager の RunCommand コンソール

AWS Systems Manager の RunCommand コンソールへ移動すると、
実行されたログが一覧で出力されます。
<font color="red">ただ、レコードが時系列でソートされている様に見せかけてされていないので、注意が必要です。</font>

* <img width="640" alt="020101.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/4533fe92-e0e0-550b-35a5-59cddae18d3f.png">
<br><br>

コマンド ID のリンクをクリックすると、詳細を確認できます。

* <img width="640" alt="020102.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/b79b2722-c0f5-dd3f-f96b-b2361d7a0e64.png">
<br><br>

インスタンス ID のリンクをクリックすると、バッチスクリプトのログも確認できます。

* <img width="640" alt="020103.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/678bd5cc-21e4-4117-112b-76306daaacfa.png">

なお、
CloudWatch Events から実行されたかどうかは確認できません。

### ２−２．AWS CLI 

以下のコマンドを実行すると、結果が json で出力されます。

```bash
aws ssm list-commands --instance-id [インスタンスID]
```

```json
{
    "Commands": [
        {
            "NotificationConfig": {
                "NotificationType": "",
                "NotificationArn": "",
                "NotificationEvents": []
            },
            "RequestedDateTime": 1524671104.579,
            "Parameters": {
                "workingDirectory": [
                    "C:\\****\\"
                ],
                "commands": [
                    "C:\\****\\****.bat"
                ]
            },
            "TargetCount": 1,
            "ServiceRole": "",
            "MaxConcurrency": "50",
            "OutputS3KeyPrefix": "",
            "Comment": "",
            "ErrorCount": 0,
            "StatusDetails": "Success",
            "CommandId": "********-****-****-****-************",
            "MaxErrors": "0",
            "DocumentName": "arn:aws:ssm:ap-northeast-1::document/AWS-RunPowerShellScript",
            "InstanceIds": [],
            "ExpiresAfter": 1524678304.579,
            "OutputS3BucketName": "",
            "CompletedCount": 1,
            "Targets": [
                {
                    "Key": "InstanceIds",
                    "Values": [
                        "i-********"
                    ]
                }
            ],
            "Status": "Success"
        },
…
    ]
}
```

なお、このやり方でも、
CloudWatch Events から実行されたかどうかは確認できません。

### ２−３．AWS CloudTrail の イベント履歴

AWS CloudTrail の イベント履歴へ移動すると、
イベントログが一覧で出力されますので、
「SendCommand」でフィルタすると、SSM からの RunCommand が引っかかります。

* <img width="640" alt="020301.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/4c61055d-8fd5-dc1a-eabd-93035458e013.png">
<br><br>

イベントの表示ボタンを押下すると、json 形式の詳細なログが確認できます。

* <img width="640" alt="020302.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/a91948b0-698c-1ed5-7bbf-6fcf44decf81.png">

```json
{
    "eventVersion": "1.04",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "*********************:********************************",
        "arn": "arn:aws:sts::************:assumed-role/SSMRunCommand-MaintenanceEC2/********************************",
        "accountId": "************",
        "accessKeyId": "********************",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "2018-04-25T15:45:04Z"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAIMD3ODXYE2QOOIL7E",
                "arn": "arn:aws:iam::************:role/service-role/SSMRunCommand-MaintenanceEC2",
                "accountId": "************",
                "userName": "SSMRunCommand-MaintenanceEC2"
            }
        },
        "invokedBy": "events.amazonaws.com"
    },
    "eventTime": "2018-04-25T15:45:04Z",
    "eventSource": "ssm.amazonaws.com",
    "eventName": "SendCommand",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "events.amazonaws.com",
    "userAgent": "events.amazonaws.com",
    "requestParameters": {
        "parameters": {
            "workingDirectory": [
                "C:\\****\\"
            ],
            "commands": [
                "C:\\****\\****.bat"
            ]
        },
        "targets": [
            {
                "key": "InstanceIds",
                "values": [
                    "i-********"
                ]
            }
        ],
        "documentName": "arn:aws:ssm:ap-northeast-1::document/AWS-RunPowerShellScript",
        "interactive": false
    },
    "responseElements": {
        "command": {
            "commandId": "********-****-****-****-************",
            "targetCount": 0,
            "expiresAfter": "Apr 25, 2018 5:45:04 PM",
            "errorCount": 0,
            "targets": [
                {
                    "key": "InstanceIds",
                    "values": [
                        "i-********"
                    ]
                }
            ],
            "status": "Pending",
            "notificationConfig": {
                "notificationEvents": [],
                "notificationArn": "",
                "notificationType": ""
            },
            "requestedDateTime": "Apr 25, 2018 3:45:04 PM",
            "maxErrors": "0",
            "interactive": false,
            "outputS3BucketName": "",
            "serviceRole": "",
            "documentVersion": "",
            "statusDetails": "Pending",
            "maxConcurrency": "50",
            "comment": "",
            "instanceIds": [],
            "documentName": "arn:aws:ssm:ap-northeast-1::document/AWS-RunPowerShellScript",
            "parameters": {
                "workingDirectory": [
                    "C:\\****\\"
                ],
                "commands": [
                    "C:\\****\\****.bat"
                ]
            },
            "outputS3KeyPrefix": "",
            "completedCount": 0
        }
    },
    "requestID": "********-****-****-****-************",
    "eventID": "********-****-****-****-***********",
    "eventType": "AwsApiCall",
    "recipientAccountId": "************"
}
```

ここで、
「sourceIPAddress」が「events.amazonaws.com」となっていますが、

これが
CloudWatch Events から実行されたことを表しているとのことでした。

ただ、
CloudWatch Events のどのルールから実行されたかまではわからないみたいです。


### ※ 補足

ちなみに、バッチスクリプトのログは、以下の設定を行うことで CloudWatch Logs で確認することができます。

* [CloudWatch Logs へのログの送信 \(SSM エージェント\) \- AWS Systems Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/monitoring-ssm-agent.html)
    * [AWS CloudWatch で、Amazon EC2 Windows インスタンスのパフォーマンスとログの監視をしてみる \- Qiita](https://qiita.com/kusokamayarou/items/261efb81d91137ae8321)

# ３．Lambda

CloudWatch Events → Lambda という流れで実行しました。

Lambda のログは、以下のページに記載されている様に、CloudWatch Logs で確認できるのですが、

* [AWS Lambda の Amazon CloudWatch ログへのアクセス \- AWS Lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/monitoring-functions-logs.html)

残念ながら、実行元である CloudWatch Events の情報までは出力されないみたいです。

実行元である CloudWatch Events の情報を確認するには、以下のページにある様に CloudTrail に Lambda の呼び出しログを、S3 へ記録し、確認しなければならない様です。

* [AWS CloudTrail を使用して AWS Lambda API 呼び出しのログを記録する \- AWS Lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/logging-using-cloudtrail.html)

以下の様な形式で確認できるとのこと。

```json
"eventName": "Invoke",
"userIdentity": {
	"type": "AWSService",
	"invokedBy": "events.amazonaws.com"
},
"requestParameters": {
	"invocationType": "Event",
	"functionName": "arn:aws:lambda:ap-northeast-1:アカウントID:function:関数名",
	"sourceArn": "arn:aws:events:ap-northeast-1:アカウントID:rule/CloudWatch Events ルール名",
	"contentType": ""
},
```

# ＸＸ．まとめ

ということで、
Lambda でしか、実行元である CloudWatch Events の情報を確認できない様です。
しかも結構面倒臭い…。

サポートからは、
SSM RunCommand を使う場合は、Lambda 内で実行すればできないこともないです。
との回答を頂いたのですが…。

現状、スケジュールドリブンのバッチジョブを管理する目的で、CloudWatch Events を使っていますが、トレーサビリティが担保出来ないことの不安やリスクがやはりあるなぁ、という感じです。

スケジュールドリブンのバッチジョブは、実行されて当たり前なので、前日分の実行結果と、さらに一日前や一週間前の実行結果との差分を、レポート出力したかったのですが、そこまでやるのは正直ハードル高いみたいです。

とりあえず、
AWS さん、CloudWatch Logs で確認出来る様にしてもらえると、ありがたいなぁ〜