はじめに
随分前になりますが、AWS Lambdaでコンテナデプロイがサポートされました。
AWS Lambda now supports container images as a packaging format
今回は、AWS Lambdaにコンテナのイメージをデプロイする方法について紹介します!
対象
- AWS Lambdaの新機能について知りたい人
- コンテナデプロイの流れを知りたい人
YouTube動画
動画で確認したい方は、こちらを利用ください!
*撮影は1ヶ月以上前のものですが、大きく変わったところはありません。
【YouTube動画】実践! Lambdaでコンテナデプロイをする方法!!
コンテナのデプロイ条件
Lambdaに、コンテナデプロイがサポートされましたが、コンテナなら何でも良いという訳ではありません。
AWSが提供しているLambda用のRuntime APIに準拠している必要があり、以下のいずれかの方法でコンテナを作る必要があります。
方法1: AWS提供のベースイメージを使う
方法2: Runtime APIが入っているイメージを使う
以下のサイトから使いたいランタイムを選択して、利用できます。
Runtime support for Lambda container images
具体例
今回はベースイメージを利用して、実際にLambdaにコンテナデプロイしてみます。
まず、簡単なNode.jsのサンプルを確認して、次に実践的なRubyのサンプルを見ていきます。
Node.jsのサンプル
簡単なサンプルを書くとこのようになります。
# ベースイメージの取得
FROM public.ecr.aws/lambda/nodejs:12
# Lambda関数を定義しているapp.jsをLambda実行時のルートディレクトリに置く
COPY app.js ${LAMBDA_TASK_ROOT}
# app.jsのhandler関数を実行
CMD [ "app.handler" ]
Rubyのサンプル
このサンプルはLambdaからMySQLに接続するためのLambda関数を作ります。
コンテナをサポートする前は、native extenstion関連で面倒な手順が必要でしたが、コンテナをサポートしたことで簡単に使えるようになりました。
FROM amazon/aws-lambda-ruby:2.7
WORKDIR ${LAMBDA_TASK_ROOT}
# MySQL関連で依存しているものをインストール
RUN yum install -y mysql-devel gcc-c++ make
COPY . ${LAMBDA_TASK_ROOT}
RUN bundle config --global silence_root_warning 1
RUN bundle config set path 'vendor/bundle'
RUN bundle install
CMD ["app.App::Handler.process"]
ローカルでLambdaを動かす
コンテナ化したことで、ローカルで実際に試すことができます。
9000番ポートを開放して試したい場合は次のようにします。
docker run -p 9000:8080 <image name>
そして、以下のようにPOSTすることで、実際に確認できます。
ここでの、/2015-03-31/functions/function/invocations"
は固定です。
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" \
-d '{"payload":"hello world!"}'
デプロイ
まずはコンテナイメージをAmazon ECRにデプロイする必要があります。
今回は割愛します。以下が詳しいです。
Docker イメージをプッシュする
Lambdaの関数の作成方法を確認すると、コンテナイメージという項目ができているので、そちらを選択して使います。
まとめ
今回はAWS Lambdaにコンテナをデプロイする方法について解説しました。
この記事を通してざっくり理解していただくと、自分で設定する時にスムーズだと思います。
また、AWS Lambdaでコンテナを使った場合は、最初の起動で2 ~ 5秒程度かかってしまいますが、それ以降はスムーズに起動します。
AWS Lambdaの利用の幅が広がる新機能なので、ぜひ遊んでみてください!