6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-09

はじめに

この記事はアドベントカレンダー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も好きなものに変えましょう。

Screen Shot 2018-12-10 at 0.00.15.png

こんな感じ。
ここで取得した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にアップロードしたファイルが反映されました。

Screen Shot 2018-12-10 at 0.08.21.png

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

最後に、関数コードハンドラを、lambda_function.helloにします。
ここで呼び出すメソッドを指定しています。

準備が整ったので、早速テストしてみましょう。
コードを保存したら、テストボタンを選択してください。

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

Screen Shot 2018-12-10 at 0.09.17.png

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

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

Screen Shot 2018-12-10 at 0.10.29.png

できた〜:smile:

おわり

かなり簡単なことしかやっていないですが、lambda関数作成の流れは確認できました。
今後は、新しくワークスペースに参加者が来たら、ウェルカムメッセージをDMするbotとかを作成していこうと思います!

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

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?