search
LoginSignup
3

posted at

updated at

Organization

DockerのLambdaコンテナイメージをgolangで動かしてみた

AWSで公開されているgolangのLambdaコンテナイメージを動かしてみました。

パッケージの構成

├── docker
│   └── lambda-go-test
│       └── Dockerfile
├── docker-compose.yml
└── lambda
    ├── go.mod
    ├── go.sum
    ├── main
    ├── main.go
    └── pkg

Dockerファイル作成

こちらを参考にDockerファイル等を作成。

FROM public.ecr.aws/lambda/go:1

# Copy function code
COPY ../../lambda ${LAMBDA_TASK_ROOT}

WORKDIR ${LAMBDA_TASK_ROOT}
# golangをinstall
RUN yum install -y golang

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "main" ]

docker-compose.ymlは以下のように作りました。

version: '3'
services:
    lambda-go-test:
        container_name: lambda-go-test
        build:
            context: .
            dockerfile: ./docker/lambda-go-test/Dockerfile
        volumes:
            - ./lambda:/var/task # ${LAMBDA_TASK_ROOT}は/var/taskだったので/var/taskを指定.
        ports:
            - 9000:8080

golangファイル作成

package main

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

type Request struct {
	FirstName string `json:"first_name"`
	LastName string `json:"last_name"`
}

func requestHandler(ctx context.Context, req Request) (string, error) {
	return fmt.Sprintf(
		"Hello %s %s",
		req.LastName,
		req.FirstName,
	), nil
}

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

dockerをbuildして立ち上げ

$ docker-compose build
$ docker-compose up -d

# 初回なのでdockerコンテナ内に入って「go mod init」と「go get」
$ docker exec -it lambda-go-test bash

# ----- コンテナ内 -----
bash# pwd
/var/task

# go mod init
bash# go mod init lambda-go-test

# golang内で利用しているパッケージをgo get
bash# go get github.com/aws/aws-lambda-go/lambda

動かしてみる

$ curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"first_name":"taro", "last_name":"lambda"}'
"Hello lambda taro"

初回叩いた時は↓のエラーが返ってきたけどdocker再立ち上げしたら動いた... なんだったんでしょう。

{"errorMessage":"fork/exec /var/task/main: no such file or directory","errorType":"PathError"}

最後に

今回はここまでにします。
次回はもっと色々試してみた結果をこちらに書いていければと思ってます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3