ServerlessFrameworkでGoのアプリをデプロイする

NO IMAGE

最近はCDKなどの他のツールに押され気味のServerlessFrameworkですが、API Gateway+Lambda+ DynamoDBといった構成の場合、記述のシンプルさ故、ServerlessFrameworkを選択するケースはまだ多い印象です。今回は、GoのアプリケーションをServerlessFrameworkで構築する方法について記載します。

ServerlessFrameworkで使用できるGoのテンプレートには以下の3つがあります。

  • aws-go
  • aws-go-dep
  • aws-go-mod

Goではバージョン1.11から従来のGOPATHモードに加えてモジュールモードが用意されており、今後はこのモードが主流となることから、ここではaws-go-modを選択します。ちなみに、モジュールモードを使用すると、ソースコードを$GOPATH以外の任意のディレクトリに配置できるなどのメリットがあります。他にもメリットはありますが、ここでは割愛します(「GOPATHモード モジュールモード」などで検索いただければと思います)。

以降、このテンプレートを使って実際のAWS環境にデプロイするまでの流れを記載します。
基本的には、公式ドキュメントに記載の通りですが、このまま実行してもエラーになる箇所があるので、その点についても補足していきます。

まずは、以下コマンドでテンプレートを作成します(slsコマンドはインストール済みの前提)。

sls create --template aws-go-mod --path myService

myServiceディレクトリ に入ると、諸々のファイルが生成されていることが確認できます。

続いて、以下コマンドでソースコードをビルドします。

make build

すると、以下のようなエラーが発生します。

chmod u+x gomod.sh
./gomod.sh
export GO111MODULE=on
env GOOS=linux go build -ldflags="-s -w" -o bin/hello hello/main.go
go: github.com/aws/aws-lambda-go@v1.6.0: missing go.sum entry; to add it:
        go mod download github.com/aws/aws-lambda-go
make: *** [build] Error 1

go.sumがないとのこと。調べてみると、モジュールモードではgo.modとgo.sumでパッケージの管理をするのですが、1.16以降、go.mod に含まれている依存パッケージのうち、go.sum に含まれていないものが1つでもあるとビルドが通らない仕様になったようです。通常は、プロジェクトを新規で作る際に実行するコマンド(go mod init)を実行すると、go.sumも一緒に作成されます。今回は、初期化はすでに行っている状態なので、initコマンドではなく、以下を実行することで解決します。

go mod tidy

ちなみに、こちらのコマンドはプログラム上のimport文を参照して、不要モジュールの削除と新規モジュールの追加を行ってくれるコマンドです。

続いて、再度ビルドコマンドを実行します。

make build

すると、binディレクトリ直下にビルドされた結果が格納されていると思います。

あとは、以下のコマンドでデプロイするだけです(リージョンやprofileの設定が必要な場合はserverless.ymlを編集してください)。

sls deploy

おしまいです。