Edited at

Serverless Frameworkを使ってgoを定期実行させる

勉強がてら触っていた際のメモです。


slsのインストール

npm install serverless -g


goのテンプレート作成

sls create -u https://github.com/serverless/serverless-golang/ -p go-hatena


go modulesの初期化

go mod init go-hatena


必要なパッケージのインストール

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


serverless.ymlの編集

以下のような感じで.aws/credentialsを仕事用、プライベート用で分けている。

$ vim ~/.aws/credentials

[default]
aws_access_key_id = hoge
aws_secret_access_key = huga
cloudfront=true
[private]
aws_access_key_id = hogehoge
aws_secret_access_key = hugahuga

今回、lambdaのデプロイはprivate用の方で行いたい。

なのでserverless.ymlにその設定を書いていく。

service: go-hatena

provider:
name: aws
runtime: go1.x
stage: ${opt:stage, self:custom.defaultStage}
#profileオプション追加
profile: ${opt:profile, self:custom.defaultProfile}
#regionオプション追加
region: ${opt:region, self:custom.defaultRegion}

custom:
defaultStage: dev
#何も指定がなければ private profile
defaultProfile: private
#何も指定がなければ 東京リージョン
defaultRegion: ap-northeast-1

package:
exclude:
- ./**
include:
- ./bin/**

functions:
hello:
handler: bin/main

また、awsのアカウントを指定してデプロイを行う別の方法として、--aws-profileオプションを使う方法もあるぽい。参考

serverless deploy --aws-profile private


Makefileの作成

Makefileという名前でファイルを作成し、ビルドとデプロイのコマンドを記載

build:

GOOS=linux go build -o bin/main

deploy:
sls deploy


ビルド、デプロイ

make build

make deploy

これでawsのlambdaを見に行けば関数がデプロイされている。

スクリーンショット 2019-03-10 20.35.26.png


実行

Makefileに以下を追加し、

run:

sls invoke -f hello

実行。レスポンスが返ってくる。

$ make run

sls invoke -f hello
{
"message": "Go Serverless v1.0! Your function executed successfully!"
}
$


作成した関数を定期実行させる

serverless.ymlにscheduleを追記

functions:

hello:
handler: bin/main
events:
- schedule: cron(0/1 * * * ? *)

定期実行されていることはcloudWatchLogsから確認できる。わかりやすくするために「hello!!」とログ表示させるようにする。


main.go

func Handler() (Response, error) {

fmt.Println("hello!!") // 追記
return Response{
Message: "Go Serverless v1.0! Your function executed successfully!",
}, nil
}

ビルドし、デプロイ

make build

make deploy


定期実行されていることの確認

hello!!と定期的に表示されている。

スクリーンショット 2019-03-10 20.56.55.png


cloudWatchLogsの保存期間を設定

デフォルトでslsではCloudWatch Logsの保存期間は無期限らしい。

個人アカウントの場合、課金されても嫌なので、保存期間を設定する。

serverless.ymlを修正

provider:

logRetentionInDays: 1 #追加

また、このlogRetentionInDaysに指定できる日数は決まってる

[1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653]

上記以外の日数を指定するとデプロイで怒られる

Invalid retention value. Valid values are: [1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653] (Service: AWSLogs; Status Code: 400; Error Code: InvalidParameterException; Request ID: 8aca73dc-43a1-11e9-a81a-6bf91d5376af).


lambdaのバージョン管理をしない

デフォルトでslsはデプロイした全てのバージョンのlambdaを保存するらしい。

今回お遊びで触っているだけなので、バージョン管理をしないように設定。

provider:

versionFunctions: false #追加


定期実行を止める

lambdaの管理コンソール上からCloudWatchEventsの有効/無効が切り替えれる。

無効にし、保存すれば定期実行は止まる

スクリーンショット 2019-03-10 21.10.32.png


参考

https://qiita.com/imura81gt/items/5cf490468f95ce3d100b

https://tikasan.hatenablog.com/entry/2018/06/27/083316

https://dev.classmethod.jp/etc/serverless-framework-lambda-cron-execute/

https://tech.ga-tech.co.jp/entry/2018/12/12/120000