【AWS】Step FunctionsからCloudWatch Logsへのログ出力時の権限を確認する【Step Functions】

# はじめに
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】](https://qiita.com/tmiki/items/1ad26ca38f8b68e00df1)

# TL;DR
- Step Functions State Machine自体のログ出力は、Step Functionsサービス自体の操作として行われる
- State Machineに付与したIAM Roleは、CloudWatch Logsへのログ出力には一切関係が無い
- 従って、CloudWatch LogsのResource based policyに必要な権限を付与することは必須

State Machine定義と照らし合わせると下記のように言うことが出来ます。

![2020-12-29_14h36_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/7e1bfb1e-3311-1973-9e73-de510da8bab7.png)


# 検証内容
## 検証項目
- 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

## 検証手順概要
1. 正常時動作確認
    1. CloudWatch LogsのResource based policyをすべて削除する
    2. 新たなState MachineをAWS Management Consoleを用いて定義し、CloudWatch LogsのResource based policyを確認する
    3. CloudWatch LogsのResource based policyを確認する
    4. State Machineを実行し、CloudWatch Logsにログが出力されていることを確認する
2. CloudWatch Logs Resource based policy削除時の動作確認
    1. CloudWatch LogsのResource based policyを削除する
    2. State Machineに付与したIAM RoleにAdministratorAccess Policyを付与する
    3. State Machineを実行し、CloudWatch Logsにログが出力されていないことを確認する
3. Resource based policyを再度付与しなおした際の挙動を確認
    1. CloudWatch LogsのResource based policyを付与する
    2. State Machineを実行し、CloudWatch Logsにログが出力されることを確認する

## 検証結果詳細
### 1. 正常時動作確認
#### 1-1. CloudWatch LogsのResource based policyをすべて削除する
CloudWatch LogsのResource based policyをすべて削除し、何も設定されていないことを確認します。

```:CloudWatch&nbsp;LogsのResource&nbsp;based&nbsp;policyを削除
$ aws logs delete-resource-policy --policy-name AWSLogDeliveryWrite20150319
```

```:CloudWatch&nbsp;LogsのResource&nbsp;based&nbsp;policyに何も設定されていないことを確認
$ aws logs describe-resource-policies
       {
           "resourcePolicies": []
       }
```

#### 1-2. 新たなState MachineをAWS Management Consoleを用いて定義し、CloudWatch LogsのResource based policyを確認する

HellowWolrdテンプレートをもとに、State Machineを新たに作ります。各設定は「検証した環境」に記載のとおりです。

![2020-12-29_13h30_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/9345cc6a-008f-ee91-65a2-366bd9a37a75.png)
![2020-12-29_13h32_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/86ac47e1-4115-a070-d395-719944fe0186.png)
![2020-12-29_13h33_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/2e94c83a-2930-77ff-d294-8d42bd4e9ce0.png)


#### 1-3. CloudWatch LogsのResource based policyを確認する
AWS CLIにて、CloudWatch LogsのResource based policyを確認すると、上記で作成したState Machineに対応するPolicyが追加されていることが分かります。

```json:aws&nbsp;logs&nbsp;describe-resource-policies
$ 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
        }
    ]
}
```

```json:Resource&nbsp;based&nbsp;policy&nbsp;AWSLogDeliveryWrite20150319の内容
$ 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にログが出力されていることが確認できます。

![2020-12-29_13h37_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/e008d19d-08ed-9093-52a9-303adcebd0f6.png)
![2020-12-29_13h37_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/f0251d65-21a4-faa7-6331-b5986726b50e.png)
![2020-12-29_13h38_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/7ef1ed6a-7eb7-761f-4bcf-02268c111593.png)
![2020-12-29_13h38_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/08b071db-ae04-c903-249d-1133cd555059.png)


###2. CloudWatch Logs Resource based policy削除時の動作確認
#### 2-1. CloudWatch LogsのResource based policyを削除する
AWS CLIから、CloudWatch LogsのResource based policyを削除します。

```:aws&nbsp;logs&nbsp;delete-resource-policies
$ aws logs delete-resource-policies --policy-name AWSLogDeliveryWrite20150319
```

「$ aws logs describe-resource-policies」コマンドで、CloudWatch LogsのResource based policyが削除されたことを確認します。

```:aws&nbsp;logs&nbsp;describe-resource-policies
$ aws logs describe-resource-policies
{
    "resourcePolicies": []
}
```


#### 2-2. State Machineに付与したIAM RoleにAdministratorAccess Policyを付与する
State Machineに付与したIAM Roleに、AdministratorsAccess権限を付与しておきます。

![2020-12-29_13h46_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/bce5756e-f896-2797-8b06-acaddd30a228.png)


#### 2-3. State Machineを実行し、CloudWatch Logsにログが出力されていないことを確認する
先ほどのState MachineをAWS Management Consoleから実行します。
実行後、CloudWatch Logsにログが出力されないことが確認できます。

![2020-12-29_13h46_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/484c8f95-ec6d-1b55-8540-252faaad6a37.png)
![2020-12-29_13h47_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/0292f424-7ca9-cbf5-72be-10aeaae1f6f2.png)
![2020-12-29_13h47_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/f7fcc644-8233-adf4-7f6d-aa103f89be29.png)


###3. Resource based policyを再度付与しなおした際の挙動を確認
#### 3-1. CloudWatch LogsのResource based policyを付与する
AWS Management Consoleで自動で作成されたものと同一の、Resource based policyを付与しなおします。

```json:cloudwatch-logs-resource-based-policy.json
$ 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&nbsp;logs&nbsp;put-resource-policy
$ 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にログが出力されたことを確認できます。

![2020-12-29_13h58_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/860ba20f-da6c-b256-4195-f224c20ee3eb.png)
![2020-12-29_13h58_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/4e339e17-27f1-9d3f-2c47-02c8da6d9fb2.png)
![2020-12-29_13h58_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/b090be79-845b-2b4d-6d99-96d59c75aa22.png)
![2020-12-29_13h59_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/6e27ad8d-fdd9-e254-57a0-330c17f5ddf5.png)


# おわりに
Step Functionsに限らず、業務システム等でAWSを利用する場合、ログが重要になってきます。
きちんとログを取得できるか、必要な権限制御は出来るか、確認しておきましょう。