備忘録

なんとなく暇なときにでも....

APIGatewayとLambdaでSlackコマンドを作った話

タイトルの通りです。 ちょっとやってみました。

構成

f:id:tomAn:20170426091807p:plain

やったこと

  1. Lambda functionを作成
  2. API GatewayとLambdaと連携
  3. Slack(outgoing webhook, incomming webhook)の設定
  4. プルリクエストを出してみる

1. Lambda functionを作成

API GatewayからキックされたLambdaの役割は大きく2つです。

  • GithubAPIを利用して、指定のリポジトリのマスターマージのプルリクエストを送る。
  • SlackAPIを利用して、必要なレスポンスをする。

Lambda functionがサポートしている言語は、Node.jsやPythonなど複数存在しますが、今回はGo言語を用いて実装しています。

というのも、

などがあったため、あえてGoで実装しました。

前置きが長くなってしまったのですが、そろそろ初めます。

追加機能(プルリクエスト・Slackへのレスポンス)を実装し、ApexでLambda functionをdeployします。

実装

GithubAPIを利用して、指定のリポジトリのマスタマージのプルリクエストを送る。

先ほど紹介しましたgo-githubgo getして使っていきます。

SlackのAPIを利用して、チャンネルに必要なレスポンスを返す。

レスポンスを返すために、incomming webhookを使いました。

incoming webhookを用いて、slackにポストする外部パッケージは個人で練習用のものを作っていたので、そっちからgo getしてます。

はじめて自分で作ったものを外部パッケージとして利用したのですが、こういうことを簡単にできるのもGo言語のよいところだなと思いました。(他の言語と比較できませんが…)

実装したLambda functionをapex deployすればひとまずOK。

f:id:tomAn:20170426091829p:plain

2. API GatewayとLambdaと連携

ここで注意する点はoutgoingとlambdaの入手出力の形式が異なる点です。

  • outgoingの出力は、 application/x-www-form-urlencoded
  • lambdaの入力は、application/json

なのだそう。

ですので、API GatewayでContent-typeをそれらに合わせて変換しないといけません。 ( AWS Developer Forums: HOWTO: Mapping Template )

f:id:tomAn:20170426091906p:plain

API Gatewayの設定画面で、本文マーピングテンプレートのContent-typeapplication/x-www-form-urlencodedを指定し、テンプレートの生成します。

f:id:tomAn:20170426091918p:plain

3. Slackの設定 (Webhookの設定)

outgoing webhookだけでもレスポンスを返すことは可能なのですが、SlackのAPIを利用すれば、レスポンスする際の詳細な設定(レスポンス時のアイコンや名前など)が簡単にできるincoming webhookを使いました。

API Gatewayで作成したURLをoutgoingで実行するURLに設定すれば準備完了です。


4. プルリクエストを出してみる

実際にプルリクエストを出してみます。 outgoing webhookで設定したchannelでtrigger wordを入力すると…

f:id:tomAn:20170426091930p:plain

こんな感じです。

(モザイクがかかってますが)プルリクエストのURLやコミットタイトル、コミッターなどを表示しているので、誰がどのようなコミットをしているのかを一覧でさくっと見れてちょっといい気分になれます。


今のところChatOps的に社内の人に使ってもらえるレベルのものにはなっていませんが、 今回紹介した方法を利用すれば、Slackのintegrationにない機能でも実装できるかと思います。

たしかoutgoingには上限の個数があったはずなので、Lambda側でキーワードに応じてスイッチすれば、1つのoutgoingで、複数機能の実装もできるようになるのではないかと。(これはけっこういいなと勝手に思ってます。)

今後も時間を見つけてよりよいChatOps環境を作っていければなと思っている次第です。