ChatOps: SlackからLambdaに連携してみる(5)

id:kizashi1122 です

f:id:ingage:20210620201734p:plain

いよいよ大詰めです。

Lambda の中で「Slack に投稿する」ということをします。 今回は Ruby を使っています。Ruby だと以下の gem を使いたくなります。

github.com

Lambda で gem を使うってどうするんでしょうか。 今回はこちらのやり方でいきましょう。ローカルで bundle install して zip で固めてアップロード、ですね。

docs.aws.amazon.com

他のやり方としては、SAM cli を使うだとか、CDK を使うというやり方もあると思いますがそれはまた別の機会に。

zip ファイルの作成

手元で、適当にディレクトリを作成し、その中で以下のファイルを作りましょう。

  • lambda_function.rb
  • Gemfile

lambda_function.rb は今の内容そのままでいいです。確か、今は

require 'json'

def lambda_handler(event:, context:)
    # p event
    
    req = JSON.parse(event['body'])
    if ENV['SLACK_VERIFICATION_TOKEN'] != req['token']
        return { statusCode: 401, body: "VERIFICATION TOKEN UNMATCHED" }
    end
    
    { statusCode: 200, body: 'done' }
end

こうなっていたでしょうか。 Gemfile は

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

で、よいでしょう。

次に、同じ階層で、

$ bundle install --path vendor/bundle

と実行します。Lambda の実行環境が Ruby 2.7 なので、ローカルも Ruby 2.7 系にしておいてください。 これ大事です。 実行すると、DEPRECATED とでますが気にしない。次に、ZIP で固めます。

$ zip -r function.zip lambda_function.rb vendor Gemfile*

出来上がった function.zip をアップロードします。

f:id:ingage:20210628230840p:plain

左側のファイルツリーに vendor ディレクトリがみえたでしょうか?

エコーする部分のコーディング

前回のエントリでエコーする部分にはあたりをつけました。 となるとこんなかんじでしょうか。

require 'json'
require 'slack-ruby-client'

def lambda_handler(event:, context:)
    req = JSON.parse(event['body'])
  
    if ENV['SLACK_VERIFICATION_TOKEN'] != req['token']
        return { statusCode: 401, body: "VERIFICATION TOKEN UNMATCHED" }
    end

    text = req['event']['blocks'].first['elements'].first['elements'].last['text']&.strip
    post_message(text) # 同じ内容を投稿
    
    { statusCode: 200, body: 'done' }
end

def post_message(message)
  Slack.configure do |config|
    config.token = ENV["SLACK_TOKEN"]
  end
  client = Slack::Web::Client.new
  client.chat_postMessage(channel: ENV["SLACK_CHANNEL"], text: message)
end

メッセージ送信用のトークンと投稿先のチャンネルは環境変数で指定しています。

パーミッションの追加とトークンの取得

SLACK_TOKEN は何を設定すればよいのでしょうか。

Slack の echoapp の設定画面に戻りましょう。 左メニューの「OAuth & Permissions」に移動します。

f:id:ingage:20210629091433p:plain

するとすでに上部にトークンが表示されています。これを SLACK_TOKEN として環境変数に設定しておきましょう。
SLACK_CHANNEL は投稿先のチャンネルを定義しておいてください。

ここで大事なのはこの時点ではこのトークンにはチャンネルへのメッセージ投稿権限がないことです。
chat:write の権限をつけておきます。

パーミッションを変更したことによりアプリの再インストールが必要になりますので、最初にアプリのインストールをしたのと同じ手順でインストールしましょう。

f:id:ingage:20210629091716p:plain

これで完了です。

テスト

テストしてみます。

f:id:ingage:20210629091822p:plain

やったね!

弊社では、上述の「エコーする」部分を AWS の Security Group に IP アドレスを追加する処理として運用しています。 AWSのAPIでもいいし、外部のAPIでもいいし、いろいろな使い方ができそうですね。

インゲージではエンジニアを募集しいています。 ご応募お待ちしてます。

↓↓↓↓↓↓↓↓↓↓↓↓↓

ingage.co.jp