AWS Step Functions API を API Gateway API のメソッドに関連付けることを勉強したいのでハンズオンしたときの記録です。
これができると、HTTPS リクエストが API メソッドに送信され、API Gateway は Step Functions API アクションを呼び出せます。Step Functions を作りこめばリクエストに応じてイイ感じにレスポンスしてくれるやろうという期待があります。
API Gateway 用にIAM ロールを作成する
IAM ロールを作成します。API Gateway API を作成する前に、Step Functions API アクションを呼び出すための権限を API Gateway に与える必要があるためです。
1. 下記コマンドをAWS CloudShell で実行する。
#!/bin/bash
# Create IAM role
role_name="APIGatewayToStepFunctions"
role_trust_policy='{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}'
role_response=$(aws iam create-role --role-name $role_name --assume-role-policy-document "$role_trust_policy")
# Attach policy to the role
policy_arn="arn:aws:iam::aws:policy/AWSStepFunctionsFullAccess"
aws iam attach-role-policy --role-name $role_name --policy-arn $policy_arn
# Extract and output the role ARN
role_arn=$(echo $role_response | jq -r '.Role.Arn')
echo "IAM Role ARN: $role_arn"
2. IAM Role ARN: をコピーする(下図選択部分、arn:~~の部分)。API Gateway 作成時に使用します。
API Gateway で API を作成する
IAM ロールを作成できたら、今回はアジアパシフィック(東京) ap-northeast-1 リージョンで API Gateway を作成します。
1. API Gateway コンソールを開きます。
2. REST API の[構築]を選択します。
※すでにAPIが作成されている場合、画面が異なります。
3. ポップアップが表示された場合は[OK]を選択してください。
4. [プロトコルを選択する]で[REST]を選択します。
5. [新しい API の作成]で[新しいAPI]を選択します。
6. [名前と説明]の[API 名*]に StartExecutionAPI
を入力、[エンドポイントタイプ] で[リージョン]を選択します。
7. [API の作成] を選択します。
8. StartExecutionAPI の リソース ページで、 アクション▼ > [リソースの作成] の順に選択します。
9. [新しい子リソース] ページで、[リソース名] にexecution
入力し、 [リソースの作成] を選択します。
10. [/execution メソッド] ページで、アクション▼ > [メソッドの作成] の順に選択します。
11. リストから POST
を選択し、チェックマークを選択します。
12. [/execution - POST - セットアップ]ページの [統合タイプ] で、[AWS サービス] を選択します。
13. [AWS リージョン] で、 プルダウンから [ap-northeast-1] を選択します。
14. [AWS サービス] で、プルダウンから [Step Functions] を選択します。
15. [HTTP メソッド] で、プルダウンから [POST] を選択します。
16. [アクションの種類] で、[アクション名の使用] を選択します。
17. [アクション] に StartExecution
と入力します。
18. [実行ロール] に、1章の項番2でコピーしたIAMロールのARNを入力します。
このような画面になっているはずです。
19. [保存] を選択します。
API ゲートウェイとStep Functions の間の視覚的なマッピングは、[/execution - POST - メソッドの実行] ページに表示されます。
API Gateway API のテストとデプロイ
API を作成したら、テストしてデプロイします。
API Gateway と Step Functions 間の通信をテストする
1. [/execution - POST - メソッドの実行] ページで、[テスト]を選択します。
2. 既存のステートマシンの ARN で下記リクエストパラメータの stateMachineArn
を置き換え、[リクエスト本文] セクションに入力します。
既存のステートマシンがない場合は、こちらを参考にして作成してから本手順を実行してください。
【ハンズオン】Lambda関数を呼び出すStepFunctionsステートマシン
サーバレスの勉強がてらStep Functionsをちゃんと触ってみました。 Lambda 関数を作成する 1. Lambdaコンソールを開くをクリックして、「関数の作成」を選択します。 2. [関数の作成]ページで、 [一から作成]を選択します。 3. [関数名]に「HelloFunction」と入力します。 4. 他のすべてのオプションはデフォルトの選択のままにして、[関数の作成]を選択します。 このような画面になっているはずです(※ランタイムは後進されている場合があります。実行ロール名はサ ...
{
"input": "{}",
"name": "MyExecution",
"stateMachineArn": "arn:aws:states:ap-northeast-1:123456789012:stateMachine:testStateMachine"
}
3. [テスト] を選択します。
4. 実行が開始され、executionArn
と startDate
は レスポンス本文に表示されます。
{
"executionArn": "arn:aws:states:us-east-1:123456789012:execution:testStateMachine:MyExecution",
"startDate": 1486768956.878
}
API をデプロイする
1. StartExecutionAPI の リソース ページで、 アクション▼ > [API のデプロイ] の順に選択します。
2. [API のデプロイ] ダイアログボックスの[デプロイされるステージ]で[新しいステージ]を選択、[ステージ名]で alpha
を入力します。
3. [デプロイ]を選択します。
4. [alpha - POST - /execution]ページで、[URLの呼び出し]のURLをコピーします。
5. AWS CloudShell から ARN を使用してコマンドを実行します。curl コマンドでデプロイの URL を呼び出します。次は curl コマンドの例です。stateMachineArn, URL は置き換えてください。
curl -X POST -d '{"input": "{}","name": "MyExecution","stateMachineArn": "arn:aws:states:ap-northeast-1:123456789012:stateMachine:testStateMachine"}' https://a1b2c3d4e5.execute-api.ap-northeast-1.amazonaws.com/alpha/execution
下の記事通りStep Functions ステートマシンを作成された方は、curl コマンドの name
を who
にして stateMachineArn, URL を置き換えてください。
【ハンズオン】Lambda関数を呼び出すStepFunctionsステートマシン
サーバレスの勉強がてらStep Functionsをちゃんと触ってみました。 Lambda 関数を作成する 1. Lambdaコンソールを開くをクリックして、「関数の作成」を選択します。 2. [関数の作成]ページで、 [一から作成]を選択します。 3. [関数名]に「HelloFunction」と入力します。 4. 他のすべてのオプションはデフォルトの選択のままにして、[関数の作成]を選択します。 このような画面になっているはずです(※ランタイムは後進されている場合があります。実行ロール名はサ ...
curl -X POST -d '{"input": "{}","who": "MyExecution","stateMachineArn": "arn:aws:states:ap-northeast-1:123456789012:stateMachine:testStateMachine"}' https://a1b2c3d4e5.execute-api.ap-northeast-1.amazonaws.com/alpha/execution
次のようなレスポンスが返ってくれば正常に動作しています。
{"executionArn":"arn:aws:states:ap-northeast-1:123456789012:execution:HelloWorld:testStateMachine","startDate":1.486772644911E9}
さらに自己学習
API Gateway で下の記事通り作成したStep Functions ステートマシン API を公開して、AWS CloudShell ではなく POSTMAN でも同様のレスポンスが返ってくることを見てみます(POSTMAN を触っておきたい)。
【ハンズオン】Lambda関数を呼び出すStepFunctionsステートマシン
サーバレスの勉強がてらStep Functionsをちゃんと触ってみました。 Lambda 関数を作成する 1. Lambdaコンソールを開くをクリックして、「関数の作成」を選択します。 2. [関数の作成]ページで、 [一から作成]を選択します。 3. [関数名]に「HelloFunction」と入力します。 4. 他のすべてのオプションはデフォルトの選択のままにして、[関数の作成]を選択します。 このような画面になっているはずです(※ランタイムは後進されている場合があります。実行ロール名はサ ...
ここからは POSTMAN にサインインされていることを前提としています(Googleアカウントでサインアップするとお手軽です)。
1. Workspacesタブから[My Workspace]を選択します。
2. [New]を選択し、[HTTP]を選択します。
3. [GET]になっているプルダウンから[POST]を選択します。
4. API Gateway コンソールで[alpha - POST - /execution]ページの、[URLの呼び出し]のURLを入力します(URLの場所は前章参照)。
5. [Body]タブを選択します。
6. [raw]を選択します。
7. リクエスト本文を入力します。
8. [Send]を選択します。
POSTMAN でも AWS CloudShell と同様のレスポンスが返ってくること確認できました。
参考
Creating a Step Functions API Using API Gateway - AWS Step Functions (amazon.com)