コンテナイメージでLambdaを使う実験メモ
とてもワクワクする発表だったので、実際に使ってみたくなった。
10GBまでのイメージを使えるようなので、50MBの上限がなくなったと言ってもよいのかな。
サンプルコードにあった amazon/aws-lambda-nodejs:12
というのをベースイメージに使うと Node.js で手軽に試せそう。
FROM amazon/aws-lambda-nodejs:12
COPY app.js package*.json ./
RUN npm install
CMD [ "app.lambdaHandler" ]
新しく発表された ECR Public を使う場合は public.ecr.aws/lambda/nodejs:12
っぽい。
ソースコード
ソースコードを置くGist
https://gist.github.com/hyiromori/853894f178b463bb88224f104449f5e0
ECRの作成&Dockerイメージのプッシュ (Image & Repository Name: example-container-image-on-lambda
)
$ aws ecr create-repository --repository-name example-container-image-on-lambda --image-scanning-configuration scanOnPush=true
$ docker tag container-image-on-lambda:latest 123412341234.dkr.ecr.us-east-1.amazonaws.com/example-container-image-on-lambda:latest
$ aws ecr get-login-password | docker login --username AWS --password-stdin 123412341234.dkr.ecr.sa-east-1.amazonaws.com
$ docker push 123412341234.dkr.ecr.us-east-1.amazonaws.com/example-container-image-on-lambda:latest
AWSコンソールで関数の作成
Lambda の実行
$ aws lambda invoke --function-name example-container-image-on-lambda result.json
$ cat result.json | jq
{
"version": "v1",
"uuid": "c444cb5c-a160-490f-bddf-09101b5f3010"
}
ソースを更新したら、Docker push して「新しいイメージをデプロイ」すれば更新できた。
latest
タグを常に見てくれれば楽といえば楽なんだけど、勝手に変更されるのはそれはそれで怖いか。
AWS CLI は v2(の最新?)で対応しているようだ。
$ aws --version
aws-cli/2.1.6 Python/3.7.3 Linux/5.4.39-linuxkit docker/x86_64.amzn.2 prompt/off
コンテナイメージのアップデートは以下のコマンドでできる。
$ aws lambda update-function-code --function-name example-container-image-on-lambda --image-uri 123412341234.dkr.ecr.us-east-1.amazonaws.com/example-container-image-on-lambda:latest
2.1.5
か 2.1.6
から使えるようになったようだ。
手元のAWS CLIのバージョン(2.1.4)だとLambda作成時にコンテナイメージを指定できないようなので、
ちゃんと確かめたら 2.1.6
からのようだ。
$ docker run --rm -it "amazon/aws-cli:2.1.6" lambda update-function-code help
...
--image-uri (string)
URI of a container image in the Amazon ECR registry.
...
$ docker run --rm -it "amazon/aws-cli:2.1.5" lambda update-function-code help
...
コンテナイメージを使っても、タイムアウトやメモリの制限は同じっぽい。
メモリ上限が10GBになったのも今回のタイミングらしい。
[アップデート]Lambdaのメモリ上限が10G、vCPUの上限が6に拡張されました!! #reinvent | Developers.IO
ついでに課金単位も100msごとの課金から1msごとの課金に変わったらしくて、これはとても嬉しい!
特にコンテナ周りの話がまとまってた。
Lambda でコンテナを実行する
Runtime interface clients (RIE)
これに対応している必要があるのか。
試した時のベースイメージは既に対応していたので特に対応は要らなかったけど、独自のイメージを使う場合は対応が必要そう。
発表されている記事にもリンクされていた。
コンテナイメージが大きい場合にコールドスタートが遅くなるかどうかを検証した記事。
結論として、コンテナイメージが大きくてもコールドスタートはほとんど遅くならない。
メモリの割当と比例して利用可能なCPUクレジットが増えた分、微妙に早くなっているように見えます。正直大量にエラーが発生することを予想していたのですが、問題なく10Gのコンテナイメージが999並列で起動できました。裏側のアーキテクチャは一体どうなってるんでしょうか?すごいですね。
本当にどうなっているんだろう・・・。
このすごい仕組みを安く提供してくれているので、規模の経済を感じる・・・。