https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images-create.html#images-create-from-alt
記事 第一回 コンテナ Lambda の”いろは”、AWS CLI でのデプロイに挑戦 ! を参考に
windows10 で AWS Lambda 関数を Docker コンテナを使ってビルド & デプロイ する方法を書きました
AWS Lambda 関数を Docker コンテナを使ってビルド & デプロイ するには以下の3ステップが必要です
1.Docker イメージを作成する 2.Docker イメージを Amazon ECR リポジトリ にプッシュする 3.Lambda関数に Amazon ECR リポジトリ(の Docker イメージ) から ビルドする
この記事は Windows10 上で Docker を用いて操作しています。
この記事の作業はローカル環境に Docker Desktop がインストールされていることを前提で進めます。インストールされていない場合は、インストールしてから進めてください。
Amazon CLI https://aws.amazon.com/jp/cli/
aws configure (初期化) が済んでいること
> aws configure
AWS Access Key ID [None]: ATI********CS
AWS Secret Access Key [None]: ***erg***sdfg***bs1sderg**
Default region name [None]: ap-northeast-1
Default output format [None]: json
作業するフォルダを決めて 以下の2つのテキストファイルを作成しましょう
それぞれのファイルの中身は以下の通りとします。
import json
def handler(event, context):
return {
"statusCode": 200,
"body": json.dumps(
{
"message": "hello world",
}
),
}
FROM public.ecr.aws/lambda/python:3.8
COPY app.py ./
CMD ["app.handler"]
解説 FROM 命令で public.ecr.aws/lambda/python:3.8 と ECR の AWS 公式の公開イメージを指定していますが、amazon/aws-lambda-python:3.8 のように docker hub のイメージを参照することも可能です。 COPY コマンドでローカルに配置されている Lambda 関数本体である app.py ファイルをイメージにコピーしています。そして CMD で Lambda 関数のハンドラーを渡しています。
Dockerfile を元にビルドしてみましょう。
コマンド docker build -t func1 .
を実行します。
> docker build -t func1 .
[+] Building 19.2s (7/7) FINISHED
=> [internal] load build definition from Dockerfile
=> => naming to docker.io/library/func1
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
ビルド成功しました
docker run -it func1:latest
2021.08.22 現在 import gmsh に失敗するので この issue に基づいて
https://gitlab.onelab.info/gmsh/gmsh/-/issues/1023
下記を実行
import sys
sys.path.append('/usr/local/lib/python3.8/site-packages/gmsh-4.8.4-Linux64-sdk/lib')
さて、ここから Amazon ECR に今回作成する Lambda 関数のイメージ用のリポジトリを作成します。
Amazon ECR とは Elastic Container Registry の略で Dockerのコンテナイメージを保存しておくためのレジストリで、 Dockerコンテナイメージを保存・管理・デプロイが簡単に出来ます。
ECR 上にリポジトリが作成されたら、リポジトリの URI を含めたタグを付与します。
docker tag func1:latest 533291615220.dkr.ecr.ap-northeast-1.amazonaws.com/func1:latest
Docker Desktop の Images に追加されます。
> aws ecr get-login-password | docker login --username AWS --password-stdin 533291615220.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded
リポジトリに push しましょう。
PS> docker push 533291615220.dkr.ecr.ap-northeast-1.amazonaws.com/func1:latest
The push refers to repository [533291615220.dkr.ecr.ap-northeast-1.amazonaws.com/func1]
29fe8a4ae381: Pushed
20b4eff3dd4d: Pushing 68.11MB/92.13MB
11284767d41d: Pushing 87.48MB/199.7MB
d6fa53d6caa6: Pushed
b09e76f63d5d: Pushed
0acabcf564c7: Pushed
f2342b1247df: Pushing 125.9MB/294.9MB
latest: digest: sha256:123*************************************789
push が完了すると、ダイジェストが発行されるので、覚えておく
AWS コンソールで確認すると cocker イメージが Amaxon ECR リポジトリ にアップロードされたのが確認できる
ここから、Lambda 関数をコンテナイメージを利用して作成していきますが、AWS Lambda のコンテナサポートで、—package-type を指定できるようになりました。
できました 今回の Lambda関数名 は, docker_test としました
そしていよいよ実行することができます。作成された関数を実行してみましょう。
> aws lambda invoke --function-name docer_test output ; cat output
正常に返ってきました!!