コンテナイメージを使用して Lambda 関数を作成する
AWS Lambda ではコンテナイメージをそのままデプロイできる機能があります。
AWS Lambda の新機能 – コンテナイメージのサポート | Amazon Web Services ブログ
というわけで、手順を簡単にまとめてみました。
ソースコードを作成する
なにはともあれ、まずは Lambda 関数にデプロイするソースコードを作成します。
今回は Node.js で作成します。
まず package.json
を作成します。
{
"name": "lambda-container-image-example",
"license": "MIT"
}
npm install
を実行して package-lock.json
を作成しておきます。
# `npm i` でも可
$ npm install
index.js
というファイルを作成し ( ファイル名は任意のもので大丈夫です ) 、 Lambda 関数で実行するハンドラコードを実装します。
イベント内容をそのまま返すだけのシンプルな内容にしておきます。
exports.handler = async (event) => {
return event;
};
コンテナイメージを作成する
Dockerfile を作成する
Dockerfile
を作成します。
今回ベースイメージには AWS が提供しているイメージを使用します。
# 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
参考
Discussion