web-dev-qa-db-ja.com

「メッセージ」:Lambda / API GatewayおよびiOSでの「内部サーバーエラー」の問題

ラムダ関数を設定し、APIゲートウェイ内にいくつかのGETメソッドとPOST=メソッドを作成しました。これらは、Webアプリケーション内でテストすると正常に機能するようです。次に、内部で関数を呼び出そうとしています。モバイルハブを使用してセットアップされたiOSアプリケーション。機能はモバイルハブを介してテスト施設内でも完全に機能しますが、実際にアプリ内で機能をテストすると、次のようになります。

"message" : "Internal server error"

エラーの原因はそれほど多くないことはわかっていますが、より詳細なエラーの説明を取得する方法がわかりません。

何か案は?

10
user3599895

これは、Lambda関数がHTTPステータスコードを返すように設定されていないために発生する可能性があります。

からの変更

exports.handler = (event, context, callback) => {
    callback(null, 'Hello from Lambda');
};

exports.handler = (event, context, callback) => {
    callback(null, { statusCode: 200, body: 'Hello from Lambda' });
};

問題を修正する必要があります。

28

JSON.stringify()は私の問題を解決しました。 response.bodyString形式ではなくJSON形式である必要があります。これがお役に立てば幸いです。

exports.sendRes = (body, status = 200) => {
    var response = {
        statusCode: status,
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify(body)
    };
    return response;
};
1
Nikhil Manapure

その他の考えられる理由は、API Gateway(10MB)および/またはLambda(6MB)のペイロード/要求/応答の制限である可能性があります

0
user2313617

上記の答えはどれもうまくいきませんでした。許可の問題がありました。以下は私がそれを解決した方法です。

コンテキスト

これは私のラムダ関数です:

exports.handler = function(event, context, callback) {
  callback(null, {
    statusCode: '200',
    body: JSON.stringify({ 'message': 'hello world' }),
    headers: {
      'Content-Type': 'application/json',
    },
  });
};

私はterraformを使用してAPIゲートウェイとラムダをプロビジョニングしました。この ブログ投稿 で提供されているサンプルコードを使用しました。

診断

ラムダコンソールで、ラムダでテストイベントを実行しました。私のラムダは非常にベーシックだったので、hello worldテストテンプレートを使用し、名前を付けて保存しました。テストは成功を返します。

Cloudwatchのログを確認しましたが、何も見つかりませんでした。私はAWSを使い始めたばかりなので、何かを設定する必要があるかどうかわかりませんでした。

APIゲートウェイコンソールで、テストイベントを実行しました。イベントのヘッダーにContent-Type:application/jsonを追加して、テストを実行しました。奇妙な理由が何であれ、テスト結果はブラウザーの右側に返されたため、右にスクロールして確認する必要がありました。

私はこの結果を得ました:Execution failed due to configuration error: Invalid permissions on Lambda function

[〜#〜]ソリューション[〜#〜]

私はAPIゲートウェイとラムダ統合の基本的なTerraformの例 here を確認しましたが、aws_lambda_permissionリソースが欠落していることに気付きました。これは、ラムダ関数を呼び出すためにAPIゲートウェイに許可を与えるために必要です。

Terraformを使用していない人のために here は、適切な権限を作成する方法に関するawsドキュメントへのリンクです。

0
codeinaire

次のコードでも同じ問題が発生しました:

_exports.handler = async event => {
  console.log("hello world");
  return {
    statusCode: 200,
    body: event
  };
};
_

私がしなければならなかったすべてを修正するのはJSON.stringify()bodyでした。

_exports.handler = async event => {
  console.log("hello world");
  return {
    statusCode: 200,
    body: JSON.stringify(event), // <-- here
  };
};
_
0
Karl Taylor