質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

1回答

3316閲覧

AWS Lambdaを用いてTeamsのbotを作成したい。

kkk_ss

総合スコア6

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2020/06/16 07:32

前提・実現したいこと

AWS LambdaでNode.jsを使用し、Microsoft Teamsからbotにメンションし、メッセージを送信すると返信が来るというものを作成したいと考えております。

以下のサイトを参考にしました。
https://docs.microsoft.com/ja-jp/microsoftteams/platform/webhooks-and-connectors/how-to/add-outgoing-webhook

https://github.com/OfficeDev/msteams-samples-outgoing-webhook-nodejs/blob/master/app.js

発生している問題

sharedSecretの部分にTeams上でbotを作成した際のトークンを入れて実行してみたもののタイムアウトしてしまいます。

エラーメッセージ
{
"errorMessage": "2020-06-16T07:15:53.991Z 4e27cf9e-0b56-41d3-a959-1d807df888ed Task timed out after 4.00 seconds"
}

該当のソースコード

exports.handler = function(event,context){
const crypto = require('crypto');
const sharedSecret = "<Security token generated by Microsoft Teams>";
const bufSecret = Buffer.from(sharedSecret, "base64");

var http = require('http');
var PORT = process.env.port || process.env.PORT || 8080;

http.createServer(function(request, response) {
var payload = '';
// Process the request
request.on('data', function (data) {
payload += data;
});

// Respond to the request request.on('end', function() { try { // Retrieve authorization HMAC information var auth = this.headers['authorization']; // Calculate HMAC on the message we've received using the shared secret var msgBuf = Buffer.from(payload, 'utf8'); var msgHash = "HMAC " + crypto.createHmac('sha256', bufSecret).update(msgBuf).digest("base64"); // console.log("Computed HMAC: " + msgHash); // console.log("Received HMAC: " + auth); response.writeHead(200); if (msgHash === auth) { var receivedMsg = JSON.parse(payload); var responseMsg = '{ "type": "message", "text": "You typed: ' + receivedMsg.text + '" }'; } else { var responseMsg = '{ "type": "message", "text": "Error: message sender cannot be authenticated." }'; } response.write(responseMsg); response.end(); } catch (err) { response.writeHead(400); return response.end("Error: " + err + "\n" + err.stack); } });

}).listen(PORT);

console.log('Listening on port %s', PORT);
};

試したこと

Lamdaの設定でタイムアウトの時間を30秒~1分まで伸ばしてみましたが、同じでした。
APIGatewayのエンドポイントはTeams上でbotを作成する際のコールバックURLの欄に書き込んであります。また、Lambdaとも紐づいております。

備考

初心者のため、なぜタイムアウトしてしまうのか、またこのような書き方で合っているのかがわかりません。
どうかご教示いただけますと幸いです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

TeamsがわからないのでSlackの似たような仕組みを想像しながら書きますが、このソースの前提は以下のような感じでしょうか?

  • Teams からの outgoing-webhook で API Gateway にリクエストを飛ばす
  • API Gateway の裏で動いている lambda のソースが今回提示いただいたもの(webhookを受け取ってlambdaからteamsにメッセージを送る)

上記の前提であれば、lambda の書き方について認識が違うようです。

lambda で http server を立てる必要はなく、その役目は API Gateway が担ってくれます。

http server で listen しても、それが発動することはありません。よって、listenしたまま何もせずtimeoutしてしまったのではないでしょうか。

http server を使わずにそのまま teams にAPIを投げてしまうコードにすれば動くはずです。

なお、 API Gateway で受けたリクエストに関する情報(POSTパラメータなど)を使って何かしら動的な制御をしたい場合はlambdaハンドラの event 引数を使うと良いです。こちらが参考になると思います。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/services-apigateway.html

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html

投稿2020/07/05 16:21

編集2020/07/05 16:23
hassaku_63

総合スコア92

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kkk_ss

2020/07/09 05:16

回答ありがとうございます!確かに認識が間違っていました。ご指摘していただいた方法で、再度試してみようと思いますm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問