入門!はじめてのServerless Framework(LambdaからSlackへ定期実行編)

記事タイトルとURLをコピーする

こんにちは。新卒1年目、OJT中の小林です。

サーバーワークスの新卒は、1年間はOJTによる実地研修を行なっており、私も現在マネージドサービス課で元気に修行中です。

先日、研修で、巷で有名なServerless Frameworkをはじめて使い、AWSのLambdaのデプロイをしてみちゃいました。

ですので、修行の一環として、また備忘録も兼ねて、僭越ながらご紹介したいと思います。

ちなみに、Serverless Frameworkの使い方は、新卒2年目の先輩に教えていただきました。尊敬します。

 

今回やったこと

 

今回作ったのは、サーバーワークスの社内で定期開催されるLT大会(いわゆる社内勉強会)のリモート配信先のURLを記載したメッセージをSlackに送信するBotです。

LT大会は毎週水曜日と金曜日の18:30に行われるため、その30分前の18:00に特定のチャンネル(#lt-championship)に送信されるようにしました。

 

Serverless Frameworkを作る手順

まずは、Serverless Frameworkの作成。ランタイムはpython3系で行います。slsとしていますが、serverlessでも動作します。

sls create -t aws-python3 -p LT_G2M

 

必要な外部ライブラリもアップロードしちゃいます。私の場合は、requestsのライブラリをアップロードしました。

pip install requests -t .

 

早速handler.pyのファイルにコードを書いちゃいます。今回はできるだけコードを変更しないようにするため、認証情報は環境変数(environment variable)としました。具体的にはtokenとchannelです。

import json
import os
import requests


def lambda_handler(event, context):
    message = '本日のLTのGoToMeetingはこちらです。 ```https://xxxxxxxxxxxxxxxx```'
    token = os.getenv('token')
    channel = os.getenv('channel')
    param = {
        'token': token,
        'channel': channel,
        'text': message
        }

    response = requests.post(
        'https://slack.com/api/chat.postMessage',
        data = param
        )

 

次は、serverless.ymlのファイルを編集します。前述したように、tokenとchannelは環境変数としてこちらのファイルで情報を持たせます。

また、今回は定期的にメッセージを送信させるため、CloudWatchEventsを使用します。

service: LT-G2M 
provider:
  name: aws
  runtime: python3.6

functions:
  hello:
    handler: handler.lambda_handler
    environment:
      token: 'xoxp-xxxxxxxxxxxxxxxxxxxxxxx'
      channel: '#lt_championship'
    events:
      - schedule: cron(0 9 ? * WED,FRI *)

 

ちなみに、CloudWatchEventsの設定の際、私は最初schedule: cron(0 18 ? * WED,FRI *)としてしまったがために、飛んでこないなーこないなーと待ちぼうけを食らいました。CloudWatchEventsはJSTではなく、UTCですね。

 

そしてデプロイ

デプロイは以下のコマンドを実行するだけ。

sls deploy

メチャ簡単。

本当にできているのか。マネコンよりLambdaを確認。

出来た。

ログも確認。

 

出来た。

Slackも確認。

 

出来た。感動ですね。

 

おわりに

はじめてのServerless Framework。

簡単なプログラムながら、AWSのマネコンからではなく、CLIを使ってLambdaがデプロイできるなんて。

しかしながら、

東京リージョンにデプロイするはずがバージニア北部リージョンにデプロイしていたり、

関数を使わずコードを書いていたら、一行がひたすら長いブサイクなコードを記述していたり、

ツメが甘い私は、まだまだ改善の余地ありです。

 

ただ、Serverless Framework楽しいですね。