はじめに
AWS LambdaでGolangが使えるようになったなあと思っていたら早速Serverless FrameworkでもGoが使えるようになっていた。
下記の公式ブログにサンプルがあるので、そのまま試してみた。
Serverless Framework example for Golang and Lambda
やってみた
以下、ただの作業ログ。
サンプルをそのままデプロイしてみる
$ serverless create -t aws-go-dep -p serverless-example-golang
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/Users/*****/go/src/github.com/shunsugai/serverless-example-golang"
_______ __
| _ .-----.----.--.--.-----.----| .-----.-----.-----.
| |___| -__| _| | | -__| _| | -__|__ --|__ --|
|____ |_____|__| \___/|_____|__| |__|_____|_____|_____|
| | | The Serverless Application Framework
| | serverless.com, v1.26.0
-------'
Serverless: Successfully generated boilerplate for template: "aws-go-dep"
$ cd serverless-example-golang/
$ ll
total 40
drwxr-xr-x 9 ***** staff 306 Feb 3 00:02 .
drwxr-xr-x 3 ***** staff 102 Feb 3 00:02 ..
-rw-r--r-- 1 ***** staff 123 Feb 3 00:02 .gitignore
-rw-r--r-- 1 ***** staff 492 Feb 3 00:02 Gopkg.lock
-rw-r--r-- 1 ***** staff 611 Feb 3 00:02 Gopkg.toml
-rw-r--r-- 1 ***** staff 156 Feb 3 00:02 Makefile
drwxr-xr-x 3 ***** staff 102 Feb 3 00:02 hello
-rw-r--r-- 1 ***** staff 2749 Feb 3 00:02 serverless.yml
drwxr-xr-x 3 ***** staff 102 Feb 3 00:02 world
$ make
dep ensure
env GOOS=linux go build -ldflags="-s -w" -o bin/hello hello/main.go
env GOOS=linux go build -ldflags="-s -w" -o bin/world world/main.go
$ sls deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (4.43 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
........................
Serverless: Stack update finished...
Service Information
service: serverless-example-golang
stage: dev
region: us-east-1
stack: serverless-example-golang-dev
api keys:
None
endpoints:
None
functions:
hello: serverless-example-golang-dev-hello
world: serverless-example-golang-dev-world
Serverless: Publish service to Serverless Platform...
Service successfully published! Your service details are available at:
https://platform.serverless.com/services/************/serverless-example-golang
$ sls invoke -f hello
{
"message": "Go Serverless v1.0! Your function executed successfully!"
}
Serverless Frameworkは相変わらず簡単で良い。
Circle CI 2.0でデプロイできるようにしてみる
どうせならCircle CIからデプロイできるようにしたいなあと思って、雑にやってみた。
手順としては
- IAMでデプロイ用のユーザーを作成する
- 作成したユーザーにデプロイに必要な権限を付与する
- config.ymlを書く
という感じ。
ユーザー作成から権限付与まで
下記の記事を参考にした。
- https://serverless.com/blog/abcs-of-iam-permissions/
- https://qiita.com/motchi0214/items/e95a87e732eb401b43e5
config.ymlの作成
作ってみた.circleci/config.ymlが下記。
version: 2
jobs:
build:
docker:
- image: circleci/golang:latest
working_directory: /go/src/serverless-example-golang
steps:
- checkout
- run:
name: Install node
command: |
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
- run:
name: Install awscli
command: |
sudo apt-get update && sudo apt-get install -y awscli
- run:
name: Install serverless
command: |
sudo npm install -g serverless
- run:
name: Install dep
command: |
go get github.com/golang/dep/cmd/dep
- run:
name: Make
command: |
make
- run:
name: Run serverless deploy
command: |
sls deploy --stage dev
- デプロイ用のimageを作っても良いのだけど、ひとまずデプロイできればいいやという感じでやった。
- GOPATHが/goになっていたので、working_directoryを/go/src/serverless-example-golangにした。お作法的に良いのかどうかはわからない。
- Serverlessのドキュメントにも書いてあるとおり、depが必要なのでインストールする。
- ブランチによってstageをわけられるようにしたい。
結果
$ sls invoke -f hello
{
"message": "Go Serverless v1.0! Your function executed successfully!!!!!"
}
おわりに
- 既存のプロジェクトをGolangで書き直していきたい。
- IAMがよくわからん。