AWS Step Functions の ステートマシン の ログを出力するRole

# AWS Step Functions の ステートマシン の ログを出力するRole

## ログ出力無しの時は、Roleを指定しない場合に、自動で作られるRoleは以下

利用しているfunctionの実行権限(lambda:InvokeFunction)が「Resource」がどんどん追加されていく

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:us-west-2:123456789012:function:startTask",
                "arn:aws:lambda:us-west-2:123456789012:function:startTask:*",
                "arn:aws:lambda:us-west-2:123456789012:function:createAthenaTable",
                "arn:aws:lambda:us-west-2:123456789012:function:createAthenaTable:*",
            ],
            "Effect": "Allow"
        }
    ]
}
```

## 同じようにlog-groupに関しても下記のように「Resource」がどんどん追加されていく状況になります。

```
{
  "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:123456789012:log-group:/aws/vendedlogs/states/startTask-Logs:log-stream:*",
        "arn:aws:logs:us-west-2:123456789012:log-group:/aws/vendedlogs/states/createAthenaTable-Logs:log-stream:*"
      ]
    }
  ]
}
```

# CloudWatch LogsのResource based policyにはサイズ上限があり、SAMによりこの上限を超える変更をしようとする場合に発生します。

Resource based policyを手動で更新し、「Resource」の範囲を緩くする

`Resource: "*"`としている


```
  StateMachineRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub "role-state-machine"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: states.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: !Sub "state-machine-logs-policy"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - lambda:InvokeFunction
                Resource: "*"
              - Effect: Allow
                Action:
                  - logs:CreateLogDelivery
                  - logs:CreateLogStream
                  - logs:GetLogDelivery
                  - logs:UpdateLogDelivery
                  - logs:DeleteLogDelivery
                  - logs:ListLogDeliveries
                  - logs:PutLogEvents
                  - logs:PutResourcePolicy
                  - logs:DescribeResourcePolicies
                  - logs:DescribeLogGroups
                Resource: "*"
```

ManagedPolicyを使うても・・・

```
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaRole
```

# SAMテンプレート例

```
Resources:
  # -------------------------
  # IAM Role
  # -------------------------
  StateMachineRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub "${Service}-${Stage}-role-state-machine"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: states.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaRole
      Policies:
        - PolicyName: !Sub "${Service}-${Stage}-state-machine-logs-policy"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - logs:CreateLogDelivery
                  - logs:CreateLogStream
                  - logs:GetLogDelivery
                  - logs:UpdateLogDelivery
                  - logs:DeleteLogDelivery
                  - logs:ListLogDeliveries
                  - logs:PutLogEvents
                  - logs:PutResourcePolicy
                  - logs:DescribeResourcePolicies
                  - logs:DescribeLogGroups
                Resource: "*"

  # -------------------------
  # State Machines リソース
  # -------------------------
  emrExecution:
    Type: AWS::Serverless::StateMachine
    Properties:
      Name: !Sub "${Service}-${Stage}-emrExecution"
      Role: !GetAtt StateMachineRole.Arn
      Logging:
        Level: ALL
        IncludeExecutionData: True
        Destinations:
          - CloudWatchLogsLogGroup:
              LogGroupArn: !GetAtt emrExecutionLogGroup.Arn
    〜〜省略〜〜

  # -------------------------
  # LogGroup リソース
  # -------------------------
  emrExecutionLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/aws/vendedlogs/states/${Service}-${Stage}-state-machine-Logs"  # ロググループ名

```

# リンク

https://docs.aws.amazon.com/step-functions/latest/dg/cw-logs.html#cloudwatch-iam-policy