Serverless Frameworkを使ってGo言語でのAPI Gateway+Lambda環境を構築しAPIを作る方法を解説します。
- Serverless Frameworkの基本的な使い方
- Go言語でLamda関数を作成する方法
- 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
プロジェクトを作成
プロジェクトを作成するために、任意のディレクトリを作成しましょう!
$ 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と環境変数を設定する方法を解説