1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS StepFunctionsで、クロスアカウント でAWS Lambdaを呼び出す

Last updated at Posted at 2021-10-06

TL;DR

  • Resourceキーの値をLambdaのARNから、arn:aws:states::: Lambda:invoke に変更する
  • Parametersキーを追加して、呼び出したいクロスアカウント 先のLambdaのARNを指定する
  • クロスアカウント先のLambdaには、呼び出し元のAWSアカウントからの呼び出しを許可する必要がある

事前準備

  1. AWSアカウントを2つ用意する(アカウントA, アカウントB)
  2. アカウント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でステートマシンを作成します
作成すると、以下のようなフローになると思います

スクリーンショット 2021-10-06 23.54.59.png

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を呼び出すことができないため、アクセス権限を付与していきます。

  1. アクセス権限を付与するLambda関数のページを開き、[設定] タブで、[アクセス権限] を選択します。
  2. [リソースベースのポリシー] ペインで、[アクセス権限を追加] を選択します。
  3. [ポリシーステートメント] ペインで、[AWS service] (AWS のサービス) を選択します。[サービス] ドロップダウンリストが表示されます。
  4. [サービス] ドロップダウンリストで、[Other] を選択すると、テキストフィールドが表示されます。
  5. [プリンシパル] に、StepFunctionsのステートマシンを作成したアカウント(アカウントA)の AWS アカウント ID を入力します。
  6. [ソース ARN] に StepFunctionsのステートマシンのの ARN を入力します。
  7. [アクション] ドロップダウンリストから [lambda:InvokeFunction] を選択します。
  8. [ステートメント ID] に、ポリシー内で作成するステートメントを区別する一意のステートメント ID を入力します。
  9. [保存] を選択します。

呼び出してみる

上記の手順を実施することで、呼び出し元のステートマシンと呼び出し先のLambdaの準備ができました
では、早速、呼び出し元のアカウントAのステートマシンから、「実行の開始」を実行します

そうすると、以下のようなグラフから、成功していることがわかるかと思います。

スクリーンショット 2021-10-07 0.05.33.png

まとめ

いかがだったでしょうか。
AWS StepFunctionsを使ったクロスアカウントでのLambdaを試してみましたが、意外と簡単に呼び出せることが、わかっていただけたかと思います。
呼び出したLambdaの実行結果をキャッチすることもできるので、クロスアカウントでの実行がより楽になっていくと思います。

参考URL

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?