slackのbotをAWS Lambda(Python)+API Gatewayで構築

slackで投稿した内容に応じて返信したり調べ物したりしてくれるbotですが、これをAWSのLambda(Python)+API Gatewayで構築しましたメモです。
目次
AWS Lambdaで実装する
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24  | 
						def lambda_handler(event, context):     try:         user_name = event['user_name']         text = event['text']         msg = user_name + 'さん '         if text == '':             msg += 'はい!'         elif text.find('おはよ') >-1:             msg += 'おはようございます!'         elif text.find('こんにちは') > -1:             msg += 'こんにちは'         elif text.find('疲') > -1 or text.find('お先') > -1:             msg += 'お疲れさまでした!'         else:             msg += 'その言葉は分かりません。'         payload={'text':msg}         return payload     except Exception as e:         print(e)         raise e  | 
					
eventに辞書型でslackからusername,text,channel_nameなどがPOSTされるのでそれを受け取って、json形式で返します。
API Gatewayの設定
lambdaのAPI endpointsから設定します。
MethoはPOSTにします。
出来たAPI Gatewayの設定画面に行って、[統合リクエスト]の設定を展開します。

[マッピングテンプレートの追加]でContent-Type 「application/x-www-form-urlencoded」を追加します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52  | 
						## convert HTML POST data or HTTP GET query string to JSON ## get the raw post data from the AWS built-in variable and give it a nicer name #if ($context.httpMethod == "POST")  #set($rawAPIData = $input.path('$')) #elseif ($context.httpMethod == "GET")  #set($rawAPIData = $input.params().querystring)  #set($rawAPIData = $rawAPIData.toString())  #set($rawAPIDataLength = $rawAPIData.length() - 1)  #set($rawAPIData = $rawAPIData.substring(1, $rawAPIDataLength))  #set($rawAPIData = $rawAPIData.replace(", ", "&")) #else  #set($rawAPIData = "") #end ## first we get the number of "&" in the string, this tells us if there is more than one key value pair #set($countAmpersands = $rawAPIData.length() - $rawAPIData.replace("&", "").length()) ## if there are no "&" at all then we have only one key value pair. ## we append an ampersand to the string so that we can tokenise it the same way as multiple kv pairs. ## the "empty" kv pair to the right of the ampersand will be ignored anyway. #if ($countAmpersands == 0)  #set($rawPostData = $rawAPIData + "&") #end ## now we tokenise using the ampersand(s) #set($tokenisedAmpersand = $rawAPIData.split("&")) ## we set up a variable to hold the valid key value pairs #set($tokenisedEquals = []) ## now we set up a loop to find the valid key value pairs, which must contain only one "=" #foreach( $kvPair in $tokenisedAmpersand )  #set($countEquals = $kvPair.length() - $kvPair.replace("=", "").length())  #if ($countEquals == 1)   #set($kvTokenised = $kvPair.split("="))   #if ($kvTokenised[0].length() > 0)    ## we found a valid key value pair. add it to the list.    #set($devNull = $tokenisedEquals.add($kvPair))   #end  #end #end ## next we set up our loop inside the output structure "{" and "}" { #foreach( $kvPair in $tokenisedEquals )   ## finally we output the JSON for this pair and append a comma if this isn't the last pair   #set($kvTokenised = $kvPair.split("="))  "$util.urlDecode($kvTokenised[0])" : #if($kvTokenised[1].length() > 0)"$util.urlDecode($kvTokenised[1])"#{else}""#end#if( $foreach.hasNext ),#end #end }  | 
					
保存します。
slackでOutgoing Webhooksを設定する
slackのログインしている状態でCustom IntegrarionsでOutgoing Webhooksを追加して設定します。
※Team Settingsで画面上部の検索窓(Search app directory)で「Outgoing Webhooks」を検索するとわりとたどりつきやすいです。

[Add Configuration]で設定します。
- Channel トリガーとするチャンネルを指定します。全チャンネルにしたいので「Any」を設定しました。
 - Trigger Word(s) チャンネルを指定している時はブランクでもOKですが、「Any」にしている時は設定が必要です。今回はbotの名前をトリガーワードにしました。
 - URL(s) Lambda(API Gateway)で設定したAPI endpoint URLを設定します。
 - Customize Name botの名前を設定します。
 - Customize Icon botのアイコンを設定します。
 
これで準備完了です。
例えば、Trigger Word(s)を「test-bot」とかにしていれば、「test-bot おはよう」のように投稿すれば返事が帰ってきます。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-  
            
              - 
      
S3署名付きURL(GetObject)生成後にオブジェクトを上書きアップロードしたら
ダウンロードリクエストを実行したタイミングのオブジェクトがダウンロードされるので …
 
-  
            
              - 
      
AWS Systems Manager Session ManagerでLinuxインスタンスのRun Asサポートを有効にする
AWS Systems Manager Session Managerの設定画面 …
 
-  
            
              - 
      
Amazon RDS MySQLでCSVをload data するときに「Access denied」発生
超小ネタです。 AWSのデータベースサービスの Amazon RDSのMySQL …
 
-  
            
              - 
      
EC2ユーザーデータからメタデータを取得してRocket.Chatで80ポートを使用する
Rocket.Chatのデフォルトポート番号は3000です。 80を使うようにす …
 
-  
            
              - 
      
AlexaにAWSの最新Feedを読み上げてもらう(Lambda Python)
年末にAmazon Echo Dotを購入しましたので、練習がてらAlexaスキ …
 
-  
            
              - 
      
EC2 Instance Connect向けのセキュリティグループのソースにプレフィックスリストを
EC2 Instance Connect、便利ですね。 キーペア不要で、EC2イ …
 
-  
            
              - 
      
T3.nanoで仮想メモリ割当をユーザーデータで実行する
T3.nanoはメモリがだいたい500MBです。 実行する処理によってはメモリエ …
 
-  
            
              - 
      
「AWSではじめるLinux入門ガイド 」を執筆しました
2020年4月30日に、「AWSではじめるLinux入門ガイド」という本を発行い …
 
-  
            
              - 
      
EFSのマウントターゲットがデフォルトで作成されるようになってました
ひさしぶりにAmazon EFSファイルシステムを作成しました。 作成手順がすご …
 
-  
            
              - 
      
AWS Glueチュートリアル
AWS Glueのマネジメントコンソールの左ペインの一番下にチュートリアルがあり …
 
