Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

reInvent2020で発表されたLambdaContainerをCDKで実装してみる

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 のバージョンを表示させてみます。

docker/app.py
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上での実装

公式ドキュメントを参考に実装していきます。

app.py
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

デプロイを開始すると、いつものようにリソースを作成するか聞かれます。
スクリーンショット 2020-12-03 23.55.11.png

yを押して進むと、 docker の build が始まり、
スクリーンショット 2020-12-03 23.56.13.png

ECRに PUSH されて、 CDK のデプロイが完了しました。

スクリーンショット 2020-12-04 0.14.39.png

2.6 確認

実際に Lambda の画面にて確認してみましょう。
入力したeventの値がそのまま返ってきていたり、pandas.__version__が表示されており、
docker/app.pyで設定した通りに動作していることがわかりますね。

スクリーンショット 2020-12-04 0.03.25.png

また、実行してみたところ、初回こそ起動にちょっと時間(3秒程度)がかかりましたが、
2回目以降は即時に結果が返ってきました。

ECRの画面を確認するとrepository_nameにて記述した名前で登録されていました。
スクリーンショット 2020-12-04 0.17.25.png

2.7 リソースの削除

最後に、作成したリソースは以下のコマンドで削除するようにしましょう。

$ cdk destroy

ただし、ECRのリポジトリまでは削除されないので、不要な場合は手動で削除するようにしてください。

3. おわりに

Lambda は Lambda なので実行時間などの観点から利用どころを見極める必要はあります。
ただ、Lambda でもコンテナを利用できるようになったことで、他のコンテナのサービスに柔軟に移行できるようになるのは非常に嬉しいですね。

どちらかというと、今までは Lambda 用に独自のデプロイ環境などを用意する必要がありましたが、
それがなくなったことでより多くの人が触りやすくなったと思います。

これから、reInventでは4つの KeyNote もありますし、2020年もまだまだ楽しめますね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away