AWS API Gateway+Lambdaプロキシ統合で502エラー{"message": "Internal server error"}の時は戻り値を確認してみる

API Gateway+Lambdaプロキシ統合の場合のLambda関数の戻り値は指定の形式で返さないと、API Gateway側で502サーバーエラー(502 Bad Gateway)が返ってきてしまう。

{"message": "Internal server error"}

 

Lambdaプロキシ統合の場合のLambda関数の戻り値

↓戻り値は指定の形式については以下に記載があります。

プロキシ統合のための Lambda 関数の出力形式
API Gateway で Lambda プロキシ統合を設定する - Amazon API Gateway

 

必須の項目はstatusCode、headers、bodyみたいです。

必須の項目のみの場合は以下のような内容を返す必要があります。

Pythonの例

return {
    'statusCode': 200,
    'headers': {'Content-Type': 'application/json'},
  'body': json.dumps(responsebody)
}

必須項目以外にはisBase64Encoded、multiValueHeaders があるそうです。

 

エラーを返したい場合

同様に、エラーを返したい場合も上記の形式に合わせる必要があります。以下は500サーバーエラーのレスポンスを返したい場合の例です。

resbody = {'code': 'InternalServerError', 'message': '予期しないエラーが発生しました'}
return {
    'statusCode': 500,
    'headers': {'Content-Type': 'application/json'},
  'body': json.dumps(resbody, ensure_ascii=False)
}

 

400クライアントエラーでも、パラメーター不足などちょい詳しい情報を返してあげると優しいですよね。

resbody = {'code': 'MissingRequiredParameter', 'message': f'パラメーター {param_name} がありません。'}
return {
    'statusCode': 400,
    'headers': {'Content-Type': 'application/json'},
    'body': json.dumps(resbody, ensure_ascii=False)
}

 

 

よくあるHTTPのエラーレスポンスについて

↓よくあるHTTP ステータス コード、エラーコード、メッセージはこちらが参考になりました。

REST API エラーの処理
一般的なMicrosoft Defender for Endpoint API エラー | Microsoft Learn

 

↓むちゃ詳しい情報はこちら…
HTTP レスポンスステータスコード
HTTP レスポンスステータスコード - HTTP | MDN