はじめに
Step FunctionsからGlueを起動させた際にいつまでも終了しなかったので、その内容を展開したいと思い、記事にしました。
概要
- Step Functionsの
Glue StartJobRun
のオプション”タスクが完了するまで待機”を使う場合は、Step FunctionsのIAMロールにglue:GetJobRun
が必要- 権限が無い場合、エラーにならずに延々待ち続けます
- 上記オプションを使わない場合は不要
参考
やったこと
IAMロール作成
以下のCFnで、GlueとStep Functions用のIAMロールを作成します。
最後から2行目をわざとコメントアウトしています。
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を作成します。
Step Functions作成
Glue StartJobRunをドロップし設定します。最初は”タスクが完了するまで待機”のチェックをしないようにします。
Amazon States Language上では、このようになりました。
{
"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ロールを指定します。
作成したら実行し、正常に動作することを確認します。
Glueのログも出ています。
”タスクが完了するまで待機”にチェック
Step Functionsを修正して、”タスクが完了するまで待機”にチェックを入れます。
Amazon States Language上では、Resourceの後ろに.sync
が付きました。
{
"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
}
}
}
この状態で実行してみます。何分経っても終わってくれません。
Step Functionsからは起動していて、Glueは既に終わっています。
IAMロールを修正し、再実行
IAMロールを作成したCFnを修正して更新します。最後から2行目をコメントインしただけです。
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は変更せず実行します。
今度はちゃんと終了しました。
おわりに
Step Functionsを使っていて、困った点について書きました。
”権限がない”とエラーにしてくれるとわかりやすいのですが、そうではなかったので解決に時間を要しました。
他の方の参考になれば幸いです。