概要
slack では webhook 用のURL を通し、メッセージを投稿することができます。
ここでは、AWS Lambda を invoke -> 内部でシェルスクリプトを実行 -> Incoming Webhooks に POST という手順を試してみたので、その方法を書いておきます。
Incoming Webhooks
Slack Apps の Incoming Webhooks のページから、web hook 用の URL を取得します。
https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX
↑こんな感じのURL
この URL にメッセージをPOSTすることで、設定したチャンネルにそのメッセージが投稿されます。
メッセージだけでなく、投稿者の名前、アイコンなども設定できます。
例えば、
curl -X POST https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX -d '{"text": "TEST!!!!", "username": "dango", "icon_emoji": ":dango:"}'
こんな感じのPOSTをすると、
こんな感じの投稿になります。
引数にテキスト、ユーザー名、アイコンを受け取ってポストできるような適当スクリプトを作っておきます。
#!/bin/sh
TEXT=$1
USERNAME=$2
ICON=$3
BODY="{'text': '${TEXT}', 'username': '${USERNAME}', 'icon_emoji': '${ICON}'}"
curl -X POST https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXX -d "${BODY}"
Lambda
次は上記を Lambda を通してやってみます。
Lambda 関数の作成時に、ランタイムは node.js を選択、設計図には node-exec を選択します。
このLambda 関数から先ほど作ったシェルスクリプトを実行し、Slack への投稿を行います。
Lambda 関数は実行時に json 形式のペイロードを受け取り、その内容を関数に渡すことができます。
{
"text": "Post from lambda!!",
"username": "test",
"icon": ":golfer:"
}
↑こんなペイロードを作っておきます。
これを渡してスクリプトを実行できるような関数を作成します。
var exec = require('child_process').exec;
exports.handler = function(event, context) {
command = '/bin/bash ./post.sh ' + event['text'] + ' ' + event['username'] + ' ' + event['icon'];
child = exec(command, function(error) {
// Resolve with result of process
context.done(error, 'Process complete!');
});
// Log process stdout and stderr
child.stdout.on('data', console.log);
child.stderr.on('data', console.error);
};
この index.js、post.sh を zip 形式にまとめてlambda へとアップロードし、Lambda 関数を作成します。
後の設定は適当に。。。
作成した関数に、アクション>テストイベントの設定から、先ほど作った json を設定し、テストを実行します。
成功のログとともに、Slack へと投稿されていることが確認できました!
感想
Lambda を使うのはこれが初めてなので、細かい設定はよくわからず作ってますが、なんとか成功しました。
(基本的に参考に記したリンク先のやり方を真似させていただきました。)
Lambda を使ってみたかっただけなので Lambda である必要はないと思いますが、割と簡単に設定できました。
Incoming Webhooks ではいろんな形式の投稿ができるっぽいので時間があれば試してみたい。。。