AWS Lambdaでコンテナデプロイする方法


はじめに

随分前になりますが、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の利用の幅が広がる新機能なので、ぜひ遊んでみてください!