かべぎわブログ

技術的なことについてかけたらいいな…

SlackとLambdaを連携させる

SlackとLambdaを連携させる 今回はSlackとAWS Lambdaを連携させてChatOps的なことをやってみたいとおもいます。

Slash Commandsの設定

Slackのメニューから[Customize Slack]を選択します。
f:id:kabegiwakun:20171002185539p:plain

メニューからConfigure Appsを選択します
f:id:kabegiwakun:20171002185556p:plain

上部の検索窓にSlash Commandsと入力し、表示されたSlashCommandsを選択します。
f:id:kabegiwakun:20171002185606p:plain

Add Configurationを選択します。
f:id:kabegiwakun:20171002185620p:plain

Choose a Commandの欄に適当に今回コマンドの名前をつけてあげます。
今回は/lambda_testとしました。 名前を入力したらAdd Slash Command Integrationを選択します。 f:id:kabegiwakun:20171002185646p:plain

設定画面が出ますのでOutgoing Dataのtokenの値をコピーしておきます。 f:id:kabegiwakun:20171002185712p:plain

AWSの準備

さきほどのTokenを暗号化していきます。 まず、暗号化キーを選択し、キーの作成ボタンをクリックします。 f:id:kabegiwakun:20171002185738p:plain

名前と説明を入力します。(てきとうでいいです) f:id:kabegiwakun:20171002185749p:plain

タグの追加はそのままスキップでいいです f:id:kabegiwakun:20171002185806p:plain

キー管理アクセス許可の定義もスキップでいいです。 f:id:kabegiwakun:20171002185816p:plain

これもスキップ f:id:kabegiwakun:20171002185834p:plain

完了をクリックします f:id:kabegiwakun:20171002185858p:plain

マスターキーが正常に作成されました。 f:id:kabegiwakun:20171002185912p:plain

なんらかの環境でAWSCLIを利用してTokenを先程作成したマスターキーで暗号化します。

ubuntu@ip-192-140-1-19:~/.aws$ aws kms encrypt --key-id alias/lambda_test --plaintext "n11xiIkoPur44DQNVrzJfgXX"
{
    "CiphertextBlob": "AQICAHijAUzXJ9CcGdSW+j148CnwHrnBsiSVYcg8WdgDaweRSgEG7wP/SLIXTrbi/G+lZDUXAAAAdjB0BgkqhkiG9w0BBwagZzBlAgEAMGAGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMqznaOVc4s2O1rm4JAgEQgDNVdtK1IBZeDQW3Dm/p/AwBpixyQTh6ojtFO4AXx0/C2ZXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "KeyId": "arn:aws:kms:ap-northeast-1:XXXXXXXXXXXXX:key/09f77c08-ef8e-4713-a59b-2a74ad83c061"
}

Lambdaの作成

マネジメントコンソールでLambdaを開いて関数の作成を選択します。 f:id:kabegiwakun:20171002185941p:plain

設計図の箇所でslackで検索します。 検索でヒットしたslack-echo-command-pythonを選択します。 f:id:kabegiwakun:20171002185956p:plain

トリガーの設定になりますのでそのまま次へを選択します f:id:kabegiwakun:20171002190007p:plain

基本的な情報欄の名前に適当にこのLambdaの名前をつけてあげます。(今回はlambda_test_slackにしてみました) f:id:kabegiwakun:20171002190030p:plain

環境変数の箇所にAWSCLIで暗号化したTokenを入力します f:id:kabegiwakun:20171002190105p:plain

Lambdaが実行可能なロールを付与して、「次へ」を選択します。 f:id:kabegiwakun:20171002190117p:plain

内容の確認が出ますのでそのまま「関数の作成」を選択します。 f:id:kabegiwakun:20171002190137p:plain

API Gatewayの設定

任意のAPIにリソースを作成します。 f:id:kabegiwakun:20171002190148p:plain

作成したリソースに名前をつけます。
今回はlambda_testとしてみました。
名前を入力したらリソースの作成ボタンをおします。
f:id:kabegiwakun:20171002190207p:plain

先ほど作成したリソースにメソッドを作成します。 f:id:kabegiwakun:20171002190226p:plain

POSTを選択して、チェックマークをクリックします。 f:id:kabegiwakun:20171002190357p:plain

Lambda関数、リージョンは東京リージョンであれば「ap-northeast-1」を選択、Lambda関数の部分にはさきほど作成したLambdaの名前を入力します。 f:id:kabegiwakun:20171002190238p:plain

権限をする旨のメッセージが出ますのでOKを選択します。 f:id:kabegiwakun:20171002190254p:plain

メソッドの設定を行います。 統合リクエストを選択します。 f:id:kabegiwakun:20171002190304p:plain

マッピングを行います。 本文マッピングテンプレートをクリックして設定を開き、テンプレートが定義されていない場合を選択し、マッピングテンプレートの追加をクリックします。 f:id:kabegiwakun:20171002190315p:plain

application/x-www-form-urlencodedと入力してチェックマークをクリックします。 f:id:kabegiwakun:20171002190441p:plain

すると下にテンプレートを作成する欄がでてきますので以下のように入力して保存します。

{ "body": $util.urlDecode($input.json("$")) }

f:id:kabegiwakun:20171002190512p:plain

作成したAPIをデプロイします。 f:id:kabegiwakun:20171002190537p:plain

デプロイするステージは任意のものでかまいません f:id:kabegiwakun:20171002190553p:plain

lambda_testがデプロイされました。
POSTをクリックします。 f:id:kabegiwakun:20171002190605p:plain

slackの設定でこのURLをつかいますので覚えておきます。 f:id:kabegiwakun:20171002190616p:plain

slackの設定

slashcommandsの設定にもどり、URLの欄に先ほど確認したURLをコピーします。 これですべての設定は完了です! f:id:kabegiwakun:20171002190632p:plain

まとめ

サーバレスでslackのBOTをつくることができました。 これをもとにしていろいろなBOTをつくっていきましょう。