前回の記事で Cloud9 での Lambda Function 開発について書きましたが、 Cloud9 から API Gateway 経由での Lambda Function 実行について書いていなかったので今回はそのやり方について書いておきます。
ローカル実行
まずはローカルで API Gateway 経由で Lambda Function を動かしてみます。実行用のペインのプルダウンから API Gateway (local)
を選択します。
そして Run
ボタンをクリックすればローカルで実行できます。
ただ、前回実装した内容だと、下記のように Internal Server Error になってしまいます。
ローカル実行だと詳細なログが出ないようなのですが、同じ内容をリモートの環境で動かすと下記のエラーが出ています。
Execution failed due to configuration error: Malformed Lambda proxy response
これは Lambda Function が返すレスポンスが API Gateway が期待するフォーマットになっていなかったことによるものです。下記ページにもその内容が書かれています。
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 経由で実行されるようになり、下記のように成功レスポンスが返るようになります。
リモート実行
Lambda Function をリモートにデプロイした後は、リモートの API Gateway 経由の実行も可能です。実行用のペインのプルダウンで API Gateway (remote)
を選択します。
あとはこれまで同様に Run
ボタンをクリックするだけです。
リモートの API Gateway 経由で Lambda Function が実行され、結果が表示されます。
まとめ
ローカルで Lambda Function の実装を変更した場合に、 API Gateway での再実行だけではなく一度 Lambda Function 単体で実行しないと反映されないというのはちょっとわかりづらいところでしたが、それ以外は特に難しいことはなくローカルでもリモートでも Cloud9 から実行することができました。 Lambda Function を使用する場合には API Gateway を組み合わせるケースが多いと思いますので、 Cloud9 でそこも含めて開発できるのは便利ですね。