コンテナイメージを使用して Go Lambda 関数をデプロイする - AWS Lambda

コンテナイメージを使用して Go Lambda 関数をデプロイする

Lambda 関数のコードは、コンテナイメージとしてデプロイできます。AWSでは、Go 関数のコンテナイメージのビルドに役立つ、次のようなリソースを提供しています。

  • Lambda の AWS ベースイメージ

    これらのベースイメージには、Lambda でイメージを実行するために必要な言語ランタイムおよびその他のコンポーネントがあらかじめロードされています。AWS は、コンテナイメージの構築に役立つ各ベースイメージの Dockerfile を提供します。

  • オープンソースのランタイムインターフェイスクライアント

    コミュニティまたはプライベートエンタープライズベースイメージを使用する場合は、ベースイメージにランタイムインターフェイスクライアントを追加して、Lambda と互換性を持たせるようにします。

Go 用の AWS ベースイメージ

AWS では、次のような Go に使用できるベースイメージを提供しています。

タグ ランタイム オペレーティングシステム Dockerfile

1

Go 1.x Amazon Linux 2018.03 GitHub 上の Go 1.x 用の Dockerfile

Docker Hub リポジトリ: amazon/aws-lambda-go

Amazon ECR リポジトリ: gallery.ecr.aws/lambda/go

Go 用ランタイムインターフェイスクライアント

AWS では、Go 用として、個別のランタイムインターフェイスクライアントは提供していません。aws-lambda-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 ファイルアーカイブを使用する場合と、コンテナイメージを使用する場合に共通です。

  1. ローカルマシンで、新しい関数のプロジェクトディレクトリを作成します。

  2. プロジェクトフォルダから次のコマンドを実行して、必要な Lambda Go ライブラリをインストールします。

    go get github.com/aws/aws-lambda-go

    Lambda Go ライブラリの詳細については、「Go による Lambda 関数のビルド」を参照してください。

  3. aws-lambda-go/lambda パッケージをインクルードしながら、Go ハンドラーコードを作成します。

  4. テキストエディタを使用して、プロジェクトディレクトリに 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" ]
  5. docker build コマンドを使用して Docker イメージをビルドします。イメージの名前を入力します。次の例では、イメージに hello-world という名前を付けています。

    docker build -t hello-world .
  6. Amazon ECR レジストリに対し、Docker CLI を認証します。

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
  7. リポジトリ名と一致するタグをイメージに付け、docker push コマンドを使用してそのイメージを Amazon ECR にデプロイします。

    docker tag hello-world:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest

代替ベースイメージを使用した Go のデプロイ

代替のベースイメージからも、Go 用のコンテナイメージを構築できます。次の Dockerfile の例では、ベースイメージとして alpine を使用しています。

FROM alpine as build # install build tools RUN apk add go git # cache dependencies ADD go.mod go.sum ./ RUN go mod download GOPROXY=direct # 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 を追加するには、

  1. 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" ]
  2. テキストエディタを使用して、プロジェクトディレクトリに entry.sh という名前で、次の内容のファイルを作成します。

    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/bin/aws-lambda-rie "$@" else exec "$@" fi

イメージに RIE を追加する必要がない場合は、RIE なしでもローカルでテストできます。

イメージに RIE を追加せずにローカルでテストするには、

  1. プロジェクトディレクトリから次のコマンドを実行して、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
  2. 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 でローカルに起動されます。

  3. curl コマンドを使用して、次のエンドポイントにイベントをポストします。

    curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    このコマンドは、コンテナイメージで実行されている関数を呼び出し、応答を返します。

RIE を使用してイメージをローカルにテストする方法の詳細については、「Lambda コンテナイメージをローカルでテストする」を参照してください。