はじめに
API Gateway・Lambda(Python)環境構築にあたり、
わからないことをしらみ潰しに調べたので、
そのメモを公開します。
まず、前提として以下の記事を参考に作ってみて下さい
【API Gateway】AWS Lambda統合のPythonでHello, world
動作の流れ
クライアント→API Gateway→Lambdaの順で呼び出される
※GET、POST、PUT、PATCH、DELETEなどに対応している
API Gateway
AWS または他のウェブサービス、AWS クラウドに保存されているデータにアクセスする API を作成できます。
要はクライアントから見たエンドポイントになってくれるサービス
完全マネージド型サービスのため、サーバレスアーキテクチャとして使用できます。
また、API Gatewayから呼び出すサービスの選択肢は以下があります。
1.Lambda
⎻ AWSのLambdaファンクションの呼び出し
2.HTTP
⎻ EC2上で構築したWebAPIや外部のWebサービスの呼び出し
3.Mock
⎻ バックエンドが未実装などの場合に、API Gatewayから直接固定的なレスポンスを返すことが可能
4.AWS Service
⎻ 各AWSのサービスの呼び出し
⎻ Lambdaファンクションを非同期で呼び出す場合などに利用
細かい動作内容
API GatewayへのアクセスはHTTPSが使用される
受け取り後の処理順序はメソッドリクエスト→統合リクエスト→Lambdaの順に処理され、
Lambda→統合レスポンス→メソッドレスポンスの順に返却処理が行われる。
メソッドリクエスト
受け取った内容(GETリクエストならパスパラメータ、POSTならbody本文に記載される)の認証・入力チェックを行う
※チェック不要の場合、デフォルトのままでOK
####認証
呼び出し元の制限を行いたい場合設定
IAMや呼び出し元IPアドレスの制限、CORSなどがある
※外部公開のWebページ上のスクリプトからの呼び出しを想定したAPIの場合、
CORSを使用し、呼び出し元オリジンを検証する
####入力チェック
各パラメータの必須チェックがしたい場合に設定
例えばGETリクエストの場合
https://ドメイン名/dev/apiName
というAPIアクセスポイントを作成し、nameというパスパラメータを必須にした場合
https://ドメイン名/dev/apiName?name=dog
は200のステータスを返し、
https://ドメイン名/dev/apiName?id=001
は400(形式不正)のステータスを返すように設定可能
###統合リクエスト
呼び出し先へのパラメータ設定を行う
lambdaを利用する場合
マッピングテンプレートを利用しJSON形式のデータを渡す
{
"dogName": "$input.params('name')"
}
$input変数は、API Gatewayへのパラメータに対する取得などの関数を提供する変数
上記例はGETリクエストの"name"パスパラムの値を"dogName"というキーとしてJSONに定義している。
※その他のメソッドが知りたい場合は、公式ドキュメント参照
API Gateway マッピングテンプレートとアクセスのログ記録の変数リファレンス
※文字列のチェックやエンコード・デコードは$util変数のメソッドを使用可
Lambda
AWS Lambda はサーバーをプロビジョニングしたり管理する必要なくコードを実行できるコンピューティングサービスです。
自分はコードを書いてアップするだけで、良い感じにしてくれるサービス(しゅごい!)
サーバー用意して、環境構築して、、、みたいなことが一切不要になる
特に説明することがないため、コードサンプルの解説
以下のソースは呼び出しが行われたら、何もせず
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': {
"message": event["dogName"],
"data":json.dumps('Hello from Lambda!')
}
}
eventの中にAPIGatewayで設定した値がマッピングされているため、
今回の例は上記マッピングテンプレートで設定した"dogName”を取得している。
json.dumpsとは
Pythonの関数の一つ
デフォルトはUnicodeでエンコードするため、文字化けする場合は、
json.dumps(dict, indent=2, ensure_ascii=False)と記載する
参考:Pythonでjson dumpsを使いこなそう!
event変数について
呼び出し元のイベント情報(APIGatewayやDynamoDb)が格納されている
APIGatewayの場合は、統合リクエストで設定した値が入る
参考:Python の AWS Lambda Context オブジェクト
context変数について
呼び出し、関数、および実行関数に関する情報を示すメソッドおよびプロパティを提供します。
要約すると、実行環境に関する値がたくさん入っている。(あんまり使う場面ないかなー)
##まとめ
APIGatewayとLambdaを使えば、自分の考えたAPIがフルマネージドで提供できる
(しかも1年間無料!!)