1. はじめに
日本時間の2020年12月2日午前1時ごろから始まった1つ目の KeyNote で、
突如LambdaContainer
が発表されました(参考)。
私も、この発表はリアルタイムでみていて「うぉぉぉぉ」と心の中で雄叫びを上げました。
コンソールなどではすでに利用できるみたいです。
また、驚いたのが、AWS CDKでも、LambdaContainer
の発表から数時間後には
バージョンが1.76.0
に上がり、その際にLambdaContainer
がサポートされたことです。
2. 実装
CDK での実装に関するドキュメントは公式にて提供されており、これまでのデプロイと大差なく利用できそうです。
また、 DockerFile はDevelopers.IOさんの記事を参考にしました。
2.1 ファイル構成
CDK をデプロイするファイル構成は以下の通りです。
lambda-container/
├── app.py
├── cdk.json
└── docker/
├── Dockerfile
├── app.py
└── requirements.txt
2.2 Lambdaのメイン関数
特に意味のない Lambda の関数です。
requirements.txt にてインストールしたパッケージが正しく利用できるか、
pandas のバージョンを表示させてみます。
import pandas as pd
def lambda_handler(event, _):
print(pd.__version__)
return event
2.3 Dockerfile
Lambda に載せる Dockerfile の例は以下の通りです。
(こちらの Dockerfile は参考の記事をそのまま利用させてもらいました)
FROM public.ecr.aws/lambda/python:3.8
COPY app.py requirements.txt ./
RUN python3.8 -m pip install -r requirements.txt -t .
# ここのコマンドは
# app.pyのスクリプトにある、lambda_handlerという関数をエントリポイントにする、
# という意味です。
CMD ["app.lambda_handler"]
他の Python のバージョンはここを参考にしてください。
(2.7
とかも一応利用できるみたいですね)
2.4 CDK上での実装
公式ドキュメントを参考に実装していきます。
from aws_cdk import (
aws_lambda as lambda_,
core,
)
class LambdaContainer(core.Stack):
def __init__(self, app: core.App, _id: str):
super().__init__(scope=app, id=_id)
_ = lambda_.DockerImageFunction(
scope=self,
id="container_function",
code=lambda_.DockerImageCode.from_image_asset(
directory="docker",
repository_name="lambda_container_example"
)
)
def main():
app = core.App()
LambdaContainer(app, "LambdaContainer")
app.synth()
if __name__ == "__main__":
main()
2.5 デプロイ
ここまでできたら、CDK の app.py があるディレクトリにて、以下のコマンドを実行すればデプロイ可能です。
# pythonコードが正しいか確認
# 構文エラーがなければ、デプロイ可能なStackが表示されます。
$ cdk ls
LambdaContainer
# 実際にdeploy
$ cdk deploy
デプロイを開始すると、いつものようにリソースを作成するか聞かれます。
y
を押して進むと、 docker の build が始まり、
ECR
に PUSH されて、 CDK のデプロイが完了しました。
2.6 確認
実際に Lambda の画面にて確認してみましょう。
入力したevent
の値がそのまま返ってきていたり、pandas.__version__
が表示されており、
docker/app.py
で設定した通りに動作していることがわかりますね。
また、実行してみたところ、初回こそ起動にちょっと時間(3秒程度)がかかりましたが、
2回目以降は即時に結果が返ってきました。
ECR
の画面を確認するとrepository_name
にて記述した名前で登録されていました。
2.7 リソースの削除
最後に、作成したリソースは以下のコマンドで削除するようにしましょう。
$ cdk destroy
ただし、ECR
のリポジトリまでは削除されないので、不要な場合は手動で削除するようにしてください。
3. おわりに
Lambda は Lambda なので実行時間などの観点から利用どころを見極める必要はあります。
ただ、Lambda でもコンテナを利用できるようになったことで、他のコンテナのサービスに柔軟に移行できるようになるのは非常に嬉しいですね。
どちらかというと、今までは Lambda 用に独自のデプロイ環境などを用意する必要がありましたが、
それがなくなったことでより多くの人が触りやすくなったと思います。
これから、reInvent
では4つの KeyNote もありますし、2020年もまだまだ楽しめますね。