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

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

新規登録して質問してみよう
ただいま回答率
85.31%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

AWS Lambda

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

Q&A

解決済

2回答

740閲覧

LINE Messaging APIのWebhookからAWS API Gatewayにアクセスできない

yoshiharu125

総合スコア1

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

AWS Lambda

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

0グッド

0クリップ

投稿2024/01/03 01:39

実現したいこと

LINE Messaging APIからAWS API Gateway経由でLamdaにメッセージを連携し、鸚鵡返しするLINE Botを作成しようとしています。

前提

LINE Messaging APIのWebhook URLに、Lambdaの関数URLを設定すると検証に成功し、LINEのチャットからも期待通り鸚鵡返しされますが、
Lambda実行のトリガーとなるAPI Gatewayを作成し、デプロイした後に発行されるURLを指定すると、403 Forbiddenになります。
API Gatewayの設定は以下の通りです。

■APIタイプ:REST
■メソッドタイプ:POST
■メソッドリクエスト
認可:NONE
API キーは必須です:False
リクエストバリデーター:クエリ文字列パラメータおよびヘッダーを検証
SDK オペレーション名:メソッドとパスに基づいて生成されました
リクエストパスなし
URL クエリ文字列パラメータなし
HTTP リクエストヘッダー:x-line-signature 必須
リクエスト本文なし

■統合リクエスト
統合タイプ:Lambda
Lambda プロキシ統合:True

発生している問題・エラーメッセージ

デプロイ後に発行されるURLをWebhookURLに設定し、検証ボタンを押すと、以下のメッセージが発生します。

ボットサーバーから200以外のHTTPステータスコードが返されました。(403 Forbidden) LINEプラットフォームから送信されたHTTP POSTリクエストに対してボットサーバーがステータスコード200を返すことを確認してください。詳しくは、Messaging APIリファレンスのレスポンスを参照してください。

該当のソースコード

Lamda関数は以下の通りです。
言語:Python3.12

コード

import os, sys from linebot import (LineBotApi, WebhookHandler) from linebot.models import (MessageEvent, TextMessage, TextSendMessage,) from linebot.exceptions import (LineBotApiError, InvalidSignatureError) line_bot_api = LineBotApi(os.getenv('LINE_CHANNEL_ACCESS_TOKEN')) handler = WebhookHandler(os.getenv('LINE_CHANNEL_SECRET')) def lambda_handler(event, context): signature = event["headers"]["x-line-signature"] body = event["body"] ok_json = os.environ["ok_json"] error_json = os.environ["error_json"] @handler.add(MessageEvent, message=TextMessage) def message(line_event): text = line_event.message.text line_bot_api.reply_message(line_event.reply_token, TextSendMessage(text=text)) try: handler.handle(body, signature) except LineBotApiError as e: logger.error("Got exception from LINE Messaging API: %s\n" % e.message) for m in e.error.details: logger.error(" %s: %s" % (m.property, m.message)) return error_json except InvalidSignatureError: return error_json return ok_json

環境変数は設置済み
line-bot-sdkのパッケージはレイヤーに設定済

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2024/01/03 05:58 編集

API Gatewayのログを取得するように設定して、CloudWatch Logsに吐き出されてるログを確認してみてください。また、try,except文でエラーメッセージが出力されるようになっているようなのでその結果もお願いします。
yoshiharu125

2024/01/03 12:57

API gatewayのログは以下の通りで、「Missing Authentication Token」となっています。 ネットの記事を当たると、エンドポイントのURLが間違っているケースにこのメッセージとなることが多いようで、発行されたURL(末尾に「/ステージ名」がついている)にリソースのパスを付加したものでも試しましたが、同じく403 Forbiddenとなってしまいます。 なお、lamdaのログは出力されておらず、lamdaにアクセスする前にエラーとなっているようです。 { "requestId": "9a0b1095-e5a9-4e03-8f48-a7bc18d3e32e", "ip": "147.92.149.170", "caller": "-", "user": "-", "requestTime": "03/Jan/2024:12:42:40 +0000", "httpMethod": "POST", "resourcePath": "/Stage1", "status": "403", "errorMessage": "Missing Authentication Token", "protocol": "HTTP/1.1", "responseLength": "42" }
退会済みユーザー

退会済みユーザー

2024/01/03 13:24

ご推察の通り、API Ggatewayのエラーだと思います。認可がないのでURIがおかしいかもしれません。 https://ドメイン/ステージ/リソース の形になっているようですが、もう一度ご確認ください。 念のためちょっと私の環境で試したところ(CORS有効)GETは正常に終了しましたが、POSTが同じ結果となりました。postmanというAPI叩くツールにbody載せて試してみてください。
yoshiharu125

2024/01/07 02:13

https://ドメイン/ステージ/リソース の形で今一度試したところ、ステータスコードが「502」に変わり、ログを確認したところ、以下が出力されていました。 Execution failed due to configuration error: Malformed Lambda proxy response 以下のサイトを参照し、レスポンスのbodyの形式がjson文字列になっていないことが原因だと思われたため、以下のように修正したところ、正常に疎通できました。 https://qiita.com/polarbear08/items/3f5b8584154931f99f43 ■修正内容 ・環境変数 ok_json(error_jsonも同様) (誤){"isBase64Encoded":False,"statusCode":200,"headers":{},"body":"Success"} (正){"isBase64Encoded":False,"statusCode":200,"headers":{},"body":json.dumps("Success")} ・lambda_function.py 冒頭に以下を追加  import json 切り分けのアドバイス等いただきありがとうございました。
退会済みユーザー

退会済みユーザー

2024/01/07 03:24

解決おめでとうございます! 解決方法をまとめて、「自己解決」として回答してください! 同じように困っている人の貴重な情報になると思います。
guest

回答2

0

EchoAPIは、Webhookの設定もサポートしていて、Lambdaを使ってメッセージを処理するLINE Botを作成する際に、エラーなくスムーズに接続できます。これであなたのプロジェクトがもっと効率よく進むこと間違いなし!試してみてくださいね。

投稿2024/11/19 13:07

isai

総合スコア158

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

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

0

自己解決

①LINE Messaging APIのWebhook URLを以下の通り修正
(誤)https://ドメイン/ステージ 
※Lambda実行のトリガーとなるAPI Gatewayを作成し、デプロイした後に発行されるURL
(正)https://ドメイン/ステージ/リソース

②LambdaからLINEへのレスポンスのbodyをjson文字列に修正
(誤){"isBase64Encoded":False,"statusCode":200,"headers":{},"body":"Success"}
(正){"isBase64Encoded":False,"statusCode":200,"headers":{},"body":json.dumps("Success")}
合わせて、lambda_function.py 冒頭に以下を追加 
import json

投稿2024/01/07 08:30

yoshiharu125

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問