Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

pokotyan
admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。
https://admin-guild.slack.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away