2018年7月13日金曜日

【AWS Lambda】API Gateway の疎通確認

株式会社ジェニシス 技術開発事業部の遠藤 太志郎(Tacy)です。

最近、AWSをフル活用して社内システムを作ったので、そのノウハウのご紹介を行っています。

ただいま、Lambdaで関数作りを頑張っています。

試しに繋いでみるか

前回「【AWS Lambda】Webリクエストの受付」でひとまずAPI Gatewayをトリガーにくっつけました。

これでもうURLが存在しているのでアクセスしてみましょう。




  • {"message": "Internal server error"}

Internal server error!!

初期状態では動かない!!

テストでは正常

しかしですね、Lambdaのテストでは正常なんですよ。



テストでは正常なのに、実際にアクセスするとエラー。

ここで躓く人って結構多いんじゃないでしょうか?

私も苦労しました。

原因

実はですね、Lambdaのテストは「ラムダ関数だけ」のテストで、API Gatewayは関係無いんですよ。

つまり、上記の状況は

  • ラムダ関数は正常である。
  • API Gatewayでエラーを起こしている。

という状況なのです。

API Gatewayエラーの原因

API Gateway がエラーになる原因。

ログとかそういうの一切出ないですから!!

ネット調査で特定しました。



API Gatewayでは、以下の形式でレスポンスを返さなければいけないと書かれています。

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}


関数

つまり、API Gatewayを通せるようにLambda関数を書かねばなりませんから。

def lambda_handler(event, context):
    # TODO implement
    return 'Hello from Lambda'

これを

def lambda_handler(event, context):
    # TODO implement
    return {
        "isBase64Encoded": False,
        "statusCode": 200,
        "headers": {},
        "body": "Hello from Lambda"
    }

こうする!!

結果

無事に表示されました。



これ、知らなけれ本当に意味分からないので、ここで躓かないよう注意して下さい。

続く

引き続きエAPI Gatewayの掘り下げを進みます。

9 件のコメント: