GlueをStep Functionsから呼び出す際はGetJobRunを入れておいた方が良い

# はじめに

Step FunctionsからGlueを起動させた際にいつまでも終了しなかったので、その内容を展開したいと思い、記事にしました。

# 概要
- Step Functionsの`Glue StartJobRun`のオプション”タスクが完了するまで待機”を使う場合は、Step FunctionsのIAMロールに`glue:GetJobRun`が必要
    - 権限が無い場合、<font color="red">**エラーにならずに延々待ち続けます**</font>
- 上記オプションを使わない場合は不要

# 参考

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/troubleshooting-service-integrations.html#troubleshooting-service-integrations-task-delay

# やったこと

## IAMロール作成
以下のCFnで、GlueとStep Functions用のIAMロールを作成します。
最後から2行目をわざとコメントアウトしています。
```yaml:create2Rle.yaml
AWSTemplateFormatVersion: "2010-09-09"

Resources:
  ##################################################
  # Glue role
  ##################################################
  GlueRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: for-glue
      Path: "/"
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - "glue.amazonaws.com"
            Action:
              - sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole
        - arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
        
  ##################################################
  # Step Functions role
  ##################################################
  StateMachineRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: for-stepfunctions
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - states.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: "/"
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
      Policies:
        # glue
        - PolicyName: invoke-gluejob
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - 'glue:StartJobRun'
                  # - 'glue:GetJobRun'
                Resource: '*'
```

## Glue作成
コンソールから簡単なPythonのGlueを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/8fdcf99a-9dec-9762-d5a8-1bf62f3348fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/2ce57a74-b366-bf0b-dc13-5c32bb178308.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/54583225-9024-b541-41a7-396609975bcd.png)

保存して、実際に動くことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/3ec2be4b-ef7f-4eb2-7744-84575756765a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/4f26caad-12c2-b089-94a5-3b8a7e0bd1c7.png)

## Step Functions作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/99ae2196-7393-69dc-6d1f-65f5f88f8acd.png)
Glue StartJobRunをドロップし設定します。最初は”タスクが完了するまで待機”のチェックをしないようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/19dc4ffb-99e0-3a37-97e1-6c7a9260881f.png)
Amazon States Language上では、このようになりました。
```json
{
  "Comment": "A description of my state machine",
  "StartAt": "Glue StartJobRun",
  "States": {
    "Glue StartJobRun": {
      "Type": "Task",
      "Resource": "arn:aws:states:::glue:startJobRun",
      "Parameters": {
        "JobName": "testjob20221201"
      },
      "End": true
    }
  }
}
```
作ったIAMロールを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/4cc7c95b-ed76-0be9-e504-2aec0b298ee2.png)
作成したら実行し、正常に動作することを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/305d3ead-343a-5d75-0fad-7c1df2495975.png)
Glueのログも出ています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/0cbc77ec-f42c-51d9-d6d0-4136042720c1.png)

## ”タスクが完了するまで待機”にチェック
Step Functionsを修正して、”タスクが完了するまで待機”にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/52eba896-4404-1aaf-629e-77b8dffc3899.png)
Amazon States Language上では、Resourceの後ろに`.sync`が付きました。
```json
{
  "Comment": "A description of my state machine",
  "StartAt": "Glue StartJobRun",
  "States": {
    "Glue StartJobRun": {
      "Type": "Task",
      "Resource": "arn:aws:states:::glue:startJobRun.sync",
      "Parameters": {
        "JobName": "testjob20221201"
      },
      "End": true
    }
  }
}
```
この状態で実行してみます。何分経っても終わってくれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/8eccc94e-ccd5-4342-15da-14f8d7207947.png)
Step Functionsからは起動していて、Glueは既に終わっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f0d2fa8a-39c4-0ff0-0afc-398dcbd0ae12.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/a76b25b6-b897-3def-04eb-9f308b0eae22.png)

いつまでも終わらないので、実行を停止させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f3336e37-316e-9d20-b0ed-88bffaaf198f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e501461a-1685-0d6c-b155-93b74792c8b0.png)


## IAMロールを修正し、再実行
IAMロールを作成したCFnを修正して更新します。最後から2行目をコメントインしただけです。
```yaml:create2Rle.yaml
AWSTemplateFormatVersion: "2010-09-09"

Resources:
  ##################################################
  # Glue role
  ##################################################
  GlueRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: for-glue
      Path: "/"
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - "glue.amazonaws.com"
            Action:
              - sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole
        - arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
        
  ##################################################
  # Step Functions role
  ##################################################
  StateMachineRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: for-stepfunctions
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - states.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: "/"
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
      Policies:
        # glue
        - PolicyName: invoke-gluejob
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - 'glue:StartJobRun'
                  - 'glue:GetJobRun'
                Resource: '*'
```
変更後、Step Functionsは変更せず実行します。
今度はちゃんと終了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/d545af58-cbdd-feae-fbe7-28056541d301.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/0313ca90-9f01-a7d6-931c-8b723e62d38e.png)

# おわりに
Step Functionsを使っていて、困った点について書きました。
”権限がない”とエラーにしてくれるとわかりやすいのですが、そうではなかったので解決に時間を要しました。

他の方の参考になれば幸いです。