🔥

コンテナイメージを使用して Lambda 関数を作成する

2021/03/21に公開

AWS Lambda ではコンテナイメージをそのままデプロイできる機能があります。

AWS Lambda の新機能 – コンテナイメージのサポート | Amazon Web Services ブログ

というわけで、手順を簡単にまとめてみました。

ソースコードを作成する

なにはともあれ、まずは Lambda 関数にデプロイするソースコードを作成します。
今回は Node.js で作成します。

まず package.json を作成します。

package.json
{
  "name": "lambda-container-image-example",
  "license": "MIT"
}

npm install を実行して package-lock.json を作成しておきます。

# `npm i` でも可
$ npm install

index.js というファイルを作成し ( ファイル名は任意のもので大丈夫です ) 、 Lambda 関数で実行するハンドラコードを実装します。
イベント内容をそのまま返すだけのシンプルな内容にしておきます。

index.js
exports.handler = async (event) => {
  return event;
};

コンテナイメージを作成する

Dockerfile を作成する

Dockerfile を作成します。
今回ベースイメージには AWS が提供しているイメージを使用します。

Dockerfile
# AWS ベースイメージを使用
FROM public.ecr.aws/lambda/nodejs:14

# ソースコードを関数のルートディレクトリにコピーします。
# 関数のルートディレクトリは `LAMBDA_TASK_ROOT` 環境変数を上書きすることで変更することができます ( デフォルトは `/var/task` ) 。
COPY index.js package.json package-lock.json /var/task/
RUN npm install

# CMD にハンドラを設定します。
# Node.js の場合は `{ファイル名(拡張子なし)}.{関数名}` のように指定します。
# 今回は `index.js` の `handler` 関数をハンドラとして用意しているので以下のようになります。
CMD ["index.handler"]

ローカルで実行してみる

ランタイムインターフェイスエミュレータを使用して関数をローカルで実行することができます。

まずコンテナイメージをビルドします。

$ docker build -t lambda-container-image-example .

docker run でコンテナを起動します。

$ docker run --rm -p 8080:8080 lambda-container-image-example:latest

localhost:8080/2015-03-31/functions/function/invocations に POST リクエストを送信することで関数を実行することができます。

$ curl -X POST "http://localhost:8080/2015-03-31/functions/function/invocations" -d '{"key":"value"}'
{"key":"value"}

ECR リポジトリにイメージをプッシュする

ECR リポジトリを作成する

マネジメントコンソール からリポジトリを作成をクリックし、 ECR リポジトリを作成します。
今回リポジトリ名は lambda-container-image-example にします。
それ以外はデフォルト設定のままで リポジトリを作成 をクリックします。

イメージをプッシュする

ローカルでイメージをビルドして ECR リポジトリにプッシュします。
ビルド ~ プッシュするためのコマンドはマネジメントコンソールでリポジトリを選択した状態で プッシュコマンドの表示 をクリックして確認することができます。


実際のコマンドは以下のようになります。

# ログイン
$ aws ecr get-login-password --region {リージョン} | docker login --username AWS --password-stdin {アカウントID}.dkr.ecr.{リージョン}.amazonaws.com

# コンテナイメージをビルド
$ docker build -t lambda-container-image-example .

# イメージにタグをつける
$ docker tag lambda-container-image-example:latest {アカウントID}.dkr.ecr.{リージョン}.amazonaws.com/lambda-container-image-example:latest

# ECR にイメージをプッシュ
$ docker push {アカウントID}.dkr.ecr.{リージョン}.amazonaws.com/lambda-container-image-example:latest

コンテナイメージを使用して Lambda 関数を作成する

マネジメントコンソール から関数を作成します。

オプションでコンテナイメージを選択します。
関数名は今回は lambda-container-image-example にしておきます。
コンテナイメージ URI には先程 ECR リポジトリにプッシュしたコンテナイメージの URI を入力します。
今回は {アカウントID}.dkr.ecr.{リージョン}.amazonaws.com/lambda-container-image-example:latest のようになります。

これでコンテナイメージを使用した Lambda 関数の作成が完了しました。

GitHub

https://github.com/koki-develop/lambda-container-image-example

参考

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-images.html

Discussion