いよいよ大詰めです。
Lambda の中で「Slack に投稿する」ということをします。 今回は Ruby を使っています。Ruby だと以下の gem を使いたくなります。
Lambda で gem を使うってどうするんでしょうか。 今回はこちらのやり方でいきましょう。ローカルで bundle install して zip で固めてアップロード、ですね。
他のやり方としては、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
をアップロードします。
左側のファイルツリーに 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」に移動します。
するとすでに上部にトークンが表示されています。これを SLACK_TOKEN
として環境変数に設定しておきましょう。
SLACK_CHANNEL は投稿先のチャンネルを定義しておいてください。
ここで大事なのはこの時点ではこのトークンにはチャンネルへのメッセージ投稿権限がないことです。
chat:write
の権限をつけておきます。
パーミッションを変更したことによりアプリの再インストールが必要になりますので、最初にアプリのインストールをしたのと同じ手順でインストールしましょう。
これで完了です。
テスト
テストしてみます。
やったね!
弊社では、上述の「エコーする」部分を AWS の Security Group に IP アドレスを追加する処理として運用しています。 AWSのAPIでもいいし、外部のAPIでもいいし、いろいろな使い方ができそうですね。
インゲージではエンジニアを募集しいています。 ご応募お待ちしてます。
↓↓↓↓↓↓↓↓↓↓↓↓↓