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

# はじめに

この記事はアドベントカレンダー[AWS初心者](https://qiita.com/advent-calendar/2018/aws_beginner)の10日目の記事です。
AWSというか、技術的なことは全体的に初心者で、今勉強しているところです。
最近、会社で同期とプログラミングサークルを作り、サークルのSlackでなにかbotを試したいなと思っていたところ、[2018年のre:Invent](http://reinvent.awseventsjapan.com/)でlambdaがrubyをサポートすると発表されたので、これは試すしかない！と思いやってみました。

# 構成

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

# SlackとWebhooksの設定

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

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

## Incoming Webhooks

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

詳しくはこの記事が参考になると思います。
[SlackのIncoming Webhooksを使い倒す
](https://qiita.com/ik-fib/items/b4a502d173a22b3947a0)

まずは
https://slack.com/services/new/incoming-webhook
から新しいAppを作成しましょう。
`Post to Channel`には、先程作成したチャンネルを入力します。
どうせなので、nameとiconも好きなものに変えましょう。

<img width="978" alt="Screen Shot 2018-12-10 at 0.00.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/174325/2e9895c5-3fab-e12d-7723-340c05589411.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
# 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にアップロードしたファイルが反映されました。

<img width="782" alt="Screen Shot 2018-12-10 at 0.08.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/174325/809bfc19-0a32-713f-31c6-aeb67f60a13d.png">

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

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

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

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

<img width="882" alt="Screen Shot 2018-12-10 at 0.09.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/174325/c6d1135d-d9d5-c212-7392-2c9bef9ea633.png">

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

ぽちっとな・・・    < ｽｺｺｯ

<img width="648" alt="Screen Shot 2018-12-10 at 0.10.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/174325/26e7d67a-8bb3-323f-7c09-4a373d53249d.png">

できた〜:smile:

# おわり

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

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