はじめに
この記事はアドベントカレンダー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
それぞれのファイルを編集していきます。
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です。
完了したら、早速テストを実行してみます!
ぽちっとな・・・ < スココッ
できた〜
おわり
かなり簡単なことしかやっていないですが、lambda関数作成の流れは確認できました。
今後は、新しくワークスペースに参加者が来たら、ウェルカムメッセージをDMするbotとかを作成していこうと思います!
見ていただきありがとうございました!