はじめに
Step Functions State Machineは、当該State Machine自体のログ(AWS Management Console上のExecution event history)をCloudWatch Logsに出力することが出来ます。
このCloudWatch Logsに出力するIAM Entity(≒CloudWatch Logsにログ出力する主体)が少し特殊であるため、情報をまとめました。
本記事は下記記事の派生となります。
【AWS】SAMでStep Functionsを利用してCloudWatch Logsにログ出力する際、sam deploy時にエラーが発生するケースがある【SAM】
TL;DR
- Step Functions State Machine自体のログ出力は、Step Functionsサービス自体の操作として行われる
- State Machineに付与したIAM Roleは、CloudWatch Logsへのログ出力には一切関係が無い
- 従って、CloudWatch LogsのResource based policyに必要な権限を付与することは必須
State Machine定義と照らし合わせると下記のように言うことが出来ます。
検証内容
検証項目
- State Machine定義に付与するIAM Roleに、AdministratorsAccessを付与する
- CloudWatch LogsのResource based policyをすべて削除する
- State Machineを実行し、その結果がCloudWatch Logsに出力されるか確認する
- CloudWatch LogsのResource based policyを戻し、State MachineからのログがCloudWatch Logsに出力されるか確認する
検証した環境
- State Machine名:
- State Machineに付与するIAM Role名: StepFunctions-HelloWorld-role-4fabec35
- State MachineのLogging設定
- Log level: ALL
- Include execution data: ☑
- CloudWatch log group: /aws/vendedlogs/states/LookingIntoLogging-Logs
検証手順概要
- 正常時動作確認
- CloudWatch LogsのResource based policyをすべて削除する
- 新たなState MachineをAWS Management Consoleを用いて定義し、CloudWatch LogsのResource based policyを確認する
- CloudWatch LogsのResource based policyを確認する
- State Machineを実行し、CloudWatch Logsにログが出力されていることを確認する
- CloudWatch Logs Resource based policy削除時の動作確認
- CloudWatch LogsのResource based policyを削除する
- State Machineに付与したIAM RoleにAdministratorAccess Policyを付与する
- State Machineを実行し、CloudWatch Logsにログが出力されていないことを確認する
- Resource based policyを再度付与しなおした際の挙動を確認
- CloudWatch LogsのResource based policyを付与する
- State Machineを実行し、CloudWatch Logsにログが出力されることを確認する
検証結果詳細
1. 正常時動作確認
1-1. CloudWatch LogsのResource based policyをすべて削除する
CloudWatch LogsのResource based policyをすべて削除し、何も設定されていないことを確認します。
$ aws logs delete-resource-policy --policy-name AWSLogDeliveryWrite20150319
$ aws logs describe-resource-policies
{
"resourcePolicies": []
}
1-2. 新たなState MachineをAWS Management Consoleを用いて定義し、CloudWatch LogsのResource based policyを確認する
HellowWolrdテンプレートをもとに、State Machineを新たに作ります。各設定は「検証した環境」に記載のとおりです。
1-3. CloudWatch LogsのResource based policyを確認する
AWS CLIにて、CloudWatch LogsのResource based policyを確認すると、上記で作成したState Machineに対応するPolicyが追加されていることが分かります。
$ aws logs describe-resource-policies
{
"resourcePolicies": [
{
"policyName": "AWSLogDeliveryWrite20150319",
"policyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"AWSLogDeliveryWrite\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"delivery.logs.amazonaws.com\"},\"Action\":[\"logs:CreateLogStream\",\"logs:PutLogEvents\"],\"Resource\":\"arn:aws:logs:us-west-2:************:log-group:/aws/vendedlogs/states/LookingIntoLogging-Logs:log-stream:*\"}]}",
"lastUpdatedTime": 1609216388365
}
]
}
$ aws logs describe-resource-policies | jq ".resourcePolicies[0].policyDocument | fromjson"0
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AWSLogDeliveryWrite",
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:us-west-2:************:log-group:/aws/vendedlogs/states/LookingIntoLogging-Logs:log-stream:*"
}
]
}
1-4. State Machineを実行し、CloudWatch Logsにログが出力されていることを確認する
先ほど作成したState Machineを実行してみると、きちんとCloudWatch Logsにログが出力されていることが確認できます。
###2. CloudWatch Logs Resource based policy削除時の動作確認
2-1. CloudWatch LogsのResource based policyを削除する
AWS CLIから、CloudWatch LogsのResource based policyを削除します。
$ aws logs delete-resource-policies --policy-name AWSLogDeliveryWrite20150319
「$ aws logs describe-resource-policies」コマンドで、CloudWatch LogsのResource based policyが削除されたことを確認します。
$ aws logs describe-resource-policies
{
"resourcePolicies": []
}
2-2. State Machineに付与したIAM RoleにAdministratorAccess Policyを付与する
State Machineに付与したIAM Roleに、AdministratorsAccess権限を付与しておきます。
2-3. State Machineを実行し、CloudWatch Logsにログが出力されていないことを確認する
先ほどのState MachineをAWS Management Consoleから実行します。
実行後、CloudWatch Logsにログが出力されないことが確認できます。
###3. Resource based policyを再度付与しなおした際の挙動を確認
3-1. CloudWatch LogsのResource based policyを付与する
AWS Management Consoleで自動で作成されたものと同一の、Resource based policyを付与しなおします。
$ vi cloudwatch-logs-resource-based-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AWSLogDeliveryWrite",
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:us-west-2:************:log-group:/aws/vendedlogs/states/LookingIntoLogging-Logs:log-stream:*"
}
]
}
$ aws logs put-resource-policy --policy-name AWSLogDeliveryWrite20150319 --policy-document file://cloudwatch-logs-resource-based-policy.json
{
"resourcePolicy": {
"policyName": "AWSLogDeliveryWrite20150319",
"policyDocument": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AWSLogDeliveryWrite\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"Service\": \"delivery.logs.amazonaws.com\"\n },\n \"Action\": [\n \"logs:CreateLogStream\",\n \"logs:PutLogEvents\"\n ],\n \"Resource\": \"arn:aws:logs:us-west-2:************:log-group:/aws/vendedlogs/states/LookingIntoLogging-Logs:log-stream:*\"\n }\n ]\n}\n\n",
"lastUpdatedTime": 1609217733590
}
}
3-2. State Machineを実行し、CloudWatch Logsにログが出力されることを確認する
先ほどと同じState Machineを実行すると、CloudWatch Logsにログが出力されたことを確認できます。
おわりに
Step Functionsに限らず、業務システム等でAWSを利用する場合、ログが重要になってきます。
きちんとログを取得できるか、必要な権限制御は出来るか、確認しておきましょう。