やりたいこと
今回はECSから別アカウントのLambdaをinvokeする際に少し沼ったので注意点を挙げたと思います!
やり方
権限の設定
1. 呼び出し先のLambdaでの設定
Lambdaのアクセス許可ポリシーの追加
- Lambda関数に対して呼び出し元のアカウントから呼び出しを許可するためのリソースベースのポリシーを設定します。(Lambdaの実行ロールなどはいじる必要はありません!)
- AWS CLIでする場合は以下のコマンドを参考にしてください!
aws lambda add-permission \
--function-name my-function \
--statement-id AllowInvokeFromAccount \
--action lambda:InvokeFunction \
--principal arn:aws:iam::<Account_ID>:root
-
my-function
は呼び出したいLambda関数名、<Account_ID>
は呼び出し元のアカウントIDに置き換えます。
2. 呼び出し元のECSでの設定
ECSタスク実行ロールの更新
- ECSタスクがLambdaを呼び出すために使用するIAMロールを更新します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:<region>:<Account_ID>:function:my-function"
}
]
}
-
my-function
は呼び出したいLambda関数名、<region>
はLambda関数が存在するリージョン、<Account_ID>
は呼び出し先のアカウントIDに置き換えます。
ネットワークの設定
1. 呼び出し元
呼び出しを実行するECS(Lambda)がネットに繋がっていれば問題ないです!
(igwまたはnat経由、endpoint経由、どれでもOKです)
2. 呼び出し先
ここが少し分かりづらいところです。結論としては、LambdaがVPC内かVPC外によって、状況が変わってきます。
VPC外のLambda
まず、VPC外のLambdaはネットにつながっているので、特段の設定の必要は無いです。
VPC内のLambda
そして、VPC内のLambdaは(natなどを設置せず)ネットへにつながっていなくても、呼び出される側であれば、問題ないです。これは、公式ドキュメントに明記されているわけでは無いですが、以下を参考をしました。実際に挙動がそうなっていますし、概念として、理解はできるのですが、実際、裏側の仕組みがどのようになっているが、AWSが公開してほしいです。。(私が見逃しているだけだったらすいません!)
呼び出す側である時は、ネットへの接続(natなどの設定)が必要であるので忘れずに!
注意点
AWS SDKでinvokeを実行する際、呼び出し先のLambda名を引数としますが、別アカウントのLambdaを呼び出す際は、名前とせずに、必ずarnとしてください。でないと、どのアカウントかわからず、接続先が見つからないとエラーが出ます。。
arn:aws:lambda:us-west-2:123456789012:function:my-function
arnに含まれている、アカウントIDでルーティングしているみたいですね。(考えてみればそりゃそう。。)
これをネットワークの問題だとずっと思っていて、沼りました笑
すでに、ここら辺の話で有効な記事があると思いますが、自分の備忘録のためにも、書かせていただきました!(当たり前じゃん!って内容だと感じた方、すいません。。)
以上です!最後まで読んでいただきありがとうございました!