Serverless Framework (go) で API をデプロイするまで

ゴール

Serverless Framework (go) のプロジェクトを作って API Gateway 経由でレスポンスが得られるところまでです。
Lambda をデプロイするまでは情報があったのですが、API Gateway まで繋げるところの解説がすぐに見つからなかったのでここに書いておきます。

go のインストール

これは必要に応じて実施する感じですね。 私は Mac を使用しているので brew で anyenv インストールからの goenv で 1.13.5 をインストールしました。

Serverless Framework のインストール、プロジェクトテンプレートの作成

Serverless Framework(Go) でHello worldしてみる - Qiita

上記のページを参考にさせていただきました。 プロジェクト内に Serverless Framework を入れておきたかったので以下を実行しておきました。

nom init
npm install --save-dev serverless

nom build でビルドと npm run sls が実行できるように package.json を編集しておきます。

"scripts": {
    "build": "GOOS=linux go build -o bin/main",
    "sls": "./node_modules/.bin/sls"
}

main.go の編集

API Gateway の Lambda proxy integration に対応するために適当に書き換えます。

package main

import (
    "encoding/json"
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
)

func Handler() (events.APIGatewayProxyResponse, error) {
    body := map[string]interface{}{
        "Message": "Go Serverless v1.0! Your function executed successfully!",
    }
    s, _ := json.Marshal(body)
    return events.APIGatewayProxyResponse{Body: string(s), StatusCode: 200}, nil
}

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

必要なパッケージのインストール

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

ビルド

以下のコマンドで bin/main を作ります。

npm run build

serverless.yml の編集

Lambda と API Gateway をデプロイするために適当に書き換えます。

service: hello-go-lambda

provider:
  name: aws
  runtime: go1.x
  stage: dev
  region: ap-northeast-1

package:
  exclude:
    - ./**
  include:
    - ./bin/**

functions:
  hello:
    handler: bin/main
    events:
      - http:
          path: hello
          method: get

デプロイ

以下のコマンドで Lambda と API Gateway をデプロイします。

npm run sls deploy

動作確認

API Gateway の Management Console のテスト機能から動作確認してみます。

f:id:semnil:20191227232127p:plain

{
  "Message": "Go Serverless v1.0! Your function executed successfully!"
}

レスポンスを得られることが確認できました。

作成したプロジェクト

ここに置いておきます。

github.com