Step Functions タスクをクロスアカウントで実行

記事タイトルとURLをコピーする

はじめに

こんにちは。エンタープライズクラウド部の脇江です。

複数のAWSアカウントを利用するマルチアカウント構成が主流となってきていますが、AWSアカウントの数が増えると各AWSアカウントに対して共通する作業に手間がかかってしまうことがあります。

このような作業を自動化していこうと考えた時に Step Functions を使用するケースがあるかと思います。

今回はAWSアカウントをまたいだ(クロスアカウント)処理を Step Functions で実行するために必要な設定について記載します。

Step Functions とは?

Lambda 関数や他のAWSサービスを組み合わせてサーバレスで実行されるオーケストレーションサービスです。 処理や条件分岐、エラー処理などをワークフローとして定義することができます。 Step Functions ではこのワークフローのことを「ステートマシン」と呼び、その中の一つ一つの処理のことを「タスク」と呼びます。

docs.aws.amazon.com

Step Functions は200を超える AWS のサービスを呼び出して、9,000を超える API アクションにアクセスできます。

docs.aws.amazon.com

構成図

本ブログ内ではステートマシンに割り当てる IAM ロールを「ステートマシン実行ロール」、タスクが引き受ける IAM ロールを「ターゲットロール」とします。
ステートマシン実行ロールはソースアカウントに、ターゲットロールはターゲットアカウントにそれぞれ作成します。

ステートマシン内のタスクはターゲットロールを引き受ける(AssumeRole)ことで、クロスアカウントの Lambda 関数を実行することができるようになります。

今回は Step Functions のタスクにクロスアカウント処理を実行させることがメインの内容になるため、ドキュメントに記載の内容を参考としてターゲットアカウントから Lambda 関数を実行するのみの処理を行う構成とします。

やってみる

それでは実際にやってみます。
以下ドキュメントの内容を参考に進めていきます。
※少し順番は入れ替えて進めていきます。

docs.aws.amazon.com

【ターゲットアカウント】事前準備

ターゲットアカウントに Lambda 関数を作成しておきます。

後で使用するため、作成した Lambda 関数の ARN を控えておきます。

【ターゲットアカウント】ターゲットロールを作成

ターゲットロールをターゲットアカウントに作成します。
ターゲットロールには以下の内容で Lambda 関数を実行する権限を付与します。
Resource には控えておいた Lambda 関数の ARN を指定します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:111122223333:function:Echo"  // 事前に作成した Lambda 関数の ARN
    }
  ]
}

なお、信頼ポリシーについてはステートマシン作成後に更新するため、ここでは設定は不要です。
ターゲットロールの ARN についても後で使用するため控えておきます。

【ソースアカウント】ステートマシン実行ロールを作成

ソースアカウントにステートマシン実行ロールを作成します。
ステートマシン実行ロールに対して、以下の内容で権限を付与します。
Resource には控えておいたターゲットロールの ARN を指定します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::111122223333:role/LambdaRole"  // ターゲットロールの ARN
    }
  ]
}

こちらも後で使用しますので、ARNを控えておきましょう。

【ソースアカウント】ステートマシンを作成

ソースアカウントでステートマシンを作成します。
アクションから Lambda の Invoke を選択し、画面中央のフローの中にドラッグします。

追加した Lambda Invoke のタスクに対する設定を画面右メニューで行います。
※画面右に Lamba Invoke に関するメニューが表示されない場合は画面中央のフローの Lambda Invoke タスクをクリックすると表示されます。

[設定] タブを選択し、[API パラメータ] の [Function name] のプルダウンから「function name を入力」を選択します。
※選択肢として Lambda 関数が表示されますが、ソースアカウントの関数となるため、今回実行したいターゲットアカウントの関数は表示されません。


先ほど控えたターゲットアカウントの Lambda 関数の ARN を入力します。


次に <追加の設定> の [Enable cross-account access] にチェックを入れ、[クロスアカウントアクセスの IAM ロール] の プルダウンから「IAM ロールの ARN を指定」を選択します。
選択したら、先ほど控えたターゲットロールの ARN を入力します。


ここまで設定できたら、画面上部の [設定] をクリックし、ステートマシンの設定を行います。


[アクセス許可] の [実行ロール] で事前に作成したステートマシン実行ロールを選択し、[作成] をクリックします。


ステートマシンの作成が完了したら、ステートマシンの ARN とステートマシン実行ロールの ARN を控えます。

【ターゲットアカウント】ターゲットロールの信頼ポリシーを更新

ターゲットロールの信頼ポリシーを以下の内容で更新し、ステートマシン実行ロールから AssumeRole できるようにします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/ExecutionRole"  // ステートマシン実行ロールの ARN
      },
      "Condition": {  // どのアカウントとステートマシンがターゲットロールを引き受けることができるかを制御
        
        "StringEquals": {
          "sts:ExternalId": "arn:aws:states:us-east-1:123456789012:stateMachine:testCrossAccount"   // ソースアカウントのステートマシンの ARN
        }
      }
    }
  ]
}

動作確認

ステートマシンで処理を実行して、クロスアカウントの Lambda 関数が実行されることを確認します。

無事 Lambda 関数が正常に実行され、出力として Lambda 関数から受け取ったペイロードが表示されていることが確認できました。

おわりに

多くの AWS サービスの API を呼び出すことができる Step Functions でクロスアカウント処理を使って、マルチアカウントの運用作業を効率化する仕組み作りを探っていきたいと思います。

この記事がどなたかのお役に立てば幸いです。

脇江 凜 (記事一覧)

エンタープライズクラウド部クラウドリライアビリティ課

猫が好きです。