管理アカウントから複数のアカウントに Lambda を実行する方法

はじめに

複数のアカウントに同じ処理の Lambda を実行する場合、管理アカウントの Lambda からクロスアカウントで処理を行うと思います。
その際に、AssumeRole を用いる方法が一般的かと思います。
[Lambdaでクロスアカウント] Lambda 関数で AssumeRole して他の AWS アカウントのリソースにアクセスする | DevelopersIO
この方法で実行できる分には問題ないとは思いますが、一つの Lambda Function でアカウント毎に処理を行うため実行制限時間内に処理が終わらない可能性があります。
今回は AssumeRole の方法に追加の工夫を加えてクロスアカウントで Lambda を実行する方法を提案したいと思います。

提案内容

以下の図のように Lambda Function → SNS → Lambda Function の方法で複数アカウントへ処理を行います。
f:id:rioner2525:20181120102602p:plain
管理アカウントの Lambda から処理したいアカウント数分の SNS を発行し、その SNS をトリガーに実際に別アカウントへ AssumeRole を行う Lambda を実行します。
この方法ならアカウント毎に実行される Lambda Function 毎に処理が行われるため、制限時間内に処理が終わるように実装できると思います。
関数名やロール名などをパラメーターとして引き渡すことで一般化することも可能になります。

パラメータの受け渡し方法

CloudWatch Alarm のパラメーター引き渡し方法について記載しておきます。
f:id:rioner2525:20181120104106p:plain
画面の赤枠部分ですが、 [ ルールの作成 ] → [ ターゲットの追加 ] → [ 入力の設定 ] → [ 定数(JSONテキスト) ] の部分でパラメータを設定できます。
この部分に以下のように設定すると、

{
   "RoleName": "xxx"
}

この CloudWatch Alarm のトリガーで実行された Lambda は以下のようにパラメータを受け取れます。

event['RoleName']

この方法で CloudWatch Alarm のルール設定で起動する関数を変えたり、Role を変えたり一般化することも可能です。
管理アカウントから複数のアカウントに Lambda を実行する場合に、是非検討してみてください(`・ω・´)