コンテナイメージを使用して Go Lambda 関数をデプロイする
Lambda 関数のコードは、コンテナイメージとしてデプロイできます。AWS は、Go 関数のコンテナイメージのビルドに役立つ、次のようなリソースを提供しています。
-
Lambda の AWS ベースイメージ
これらのベースイメージには、Lambda でイメージを実行するために必要な言語ランタイムおよびその他のコンポーネントがプリロードされています。AWS は、コンテナイメージの構築に役立つ各ベースイメージの Dockerfile を提供します。
-
オープンソースのランタイムインターフェイスクライアント (RIC)
コミュニティベースイメージまたはプライベートエンタープライズベースイメージを使用する場合は、ランタイムインターフェイスクライアントをベースイメージに追加して、Lambda と互換性を持たせる必要があります。
-
オープンソースのランタイムインターフェイスエミュレータ (RIE)
Lambda は、関数をローカルでテストするためのランタイムインターフェイスエミュレータを提供します。Lambda の ベースイメージとカスタムランタイムのベースイメージには、RIE が含まれます。その他のベースイメージでは、イメージをローカルでテストするための RIE をダウンロードできます。
コンテナイメージとして定義された関数のワークフローには、次のステップが含まれます。
-
このトピックにリストされているリソースを使ってコンテナイメージを構築します。
-
イメージを Amazon ECR コンテナレジストリにアップロードします。
トピック
AWSGo 用の ベースイメージ
AWS では、次のような Go に使用できるベースイメージを提供しています。
タグ | ランタイム | オペレーティングシステム | Dockerfile | 廃止 |
---|---|---|---|---|
1 |
Go 1.x | Amazon Linux | GitHub 上の Go 1.x 用の Dockerfile |
Amazon ECR リポジトリ: gallery.ecr.aws/lambda/go
Go 用ランタイムインターフェイスクライアント
AWS では、Go 用として、個別のランタイムインターフェイスクライアントは提供していません。aws-lambda-go/lambda
パッケージには、ランタイムインターフェイスの実装が含まれています。
Go:1.x ベースイメージの使用
Go:1.x ベースイメージの使用方法については、Amazon ECR リポジトリの「Go 用の Lambda ベースイメージ
provided.al2
ベースイメージから Go イメージを作成する
Amazon Linux 2 で実行される Go のコンテナイメージを作成するには、provided.al2
ベースイメージを使用します。このベースイメージの詳細については、Amazon ECR Public Gallery の「provided
aws-lambda-go/lambda
パッケージを Go ハンドラーにインクルードします。このパッケージにより、ランタイムインターフェイスクライアントを含む、Go のプログラミングモデルが実装されます。provided.al2
ベースイメージには、ランタイムインターフェイスエミュレータも含まれています。
provided.al2
ベースイメージを使用しながら、Go 関数をビルドしデプロイします。
ここまでの最初の 3 つのステップは、関数のデプロイに .zip ファイルアーカイブを使用する場合と、コンテナイメージを使用する場合に共通です。
-
ローカルマシンで、新しい関数のプロジェクトディレクトリを作成します。
-
プロジェクトフォルダから次のコマンドを実行して、必要な Lambda Go ライブラリをインストールします。
go get github.com/aws/aws-lambda-go
Lambda Go ライブラリの詳細については、「Go による Lambda 関数のビルド」を参照してください。
aws-lambda-go/lambda
パッケージをインクルードしながら、Go ハンドラーコードを作成します。-
テキストエディタを使用して、プロジェクトディレクトリに Dockerfile を作成します。次に、AWS
provided.al2
ベースイメージを使用した Dockerfile の例を示します。FROM public.ecr.aws/lambda/provided:al2 as build # install compiler RUN yum install -y golang RUN go env -w GOPROXY=direct # cache dependencies ADD go.mod go.sum ./ RUN go mod download # build ADD . . RUN go build -o /main # copy artifacts to a clean image FROM public.ecr.aws/lambda/provided:al2 COPY --from=build /main /main ENTRYPOINT [ "/main" ]
-
docker build
コマンドを使用して Docker イメージをビルドします。イメージの名前を入力します。次の例では、イメージにhello-world
という名前を付けています。docker build -t
hello-world
. -
Amazon ECR レジストリに対し、Docker CLI を認証します。
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin123456789012
.dkr.ecr.us-east-1
.amazonaws.com -
リポジトリ名と一致するタグをイメージに付け、
docker push
コマンドを使用してそのイメージを Amazon ECR にデプロイします。docker tag
hello-world
:latest123456789012
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest docker push123456789012
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest
これで、Amazon ECR コンテナイメージがコンテナレジストリに格納されたので、Lambda 関数を作成してイメージをデプロイできます。
代替ベースイメージから Go イメージを作成する
代替のベースイメージからも、Go 用のコンテナイメージを構築できます。次の Dockerfile の例では、ベースイメージとして alpine
FROM alpine as build # install build tools RUN apk add go git RUN go env -w GOPROXY=direct # cache dependencies ADD go.mod go.sum ./ RUN go mod download # build ADD . . RUN go build -o /main # copy artifacts to a clean image FROM alpine COPY --from=build /main /main ENTRYPOINT [ "/main" ]
手順は、provided.al2
のベースイメージの説明と同じですが、もう 1 つの考慮事項があります。イメージに RIE を追加する場合には、docker build
コマンドを実行する前に、次に示すような追加手順を実行する必要があります。RIE を使用してイメージをローカルにテストする方法の詳細については、「Lambda コンテナイメージをローカルでテストする」を参照してください。
イメージに RIE を追加するには、
-
Dockerfile で、ENTRYPOINT 命令を次の内容に置き換えます。
# (Optional) Add Lambda Runtime Interface Emulator and use a script in the ENTRYPOINT for simpler local runs ADD https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie /usr/bin/aws-lambda-rie RUN chmod 755 /usr/bin/aws-lambda-rie COPY entry.sh / RUN chmod 755 /entry.sh ENTRYPOINT [ "/entry.sh" ]
-
テキストエディタを使用して、プロジェクトディレクトリに
entry.sh
という名前で、次の内容のファイルを作成します。#!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/bin/aws-lambda-rie "$@" else exec "$@" fi
イメージに RIE を追加する必要がない場合は、RIE なしでもローカルでテストできます。
イメージに RIE を追加せずにローカルでテストするには、
-
プロジェクトディレクトリから次のコマンドを実行して、GitHub から RIE をダウンロードし、ローカルマシンにインストールします。
mkdir -p ~/.aws-lambda-rie && curl -Lo ~/.aws-lambda-rie/aws-lambda-rie \ https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie \ && chmod +x ~/.aws-lambda-rie/aws-lambda-rie
-
docker run
コマンドを使用して、Lambda イメージの関数を実行します。次の例では、/main
が関数のエントリポイントへのパスとなっています。docker run -d -v ~/.aws-lambda-rie:/aws-lambda --entrypoint /aws-lambda/aws-lambda-rie -p 9000:8080 myfunction:latest /main
このコマンドはイメージをコンテナとして実行し、ローカルの
localhost:9000/2015-03-31/functions/function/invocations
でエンドポイントを起動します。 -
curl
コマンドを使用して、次のエンドポイントにイベントをポストします。curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
このコマンドは、コンテナイメージで実行されている 関数を呼び出し、応答を返します。
これで、Amazon ECR コンテナイメージがコンテナレジストリに格納されたので、Lambda 関数を作成してイメージをデプロイできます。
コンテナイメージのデプロイ
新しい関数の場合、関数を作成する際に Go イメージをデプロイします。既存の関数では、コンテナーイメージを再ビルドする場合は、関数コードの更新を行うことでイメージを再度デプロイする必要があります。