はじめに
今回は以下のアップデートを見てみます。
Lambdaがコンテナイメージを異なるAWSアカウントのAmazon ECRから使えるようになりました。
これまではLambda関数と同じアカウントのECRにイメージを置く必要がありましたが、今回のアップデートによりアカウントを跨いでイメージを利用できるようになった模様。
早速やってみます!
手順は以下です。
- 任意のコンテナイメージの作成
- ECRリポジトリの作成、プッシュ
- ECRリポジトリの許可設定
- 別アカウントでLambda関数の設定
1. 任意のコンテナイメージの作成
今回はPythonで適当な応答を返すコードを利用しました。
dockerfileはLambda専用の書き方で作成します。
あとはcross-account-ecr-lambda
の名前でコンテナイメージをビルドしておきます。
# コンテナイメージのビルド
docker build --provenance=false --platform linux/amd64 -t cross-account-ecr-lambda .
なお、今回はMacBookを使っているので、--provenance=false --platform linux/amd64
のオプションを指定してします。
ここらは以下で紹介していますので参考にしてみてください!
2. ECRリポジトリの作成、プッシュ
次に以下のコマンドで、ECRのリポジトリを作成したり、先程ビルドしたコンテナイメージをプッシュします。
# ECRリポジトリ作成
aws ecr create-repository --repository-name cross-account-ecr-lambda
# ECRにログイン
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com
# タグ付け
docker tag cross-account-ecr-lambda:latest <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/cross-account-ecr-lambda:latest
# プッシュ
docker push <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/cross-account-ecr-lambda:latest
3. ECRリポジトリの許可設定
ここからクロスアカウント用の設定を実施していきます。
マネコンから先ほど作った、リポジトリのPermissions
を選択し、編集
->ポリシーJSONの編集
にてポリシーの設定を行います。
設定するポリシーは以下です。
差分の箇所で、Lambdaを作成するアカウントおよび、Lambda自身に許可を付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CrossAccountPermission",
"Effect": "Allow",
"Principal": {
+ "AWS": "arn:aws:iam:: <Lambdaを作成する側のaccount-id>:root"
},
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
]
},
{
"Sid": "LambdaECRImageCrossAccountRetrievalPolicy",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
],
"Condition": {
"StringLike": {
+ "aws:sourceArn": "arn:aws:lambda:ap-northeast-1: <Lambdaを作成する側のaccount-id>:function:*"
}
}
}
]
}
ポリシーが間違ってなければ、確認画面が出るので保存
を選択して完了。
4. 別アカウントでLambda関数の設定
ここまでで設定はできたので、先ほど作ったコンテナイメージを使って、別アカウントでLambdaを作成してみます。
コンテナイメージURIは <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/cross-account-ecr-lambda:latest
になります。
無事作成できたらテストしてみて、きちんと応答が返っていることが確認できました!
最後に
クロスアカウントでコンテナイメージの運用がかなり楽になりそうなアップデートでした!
コンテナを使ったLambdaって実際どれくらい使われてるんだろう・・・?