LoginSignup
1
1

More than 1 year has passed since last update.

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

Posted at

最近は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コマンドはインストール済みの前提)。
※my-serviceの箇所はテンプレートを配置したい任意のディレクトリ名。

sls create --template aws-go-mod --path my-service

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

続いて、ドキュメントに記載の通り以下コマンドでソースコードをビルドします。

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
1
1
0

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
  3. You can use dark theme
What you can do with signing up
1
1