AWS Cloud9 で API Gateway からの Lambda 実行

 前回の記事で Cloud9 での Lambda Function 開発について書きましたが、 Cloud9 から API Gateway 経由での Lambda Function 実行について書いていなかったので今回はそのやり方について書いておきます。

ローカル実行

 まずはローカルで API Gateway 経由で Lambda Function を動かしてみます。実行用のペインのプルダウンから API Gateway (local) を選択します。

f:id:akanuma-hiroaki:20190126192904p:plain

 そして Run ボタンをクリックすればローカルで実行できます。

f:id:akanuma-hiroaki:20190126181123p:plain

 ただ、前回実装した内容だと、下記のように Internal Server Error になってしまいます。

f:id:akanuma-hiroaki:20190126184900p:plain

 ローカル実行だと詳細なログが出ないようなのですが、同じ内容をリモートの環境で動かすと下記のエラーが出ています。

Execution failed due to configuration error: Malformed Lambda proxy response

 これは Lambda Function が返すレスポンスが API Gateway が期待するフォーマットになっていなかったことによるものです。下記ページにもその内容が書かれています。

aws.amazon.com

 API Gateway 経由で Lambda Function を使うには、 Lambda Function のレスポンスは下記のフォーマットの json で返す必要があります。

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

 なので実装を下記のように変更します。変更したのは return の内容のみです。

import boto3

PHONE_NUMBER = "8180XXXXXXXX"
MESSAGE = "Test Message from Lambda"

sns = boto3.client('sns')

def lambda_handler(event, context):
    sns.publish(PhoneNumber = PHONE_NUMBER, Message = MESSAGE)
    return {
        'body': 'Sent SMS',
        'statusCode': 200,
        'isBase64Encoded': False
    }

 変更後に再度実行すれば良いのですが、私が試した限りでは、このまま API Gateway (local) で再実行しても、 Lambda Function の変更内容が反映されませんでした。一度 Lambda (local) を実行してから実行することで Lambda Function の変更内容が反映されて API Gateway 経由で実行されるようになり、下記のように成功レスポンスが返るようになります。

f:id:akanuma-hiroaki:20190126192606p:plain

リモート実行

 Lambda Function をリモートにデプロイした後は、リモートの API Gateway 経由の実行も可能です。実行用のペインのプルダウンで API Gateway (remote) を選択します。

f:id:akanuma-hiroaki:20190126192127p:plain

 あとはこれまで同様に Run ボタンをクリックするだけです。

f:id:akanuma-hiroaki:20190126192252p:plain

 リモートの API Gateway 経由で Lambda Function が実行され、結果が表示されます。

f:id:akanuma-hiroaki:20190126192350p:plain

まとめ

 ローカルで Lambda Function の実装を変更した場合に、 API Gateway での再実行だけではなく一度 Lambda Function 単体で実行しないと反映されないというのはちょっとわかりづらいところでしたが、それ以外は特に難しいことはなくローカルでもリモートでも Cloud9 から実行することができました。 Lambda Function を使用する場合には API Gateway を組み合わせるケースが多いと思いますので、 Cloud9 でそこも含めて開発できるのは便利ですね。