サイト名変更・お引越しのお知らせ

【Go】Serverless FrameworkでAPI Gateway・Lambdaを作成しAPIを構築する方法を解説

Serverless Frameworkを使ってGo言語でのAPI Gateway+Lambda環境を構築しAPIを作る方法を解説します。

この記事でわかること
  • Serverless Frameworkの基本的な使い方
  • Go言語でLamda関数を作成する方法

補足

本記事内ではAPI GatewayのREST APIではなく、HTTP APIを使っています。

参考: REST API vs HTTP API

バージョン
  • serverless 3.27.0
  • go 1.18.2

補足

serverlessというコマンドは、slsというエイリアスを使って置き換えることもできるので、皆さんのお好きな方を使ってください。

本記事内では、serverlessの方に統一しています。

Serverless Frameworkの準備

まずは、Serverless Frameworkの準備を行います。

パッケージを追加

モグモグさん

npmが使える環境であることを前提で進めます。

$ npm install -g serverless

完了後、次のコマンドでインストールがされているか確認しておきましょう。

$ serverless -v

バージョンが表示されていればOKです!

AWSでIAMユーザーを作成

ドキュメントにある通りIAMユーザーを作成します。

AdministratorAccessの権限が必要なことに注意してください。

モグモグさん

このアカウントで、LambdaやAPI Gatewayの構築や実行が行われます。

この後作成したユーザーをCLIから使うので、ドキュメントを参考にprofileを作成しておきましょう。

[profile serverless-framework]
region = ap-northeast-1
[serverless-framework]
aws_access_key_id = xxx
aws_secret_access_key = xxx

プロジェクトを作成

プロジェクトを作成するために、任意のディレクトリを作成しましょう!

補足

ドキュメントにもある通り、serverlessコマンドを使うとテンプレートを用いてプロジェクトが作成できます。

ただし今回は自分で作成していきます。

$ mkdir go-serverlss-sample

APIを構築

続いてAPIを構築していきましょう。

serverless.ymlを追加

Serverless Frameworkを使う時の設定ファイルであるserverless.ymlを作成します。

ドキュメントはこちらです。

service: go-serverless-sample

frameworkVersion: "3"

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

package:
  patterns:
    - "!./**"
    - ./bin/**

functions:
  hello:
    handler: bin/hello
    events:
      - httpApi:
          path: /hello
          method: get

Goで簡単なAPIを実装してデプロイ

続いてGoで簡単なAPIを実装してデプロイまでしていきます。

go mod init

Module管理のためにinitをしておきます。

$ go mod init go-serverlss-sample

必要なmoduleをインストール

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

/helloエンドポイントを実装

/helloというエンドポイントを実装していきます。

package main

import (
	"bytes"
	"context"
	"encoding/json"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

type Response events.APIGatewayProxyResponse

func Handler(ctx context.Context) (Response, error) {
	var buf bytes.Buffer

	body, err := json.Marshal(map[string]interface{}{
		"message": "hello successfully!",
	})
	if err != nil {
		return Response{StatusCode: 404}, err
	}
	json.HTMLEscape(&buf, body)

	resp := Response{
		StatusCode:      200,
		IsBase64Encoded: false,
		Body:            buf.String(),
		Headers: map[string]string{
			"Content-Type": "application/json",
		},
	}

	return resp, nil
}

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

Makefileを作成

ここは色々な方法がありますが、本記事ではmakeコマンドでビルドやデプロイを行えるようにします

.PHONY: build clean deploy

build:
	env GOARCH=amd64 GOOS=linux go build -ldflags="-s -w" -o bin/hello src/hello/main.go

clean:
	rm -rf ./bin

deploy: clean build
	serverless deploy --verbose --aws-profile [IAMで作成したprofile名]

ビルドができるかどうか確認してみましょう!

$ make build

モグモグさん

binディレクトリの中にhelloができていればOKです!

デプロイもしてみます!

$ make deploy

モグモグさん

ちょっと時間かかりますが、エラーが表示されずに完了すればOKです!

レスポンス

awsコンソールで確認もしくはデプロイが完了したときに表示されるURLにアクセスして、こんな感じで200のレスポンスが表示されていればOKです!

例: https://hogehoge.execute-api.ap-northeast-1.amazonaws.com/hello

ローカルで実行

続いて、ローカルでLambda関数を実行する方法を解説します。

デプロイした関数を実行

ローカルからデプロイした関数を実行するには、invokeを使います。

$ serverless invoke -f hello --aws-profile [your aws profile name]

モグモグさん

実行されてこんなレスポンスが返ってくることが確認できると思います!

{
    "statusCode": 200,
    "headers": {
        "Content-Type": "application/json"
    },
    "multiValueHeaders": null,
    "body": "{\"message\":\"hello successfully!\"}"
}

ローカルで関数を実行

デプロイした関数ではなく、ローカルで実行するには、invoke localを使います。

$ serverless invoke local -f hello

モグモグさん

ローカルで実行されてこんなレスポンスが返ってくることが確認できると思います!

{"statusCode":200,"headers":{"Content-Type":"application/json"},"multiValueHeaders":null,"body":"{\"message\":\"hello successfully!\"}"}

構築した環境を削除

serverless deployで構築した環境を削除するには、removeを使います。

$ serverless remove --aws-profile [your aws profile name]

モグモグさん

今回テストで作成し今後使わない場合は、こちらを実行しておきましょう。

まとめ

Serverless Frameworkを使ってGo言語でのAPI Gateway+Lambda環境を構築しAPIを作る方法を解説しました。

簡単に立ち上げられてAPIを作れるので便利です。

今回は簡単なAPIでしたが、実際に運用するとなると下記のようなことが必要になると思いますので別の記事で解説していきます。

  • StagingやProductionのようにStageの切り替え(環境変数の扱い)
  • 単純なGETだけではなくCRUDの処理
  • corsの設定
  • DBへの接続
  • カスタムドメインの設定

【Go】Serverless FrameworkでStageと環境変数を設定する方法を解説

Serverless FrameworkでAPI GatewayのCORSを設定する方法を解説

Serverless Frameworkでカスタムドメインを設定する方法を解説