#前回記事での失敗
前回記事の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 エラーを処理する