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にその設定を書いていく。

```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オプションを使う方法もあるぽい。[参考](https://serverless.com/framework/docs/providers/aws/guide/credentials#using-the-aws-profile-option)

```
serverless deploy --aws-profile private
```

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

```Makefile
build:
	GOOS=linux go build -o bin/main

deploy:
	sls deploy
```

# ビルド、デプロイ

```
make build
make deploy
```

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

<img width="782" alt="スクリーンショット 2019-03-10 20.35.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/131625/e924a464-32ab-a024-d60a-94a2ebf6b0ff.png">

# 実行
Makefileに以下を追加し、

```Makefile
run:
	sls invoke -f hello
```

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

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

#作成した関数を定期実行させる
serverless.ymlにscheduleを追記

```yml
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!!と定期的に表示されている。

<img width="743" alt="スクリーンショット 2019-03-10 20.56.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/131625/c76c4c09-8b6b-036d-5953-9f42a12c6d8f.png">

# cloudWatchLogsの保存期間を設定
デフォルトでslsではCloudWatch Logsの保存期間は無期限らしい。
個人アカウントの場合、課金されても嫌なので、保存期間を設定する。

serverless.ymlを修正

```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を保存するらしい。
今回お遊びで触っているだけなので、バージョン管理をしないように設定。

```yml
provider:
  versionFunctions: false #追加
```

# 定期実行を止める
lambdaの管理コンソール上からCloudWatchEventsの有効/無効が切り替えれる。
無効にし、保存すれば定期実行は止まる

<img width="1270" alt="スクリーンショット 2019-03-10 21.10.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/131625/606e42f2-d95f-2d34-b7d5-f51b6b97ce30.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