はじめに
StepFunctionsのMapフローを使って、csvやS3オブジェクトを並列でいてレートすることができます。その際のStepFunctionsの権限設定がやや独特に感じたのでメモしておきます。
結論
Mapフローを使う場合は、ステートマシンのロールにstates:StartExecution
の権限を付ける必要がある。
経緯
まず、下記のようなステートマシンを用意します。
S3バケット内にあるcsvファイルをMapでイテレートします。
今回はcsvに対する処理は関係ないので、Mapの中身はPassとします。
CSVの中身は↓を用意しました。
id,name
1,Alice
2,Bob
3,Charlie
4,David
5,Eva
6,Fiona
7,George
8,Hannah
9,Ian
10,Julia
csvファイルをS3から取得するための権限が必要なので、ステートマシンへのロールにはAmazonS3FullAccess
を付与しました。FullAccessである必要は別にないですが、検証なのでね。
直感的にはこれで処理はうまくいきそうです。
しかしステートマシンを実際に実行すると処理は失敗してしまいます。
原因のメッセージを見ると下記が表示されていました。(アカウントIDは変更してあります。)
Error contacting AWS Service. | Message from Service: User: arn:aws:sts::0123456789012:assumed-role/StepFunctions-MyStateMachine-role-bcb29a25/mgCIjMOxLHclkIkSWmwZkPCBaQSEOcvn is not authorized to perform: states:StartExecution on resource: arn:aws:states:ap-northeast-1:0123456789012:stateMachine:MyStateMachine-i2lr7s9t4 because no identity-based policy allows the states:StartExecution action (Service: Sfn, Status Code: 400, Request ID: f5158edf-c257-4e60-8196-f162b95f4959)
is not authorized to perform: states:StartExecution on resource
とあるのを見るに、states:StartExecution
の権限が足りていないようです。
再度実行すると、今度は処理に成功しました。
このように、Mapフローを使う場合は、ステートマシンのロールにstates:StartExecution
の権限を付けないと、権限不足で処理に失敗してしまうようです。
ステートマシンにStepFunctionsの実行権限をつけるのはあまり直感的ではないので注意したいですね。