🚴

Go+Lambda+Dockerのローカル環境を構築する

2023/07/13に公開

サンプルコード

https://github.com/ryohei-takagi/go-lambda-docker

概要

Lambda開発の初期の頃はランタイムによる実装が主流でしたが、Dockerによる開発が増えてきました。
当記事ではローカル開発におけるLambda関数の構築方法をおさらいします。

Goサンプル

Goのコードは以下としておきます。

package main

import (
	"context"
	"github.com/aws/aws-lambda-go/lambda"
	"log"
)

func Handler(ctx context.Context) error {
	log.Println("Hello World.")
	return nil
}

func main() {
	lambda.Start(Handler)
}

Dockerfile

  • Goビルド用Dockerfile
FROM golang:1.20.5-alpine
  • Lambda実行用Dockerfile
FROM public.ecr.aws/lambda/provided:al2

COPY ./docker/lambda/entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]
CMD ["/main"]
  • Lambda実行用entorypoint.sh
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
  exec /usr/local/bin/aws-lambda-rie "$@"
else
  exec "$@"
fi

上記の定義を合わせてcomposeにまとめたものが以下となります。

version: '3.8'
services:
  go-lambda-docker-lambda:
    build:
      context: .
      dockerfile: ./docker/lambda/Dockerfile
    image: go-lambda-docker-lambda
    container_name: go-lambda-docker-lambda
    volumes:
      - $PWD/.bin/sample:/main
  go-lambda-docker-go:
    build:
      context: .
      dockerfile: ./docker/go/Dockerfile
    image: go-lambda-docker-go
    container_name: go-lambda-docker-go
    working_dir: /workspace
    volumes:
      - $PWD:/workspace/

実行手順

続いて実行手順を紹介しましょう。

  1. GoのコンテナでGoをビルドし、./.bin/sampleに配置します。
$ docker compose run --rm go-lambda-docker-go go build -o ./.bin/sample ./cmd/sample/main.go
  1. docker-compose.yamlの以下の箇所に注目してください。
    volumes:
      - $PWD/.bin/sample:/main

Goのアプリケーションを/mainにマウントします。
DockerfileでCMD ["/main"]をしているのでこれで実行できます。

  1. ポート番号を指定し、実行します。
$ docker compose run -p 8080:8080 --rm go-lambda-docker-lambda
[+] Building 0.0s (0/0)
13 Jul 2023 07:38:22,637 [INFO] (rapid) exec '/main' (cwd=/var/task, handler=)
  1. Lambda実行用エンドポイントを指定します。
$ curl -i -XPOST http://localhost:8080/2015-03-31/functions/function/invocations -d '{}'
HTTP/1.1 200 OK
Date: Thu, 13 Jul 2023 07:38:34 GMT
Content-Length: 4
Content-Type: text/plain; charset=utf-8

null
  1. Dockerのコンテナに以下のログが流れていれば成功です。
2023/07/13 07:38:34 Hello World.

Discussion