CloudFormationでAPI GatewayとLambdaを作るメモ
はじめに
SQSやEventBridgeから呼び出すのはシンプルで分かりやすかったんですけど、API Gatewayとの連携がちょっと難しかったので復習をば
認証のことは考えてないです
AWS::Logs::LogGroup
Lambdaのログを保存する
LogGroupNameは/aws/lambda/{関数名}
AWS::IAM::Role
前述のLogGroup含め、Lambdaが触るリソースへのアクセス権限を網羅しておく
AWS::Lambda::Function
APIのバックグラウンド
PackageType
Imageでいいと思う
ECRが必要になるけど、諸々の制限がZIPより緩いから
Imageにした場合はCode:ImageUriにECR上のイメージURIを忘れずに指定することEnvironment:Variablesで環境変数を設定できるものの、DBへの認証情報などはSecrets Managerに保管する
AWS::ApiGateway::RestApi
プロダクトだったらDisableExecuteApiEndpointはtrueの方がいいかも
falseにしておけばhttps://{api_id}.execute-api.{region}.amazonaws.comで呼べるから、テストするときに分かりやすい
AWS::ApiGateway::Resource
-
ParentId- 前述の
AWS::ApiGateway::RestApiからFn::GetAttでRootResourceIdを受け取る
- 前述の
-
RestApiId- 前述の
AWS::ApiGateway::RestApiをFn::Refするだけ
- 前述の
-
PathPart- APIのresourceを決める
ParentIdって本当に必要なんですか
RestApiIdを指定したらParentIdも分かると思うんですけど💢
って思ったけど、複数のリソースが階層構造になってる場合があるんだね 啓蒙されり
AWS::ApiGateway::Method
RestApiIdは前述の通り
ResourceIdにはこのメソッドで操作するAWS::ApiGateway::ResourceをFn::Refで渡すだけ
Uriではバックエンドで実行するLambdaを指定する
e.g.) arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${FooFunction.Arn}/invocations
HttpMethodとIntegration:IntegrationHttpMethod
| プロパティ名 | 何に関するメソッドなのか |
|---|---|
| HttpMethod | クライアントからAPI Gatewayへのリクエスト |
| Integration:IntegrationHttpMethod | API Gatewayからバックエンドへのリクエスト |
Integrationの方は基本的にPOSTしか使わない
それとも使えない?少なくともGETではエラーが出た
MethodResponse
CORS設定をしたい場合はここのResponseParametersで定義すると楽
ソースコード内でヘッダーを作らなくてもよくなる
なおレスポンスボディの形式まできっちり決める場合、AWS::ApiGateway::Modelも作成する必要がある
しかし今回はLambdaのソースコード内で制御してる想定なので割愛
AWS::Lambda::Permission
lambda:InvokeFunctionを許可するだけ
Principalはapigateway.amazonaws.com
AWS::ApiGateway::Deployment
定義したAWS::ApiGateway::MethodをDependsOnで全て指定しておいた方がいい
後から追加したときなど、メソッドが反映されないことがある
理解が難しいプロパティは特にない
Outputs
デプロイ後にエンドポイントが必要になるはずなので、必須ではないがExportしておくべき
jqで楽に取得できるようになってQoLが上がる 地球温暖化も解決する
最後に
API Gatewayだけで必要なリソースが色々あるのつらい
コンソールで触らずにいきなりCloudFormationから挑戦するのは匹夫の勇
本当の勇気とは別のものだ
Discussion