こんにちは。新卒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楽しいですね。