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