0.はじめに
CloudWatch Events から スケジュールドリブンで、SSM RunCommand や Lambda を実行してみた際に、それぞれのログがどう出力されるのかよくわからずに困ったことがあったので、
サポートに確認したところ、ご回答を頂いたのでシェア。
1.CloudWatch Events
まず、原則として、
CloudWatch Events 自体のログは、どこにも出力されない。
とのことです。
CloudWatch Logs にも、CloudTrail にも出力されないみたいです。
2.SSM RunCommand
CloudWatch Events → SSM RunCommand という流れで実行しました。
SSM RunCommand のログは、以下の方法で確認出来るみたいです。
- AWS Systems Manager の RunCommand コンソール
- AWS CLI
- AWS CloudTrail の イベント履歴
それぞれ、ちょっとみてみます。
2−1.AWS Systems Manager の RunCommand コンソール
AWS Systems Manager の RunCommand コンソールへ移動すると、
実行されたログが一覧で出力されます。
ただ、レコードが時系列でソートされている様に見せかけてされていないので、注意が必要です。
コマンド ID のリンクをクリックすると、詳細を確認できます。
インスタンス ID のリンクをクリックすると、バッチスクリプトのログも確認できます。
なお、
CloudWatch Events から実行されたかどうかは確認できません。
2−2.AWS CLI
以下のコマンドを実行すると、結果が json で出力されます。
aws ssm list-commands --instance-id [インスタンスID]
{
"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 から実行されたかどうかは確認できません。
2−3.AWS CloudTrail の イベント履歴
AWS CloudTrail の イベント履歴へ移動すると、
イベントログが一覧で出力されますので、
「SendCommand」でフィルタすると、SSM からの RunCommand が引っかかります。
イベントの表示ボタンを押下すると、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 で確認することができます。
3.Lambda
CloudWatch Events → Lambda という流れで実行しました。
Lambda のログは、以下のページに記載されている様に、CloudWatch Logs で確認できるのですが、
残念ながら、実行元である CloudWatch Events の情報までは出力されないみたいです。
実行元である CloudWatch Events の情報を確認するには、以下のページにある様に CloudTrail に Lambda の呼び出しログを、S3 へ記録し、確認しなければならない様です。
以下の様な形式で確認できるとのこと。
"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": ""
},
XX.まとめ
ということで、
Lambda でしか、実行元である CloudWatch Events の情報を確認できない様です。
しかも結構面倒臭い…。
サポートからは、
SSM RunCommand を使う場合は、Lambda 内で実行すればできないこともないです。
との回答を頂いたのですが…。
現状、スケジュールドリブンのバッチジョブを管理する目的で、CloudWatch Events を使っていますが、トレーサビリティが担保出来ないことの不安やリスクがやはりあるなぁ、という感じです。
スケジュールドリブンのバッチジョブは、実行されて当たり前なので、前日分の実行結果と、さらに一日前や一週間前の実行結果との差分を、レポート出力したかったのですが、そこまでやるのは正直ハードル高いみたいです。
とりあえず、
AWS さん、CloudWatch Logs で確認出来る様にしてもらえると、ありがたいなぁ〜