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

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

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

  • Lambda の AWS ベースイメージ

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

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

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

  • オープンソースのランタイムインターフェイスエミュレータ (RIE)

    Lambda は、関数をローカルでテストするためのランタイムインターフェイスエミュレータを提供します。Lambda の ベースイメージとカスタムランタイムのベースイメージには、RIE が含まれます。その他のベースイメージでは、イメージをローカルでテストするための RIE をダウンロードできます。

コンテナイメージとして定義された関数のワークフローには、次のステップが含まれます。

  1. このトピックにリストされているリソースを使ってコンテナイメージを構築します。

  2. イメージを Amazon ECR コンテナレジストリにアップロードします。

  3. Lambda 関数を作成するか、または関数コードを更新して、イメージを既存の関数にデプロイします。

AWSGo 用の ベースイメージ

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

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

1

Go 1.x Amazon Linux 2018.03 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 ファイルアーカイブを使用する場合と、コンテナイメージを使用する場合に共通です。

  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

これで、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 を追加するには、

  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 '{}'

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

これで、Amazon ECR コンテナイメージがコンテナレジストリに格納されたので、Lambda 関数を作成してイメージをデプロイできます。

コンテナイメージのデプロイ

新しい関数の場合、関数を作成する際に Go イメージをデプロイします。既存の関数では、コンテナーイメージを再ビルドする場合は、関数コードの更新を行うことでイメージを再度デプロイする必要があります。