TL;DR
- Resourceキーの値をLambdaのARNから、
arn:aws:states::: Lambda:invoke
に変更する - Parametersキーを追加して、呼び出したいクロスアカウント 先のLambdaのARNを指定する
- クロスアカウント先のLambdaには、呼び出し元のAWSアカウントからの呼び出しを許可する必要がある
事前準備
- AWSアカウントを2つ用意する(アカウントA, アカウントB)
- アカウントBに対して、以下のようなLambdaを用意する
exports.handler = async (event, context) => {
const response = {
body: JSON.stringify({
foo: 'Hello, world',
bar: 'Goodbye, world',
})
};
return response;
};
手順
ステートマシンの定義
まずは、アカウントAで使用するStepFunctionsで使用するステートマシンの定義をしていきます。
今回は、呼び出しだけを確認したいだけなので、シンプルなものにしました。
ここで、大きなポイントとしては、Resource
の部分で、LambdaのARNではなく、lambda:invokeを指定しているところです
そして、Parameters
の中の FunctionName
で、呼び出し先のLambdaのARNを指定する必要があります。
こちらの2点を注意していただければ、クロスアカウントでのLambdaの呼び出しが可能になります。
{
"Comment": "This state machine is for invoke cross account lambda.",
"StartAt": "Exec",
"States": {
"Exec": {
"Comment": "実行",
"Type": "Task",
"InputPath": "$",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "arn:aws:lambda:ap-northeast-1:xxxxxxxx:function:cdkSampleFunction"
},
"ResultPath": "$",
"End": true
}
}
}
では、上記のステートマシンの定義ファイルを使って、アカウントAでステートマシンを作成します
作成すると、以下のようなフローになると思います
Step Functionsで使用するRoleのポリシーは、以下のようになります
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:ap-northeast-1:[AccountB]:function:[Function]"
]
}
]
}
アカウントBのLambdaから、StepFunctionsの呼び出しを許可する
先ほどの手順で、StepFunctionsでのステートマシンが作成でき、Lambdaを呼び出す準備ができました。
ただし、このまま実行すると、クロスアカウント先(アカウントB)のLambdaを呼び出すことができないため、アクセス権限を付与していきます。
- アクセス権限を付与するLambda関数のページを開き、[設定] タブで、[アクセス権限] を選択します。
- [リソースベースのポリシー] ペインで、[アクセス権限を追加] を選択します。
- [ポリシーステートメント] ペインで、[AWS service] (AWS のサービス) を選択します。[サービス] ドロップダウンリストが表示されます。
- [サービス] ドロップダウンリストで、[Other] を選択すると、テキストフィールドが表示されます。
- [プリンシパル] に、StepFunctionsのステートマシンを作成したアカウント(アカウントA)の AWS アカウント ID を入力します。
- [ソース ARN] に StepFunctionsのステートマシンのの ARN を入力します。
- [アクション] ドロップダウンリストから [lambda:InvokeFunction] を選択します。
- [ステートメント ID] に、ポリシー内で作成するステートメントを区別する一意のステートメント ID を入力します。
- [保存] を選択します。
呼び出してみる
上記の手順を実施することで、呼び出し元のステートマシンと呼び出し先のLambdaの準備ができました
では、早速、呼び出し元のアカウントAのステートマシンから、「実行の開始」を実行します
そうすると、以下のようなグラフから、成功していることがわかるかと思います。
まとめ
いかがだったでしょうか。
AWS StepFunctionsを使ったクロスアカウントでのLambdaを試してみましたが、意外と簡単に呼び出せることが、わかっていただけたかと思います。
呼び出したLambdaの実行結果をキャッチすることもできるので、クロスアカウントでの実行がより楽になっていくと思います。
参考URL