Serverless FrameworkとGoでAWS利用費を毎朝Slackに通知する

f:id:ryskit:20200119180331p:plain

以前、「AWS LambdaでAWS利用費を毎朝Slackに通知する」というタイトルで記事を書きました。 この中では、Serverless Frameworkを使わず、Goで書いたコードをビルドしてZip化、AWSリソースは手作業で作成、デプロイももちろん手作業でZipをアップロードしていました。

blog.ryskit.com

ただ正直、AWSリソースを手で作成するの面倒だし、修正してコマンド一発でデプロイしたいところです。

で、今回それを解決するためにServerless Frameworkを導入し、手作業ではなくターミナルからコマンドでデプロイできるようにします。

それでは、いってみましょう!

前提

AWS LambdaでAWS利用費を毎朝Slackに通知する - そうきたか で作成したコードを利用します。

ソースコードはこちらからダウンロードできます。

github.com

Serverless Frameworkをインストールする

すでに僕の環境にはNodeが入っていたので、npmでインストールしました。

npm install -g serverless

以下のリンク先にインストール方法は書いてあるので、参考にしてみてください!

serverless.com

Serverless Frameworkの設定ファイルを作る

以下のようなコマンドを実行すれば、ServerlessFrameworkの雛形を作成できますが今回は使いません。

serverless create -u https://github.com/serverless/serverless-golang/ -p hello-go-lambda

今回はすでに作成した環境があるので、そこにserverless.yml という名前のファイルを作成します。

service: aws-billing-notification

provider:
  name: aws
  runtime: go1.x
  stage: prd
  region: ap-northeast-1
  iamRoleStatements:
    - Effect: Allow
      Action:
        - "logs:CreateLogGroup"
        - "logs:CreateLogStream"
        - "logs:PutLogEvents"
        - "ce:GetCostAndUsage"
      Resource:
        - "*"

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

functions:
  billing-notification:
    handler: bin/main
    events:
      - schedule: cron(0 22 * * ? *)

あと、もう一つ作業があります。ファイルをリネームします。

以前、billing-notification.goという名前でファイルを作成していたのですが、main.go という名前にリネームしておいてください。

リネームできたら以下のコマンドでビルドします。

GOOS=linux go build -o bin/main

これで準備は完了です。

デプロイ

serverless frameworkのCLIコマンドでデプロイします。

以下のように実行してみてください。

sls deploy

これでしばらく待って、AWS Lambda, IAMロール, CloudwatchEvent等が作成されていればOKです!

試してみよう

以下のコマンドを実行して、請求金額がSlackに通知できれば完璧です!!

sls invoke -f billing-notification

最後に

いかがでしたでしょうか?

手作業で作成してデプロイするよりも遥かに簡単になりました!

以下に対応したコードをあげているので、参考にして試してみてください!

github.com