前回記事での失敗
前回記事のAWS API Gatewayでモックを作ってみようで、API Gatewayの統合タイプ:MockでAPIのモックを作ってみました。
が、統合タイプ:MockではPOSTのリクエストデータが取得できないようでした。
(参考:teratail AWS API GatewayでHTTPリクエストのjsonを取得したい)
そのため今回は統合タイプ:Mockを使わず、統合タイプ:LAMBDAで作っていくことにします。
PythonでLambda関数を作る
-
Amazon Lambdaコンソールで
関数の作成ボタンから関数の作成画面に遷移する - 基本的な情報の
関数名に任意の関数名を入力する - 基本的な情報の
ランタイムで使用する言語を選択する(この記事ではPython 3.7を選んでいます) - 基本的な情報のアクセス権限でロールを選択する(ロールの説明は省略
説明できるほど詳しくないので) - 画面右下の
関数の作成ボタンをクリックする - 関数を作成する画面に遷移するので、関数コード欄にPythonコードを打ち込んでいく
Lambdaプロキシ統合を使用しない場合
- API Gatewayでの設定
- 統合タイプ:Lambda関数
- Lambdaプロキシ統合の使用:チェックOff
- Lambda関数コード
import json
def lambda_handler(event, context):
return {
'test_data': 123456,
'test_message': 'Hello, World!'
}
上記のように記述すると、ステータス 200としてreturnの内容がレスポンス本文として返されます。
ステータス 400等で返す場合は
import json
def lambda_handler(event, context):
raise Exception('400')
というような形で例外を発生させます。
例外を発生させた場合のレスポンス本文は、API Gatewayの統合レスポンスで設定します。
API Gatewayでメソッドレスポンスに該当ステータス(この場合は400)を追加し、統合レスポンスの該当ステータスのマッピングテンプレートにレスポンス本文を入力します。
Lambdaプロキシ統合を使用する場合
- API Gatewayでの設定
- 統合タイプ:Lambda関数
- Lambdaプロキシ統合の使用:チェックOn
- Lambda関数コード
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps(
{
'test': 123456,
'test_message': 'Hello, World!'
}
)
}
ステータス 400等で返す場合は、statusCodeとbodyを書き換えます。
Lambdaプロキシ統合を使用している場合はAPI Gatewayの統合レスポンスでレスポンス本文を設定する必要はありません。(というかLambdaプロキシ統合を使用している場合は統合レスポンスは触れない)
Lambdaプロキシ統合を使用する場合の出力の基本は以下になります。(公式ドキュメントより)
{
"isBase64Encoded" : "boolean",
"statusCode": "number",
"headers": { ... },
"body": "JSON string"
}
複数のリソースからのリクエストを振り分ける
Lambdaプロキシ統合を使用するとAPI GatewayのリソースパスをLambda関数で受け取ることができるので、リソース毎にLambda関数を作るのではなくLambda関数を一つにまとめてみましょう。
API Gatewayのリソースパスはevent['path']で取得できます。
import json
def lambda_handler(event, context):
path = event['path']
if path == '/proxy200':
return {
'statusCode': 200,
'body': json.dumps('Good Request!')
}
elif path == '/proxy400':
return {
'statusCode': 400,
'body': json.dumps('Bad Request..')
}
(API Gatewayで/proxy200と/proxy400というというリソースを作成した場合)
このようにevent['path']の値で処理内容を分ければ、一つのLambda関数で複数のリソースに対応できます。
次回
前回と今回の内容で、API Gatewayでのモック作りがある程度出来るようになりました。
次回はSlackからAPI Gatewayモック作りを行えるようにしてみます。
プチ連載
1回目 AWS API Gatewayでモックを作ってみよう
2回目 AWS API Gateway + Lambda (Python) でモックを作ってみよう(本記事)
3回目 Slack + Lambda (Python) でAWS API Gatewayモックを作ってみよう
We're hiring!
AIチャットボットを開発しています。
ご興味ある方は Wantedlyページ からお気軽にご連絡ください!
参考記事
Qiita 【API Gateway】AWS Lambda統合のPythonでHello, world
AWSドキュメント API Gateway で Lambda エラーを処理する