目次
AWSを本格的に触り始めて3か月経ったので、試しにSlackアプリを作成してみました。
このアプリについて
1. “Hello”を送信する
2. [Translate to Japanese]を選択する
3. 翻訳された結果が返る

技術的要約
◇2と3の間で起きていること
2.1 SlackはエンコードされたURLを送信する
2.2 API gatewayはJSONに変換しLambdaへ送る
2.3 LambdaはデータをParseしAmazon Translateへ送り、SlackにPOSTする

#Parseされたデータ:event['message']['text'] = "hello"event['callback_id']] = "ja"event['response_url'] = "https://hooks.slack.com/app/ABCDE/12312341234/"#Amazon Translateに送られるデータ: ( Text=hello, SourceLanguageCode=auto, TargetLanguageCode="ja" )#Slackに送られるデータ:POST /app/ABCDE/12312341234/Host: hooks.slack.comContent-type: application/json{ "blocks":[ { "type": "section", "text": { "type": "mrkdwn", "text": "こんにちは" } } ]}1. Lambdaの作成
1. [一から作成]
2. 関数名を入力する
3. ランタイムは、[Python 3.7]を選択する

[関数の作成]をクリックする
コードを編集できるようになるので全て選択し、以下のコードに置き換える

frombotocore.vendored importrequestsimport boto3import jsondef create_slack_payload(text): return { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": text } } ] } def lambda_handler(event, context): msg = event['message']['text'] target_language = event['callback_id'] response_url = event['response_url'] print("翻訳前:" + msg) print("response_url:" + response_url) print("callback_id:" + target_language) print(json.dumps(create_slack_payload(msg))) client = boto3.client('translate') translate_response = client.translate_text( Text=msg, SourceLanguageCode='auto', TargetLanguageCode=target_language ) translated_text = translate_response["TranslatedText"] print("翻訳後:" + translated_text) r = requests.post(response_url, data=json.dumps(create_slack_payload(translated_text))) return r.json()関数をテストするために、テストイベントを設定する
ドロップダウンメニューをクリックし、[テストイベントの設定]を選択する以下のサンプルのJSONでテストイベントを作成する{ "type": "message_action", "token": "ABCDEFGHIJKabcdefghijk", "action_ts": "123456789.012345", "team": { "id": "ABCDE12345", "domain": "slack-domain" }, "user": { "id": "ZZAABBCC12", "name": "username" }, "channel": { "id": "ABCDEFG123", "name": "directmessage" }, "callback_id": "ja", "trigger_id": "123412341234.123412341234.12341234asdf1234asdf", "message_ts": "123412341234.0000000", "message": { "client_msg_id": "a1b2c3-a123-b456-b631-1191f49ab175", "type": "message", "text": "hello", "user": "ZZAABBCC12", "ts": "123412341234.0000000", "team": "ABCDEFG1234" }, "response_url": "https://hooks.slack.com/app/ABCDE/12312341234/12341234asdfaf"}下部の[保存]をクリックして、テストイベントを保存する
右上の[保存]をクリックして、関数も保存する
◇実行ロール:
Lambda関数はAmazon Translateを呼び出すので、IAMロールが必要 Lambda関数のページで、[実行ロール]までスクロールダウンする
“YOUR-ROLE-NAME roleを表示”をクリックすると、IAMコンソール画面が開く

[ポリシーをアタッチします]をクリックする
“translate” と検索し“TranslateReadOnly”ロールを選択する

[ポリシーをアタッチします]をクリックする
“translate” と検索し“TranslateReadOnly”ロールを選択する

下部の[ポリシーをアタッチ] をクリックする
Lambda関数に戻り、正しい権限があるかDesignerを確認する

ここで、先ほど作成したLambda関数をテストできる
[テスト] をクリックし以下の画面が表示される
[ログ出力]の下部では以下の画面が表示される

2. API Gatewayの作成
API Gatewayの画面で、[APIの作成]をクリックする

[アクション] -> [メソッドの作成]をクリックする

“POST”メソッドを作成する
統合タイプで[Lambda関数]を選択する
[保存]をクリックする


“OK” をクリックし、権限を追加する

次にエンコードされたURLデータをJSONに変換するために、マッピングテンプレートを作成する
[統合リクエスト]をクリックする
[マッピングテンプレート]で、テンプレートを新規作成する
[マッピングテンプレートの追加]をクリックする


マッピングテンプレートは以下:
application/x-www-form-urlencoded
#set($test = $input.body.substring(0,8))
#if($test == "payload=")
#set($encodedJSON = $input.body.substring(8))
$util.urlDecode(${encodedJSON})
#end次に、APIをデプロイする
[アクション]メニューで、 [APIのデプロイ]をクリックする

ステージを指定する

URLをコピーする
これはSlackアプリ作成時に必要

3. Slackにインストール
https://api.slack.com/apps
[Create an App]をクリックする
アプリ名を入力し、 [Create App]をクリックする
[Interactive Components]で、スイッチをオンにする。
Request URLのために、 API GatewayからURLをペーストする


Actionsで、 [Create New Action]を作成する
下記のように入力し、 [Create]をクリックする

メモ: 最大5個のアクションを作成可能。 Amazon Translateを呼び出すときに“Target Language” としてCallback IDは使われる。

[Install App] で[Install App to Workspace]をクリックする
最後に
最初に示した動作が確認できると思います。

デバッグ
ちなみに今回初めてデバッグのために、CloudWatchでログの確認もしてみました🙂

- カテゴリー