📝

CloudFormationでAPI GatewayとLambdaを作るメモ

2023/05/16に公開

はじめに

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

プロダクトだったらDisableExecuteApiEndpointtrueの方がいいかも
falseにしておけばhttps://{api_id}.execute-api.{region}.amazonaws.comで呼べるから、テストするときに分かりやすい

AWS::ApiGateway::Resource

  • ParentId
    • 前述のAWS::ApiGateway::RestApiからFn::GetAttRootResourceIdを受け取る
  • RestApiId
    • 前述のAWS::ApiGateway::RestApiFn::Refするだけ
  • PathPart
    • APIのresourceを決める

ParentIdって本当に必要なんですか

RestApiIdを指定したらParentIdも分かると思うんですけど💢
って思ったけど、複数のリソースが階層構造になってる場合があるんだね 啓蒙されり

AWS::ApiGateway::Method

RestApiIdは前述の通り
ResourceIdにはこのメソッドで操作するAWS::ApiGateway::ResourceFn::Refで渡すだけ
Uriではバックエンドで実行するLambdaを指定する
e.g.) arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${FooFunction.Arn}/invocations

HttpMethodIntegration:IntegrationHttpMethod

プロパティ名 何に関するメソッドなのか
HttpMethod クライアントからAPI Gatewayへのリクエスト
Integration:IntegrationHttpMethod API Gatewayからバックエンドへのリクエスト

Integrationの方は基本的にPOSTしか使わない
それとも使えない?少なくともGETではエラーが出た

MethodResponse

CORS設定をしたい場合はここのResponseParametersで定義すると楽
ソースコード内でヘッダーを作らなくてもよくなる
なおレスポンスボディの形式まできっちり決める場合、AWS::ApiGateway::Modelも作成する必要がある
しかし今回はLambdaのソースコード内で制御してる想定なので割愛

AWS::Lambda::Permission

lambda:InvokeFunctionを許可するだけ
Principalapigateway.amazonaws.com

AWS::ApiGateway::Deployment

定義したAWS::ApiGateway::MethodDependsOnで全て指定しておいた方がいい
後から追加したときなど、メソッドが反映されないことがある
理解が難しいプロパティは特にない

Outputs

デプロイ後にエンドポイントが必要になるはずなので、必須ではないがExportしておくべき
jqで楽に取得できるようになってQoLが上がる 地球温暖化も解決する

最後に

API Gatewayだけで必要なリソースが色々あるのつらい
コンソールで触らずにいきなりCloudFormationから挑戦するのは匹夫の勇
本当の勇気とは別のものだ

Discussion