##構成
[Client] ⇒(リクエスト ※1)⇒ APIGateway ⇒ Lambda
※1
IAM認証・・・不正リクエスト対策
※Client PCがウイルスにかかり、APIにリクエストが動く場合など
IP制限 ・・・不正アクセス対策
##POSTのAPI リクエストのcontent-type
世の中のAPIを見ると、リクエストのcontent-typeが、
application/jsonのものと、application/x-www-form-urlencodedのものがあります。
両方に対応しているAPIもありました。
application/jsonの数が増えつつあるというところでしょうか。
flg=1&id=2
{"flg":1,"id":2}
##API Gatewayの設定について
####・リソースポリシーで、IP制限を設定
https://aws.amazon.com/jp/premiumsupport/knowledge-center/api-gateway-resource-policy-access/
####メソッドリクエストで、IAM認証を設定
https://aws.amazon.com/jp/premiumsupport/knowledge-center/iam-authentication-api-gateway/
####ゲートウェイレスポンスについて。
カスタマイズで、{"message":}のフォーマットを変更してしまったが。
次回からは変更しない方がいい気がしています。
変更すると、エラーの内容によってフォーマットが変わるから、全部合わせて変更しないと気になります。
####・統合リクエストで、Lambdaプロキシ統合を選択
要件を満たせる場合は、個人的にLambdaプロキシ統合での作成が好きです。
APIGateway内でリクエストご編集したり、レスポンスを編集したりしなくていい。Lambda開発で完結するため。
https://qiita.com/yuuwatanabe/items/a3bd65e709f20574b6db
####・IAM認証用のユーザーの作成について
ポリシーについては、必要な権限のみ振り出す。
https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-iam-policy-examples-for-api-execution.html
より
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": [
"arn:aws:execute-api:us-east-1:*:a123456789/test/POST/mydemoresource/*"
]
}
]
}
##Lambdaの設定について
####・Lambdaプロキシ統合のため、レスポンスの形式が決まっています。https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format
{
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
"body": "..."
}
####・コールドスタート対策について
①コールドスタートを発生させないようにする
Provisioned Concurrency ※常時コンテナ作っておく。お金かかる。
https://dev.classmethod.jp/articles/lambda-provisioned-concurrency-coldstart/
※コンテナの作成数を超えると、もちろんコールドスタートは発生します。
②コールドスタートのレイテンシーを短くする
1.Lambdaのメモリを増やす。
⇒メモリを増やすと、CPUが変わる(性能よくなる)ので、
変更し、APIGatewayのアクセスログのレイテンシーを見ながら調整できます。
※Lambdaデプロイ後の一回目は必ずコールドスタートになります。
2.追加ライブラリを減らす。サイズを減らす
コールドスタート時には、追加ライブラリをコンテナにダウンロード、
展開が行われます。
なので、減らず、サイズを小さくするとその分時間短縮になります。
https://dev.classmethod.jp/articles/remote-py-2-lambda-tuning/
※元々、boto3を追加しようとしていたのですが、
python3.7でboto3を追加しなくてもライブラリが使えました。
マニュアルには、python3.8~と記載していたような。。
3.コードの調整
※実際コードをあれこれ変更してわかった
以下の定義を、Dynamodbへのリクエストを関数ごとに
3回記載していたのですが。
dynamodb = boto3.resource('dynamodb')
これを、グローバル変数にして、
DYNAMODB = boto3.resource('dynamodb')
各関数で以下のようにすると、レイテンシーがかなり変わりました。
DYNAMODB.Table('user')
####・テストについて
Lambdaのテスト>テストイベント>テンプレートのapigateway-aws-proxy があります。(lambdaプロキシ統合用)
##テストについて
使用可能であれば、POSTMANが便利です。
※IAM認証の設定もさくっとできます。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/iam-authentication-api-gateway/