Edited at

AWS LambdaでRubyがサポートされたのでSlackBotで超簡単に試す


はじめに

この記事はアドベントカレンダーAWS初心者の10日目の記事です。

AWSというか、技術的なことは全体的に初心者で、今勉強しているところです。

最近、会社で同期とプログラミングサークルを作り、サークルのSlackでなにかbotを試したいなと思っていたところ、2018年のre:Inventでlambdaがrubyをサポートすると発表されたので、これは試すしかない!と思いやってみました。


構成

今回やるのは、lambdaからIncoming Webhooksを使って特定のチャンネルにメッセージを送信するだけです。


SlackとWebhooksの設定


テスト用のチャンネルを作成

既存のチャンネルでBotのテストをすると、参加ユーザーが「なにやってんだこいつ・・・」となるので、適用にチャンネルを作成しましょう。


Incoming Webhooks

Imcoming Webhooksは、HTTPリクエストでメッセージを送ることができるSlack Appの一つです。

ライブラリなど使用することなく、HTTPリクエストを送るだけでOKなため、今回のような簡単なSlack Botを作成するときにはとても便利です。

詳しくはこの記事が参考になると思います。

SlackのIncoming Webhooksを使い倒す

まずは

https://slack.com/services/new/incoming-webhook

から新しいAppを作成しましょう。

Post to Channelには、先程作成したチャンネルを入力します。

どうせなので、nameとiconも好きなものに変えましょう。

こんな感じ。

ここで取得したWebhook URLは後で使います。


AWSの設定


IAM

AWSにログインし、Webコンソールのサービス一覧からIAMのコンソールに行きます。

ここで、Lambda関数に設定するロールを作成します。

画面左ペインのロールから、ロールの作成を選択してください。

1: このロールを使用するサービスを選択

Lambdaを選択

2: Attach アクセス権限ポリシー

あとでデバックするときにログを確認したいので、AWSLambdaBasicExecutionRoleを選択します。

このポリシーは、概要欄にProvides write permissions to CloudWatch Logs.とあるように、CloudWatchへの書き込み権限を持つので、CloudWatchにログを出力するようにできます。

今回はデバックが必要になるようなことはしませんが、後々機能を拡充するときには便利です。

3: ロールの作成

ロール名とロールの説明を適当に記入して、作成してください。


Lambda

Lambda関数を作成しましょう。

サービス一覧からLambdaを選択して、Lambdaのコンソールから、関数を作成を選択してください。

一から作成を選択してください。

ランタイムには、もちろんruby 2.5を選択してください。

ロールは既存のロールを選択で、先ほど作成したロールをここで適用してください。


ローカルで作業

次にローカルでコードを書いていきます。

lambdaのランタイムはruby2.5.0なので、ローカルで利用するrubyもそのあたりのものにしましょう!

mkdir slack-bot

cd slack-bot
touch lambda_function.rb
touch Gemfile

で、こんな感じの構成のプロジェクトを作成してください。

├── Gemfile

└── lambda_function.rb

それぞれのファイルを編集していきます。


lambda_function.rb

require 'json'

require 'slack-notifier'

def hello(event:, context:)
notifier = Slack::Notifier.new
# URLは先程取得したWebhook URLを入力してください。
# channelは先程作成したSlackチャンネルを入力してください。
'https://hooks.slack.com/services/TC6AUL4LR/xxxxxx/yyyyyyyyyy' do
defaults channel: '#bot-testl', link_names: 1
end
# 投稿したいメッセージを入力してください。
notifier.post text: 'Hello, Lambda for Ruby'
end


# Gemfile

source "https://rubygems.org"
gem 'slack-notifier'

書けたら、bundle install --deploymentしてください。--deploymentフラグを指定することで、vendorというフォルダにinstallしてきたファイルが入っていきます。

そうすると、次のようなディレクトリ構成になります。

.

├── Gemfile

├── Gemfile.lock

├── lambda_function.rb

└── vendor

   └── bundle

      └── ruby

         └── 2.5.0

            ├── build_info

            ├── cache

            ├── doc

            ├── extensions

            ├── gems

            └── specifications

これらのファイルをすべてzipに圧縮して、lambda関数としてアップロードしましょう。

lambdaのwebコンソールから、関数コードコードをインラインで編集を、zipファイルをアップロードにして、作成したzipファイルをアップロードします。

すると、コンソールのeditorにアップロードしたファイルが反映されました。

読み込めない人は、zipの中身が一つのディレクトリになっている可能性があります。zipの中身は直下でコードになっていないとだめなので、注意してください。

最後に、関数コードハンドラを、lambda_function.helloにします。

ここで呼び出すメソッドを指定しています。

準備が整ったので、早速テストしてみましょう。

コードを保存したら、テストボタンを選択してください。

今回はJSONファイルを渡す必要がないので、画像のように空にしてOKです。

完了したら、早速テストを実行してみます!

ぽちっとな・・・ < スココッ

できた〜:smile:


おわり

かなり簡単なことしかやっていないですが、lambda関数作成の流れは確認できました。

今後は、新しくワークスペースに参加者が来たら、ウェルカムメッセージをDMするbotとかを作成していこうと思います!

見ていただきありがとうございました!