AWS::Serverless::Apiリソースとその使い方
背景
AWS SAM CLIでLambdaとAPIGatewayを使ったチュートリアルでは、AWS::Serverless::FunctionリソースのEventSourceを使って暗黙的にAPIGatewayの作成をやる流れが多いです。
一方で、AWS::Serverless::Apiリソースというものも用意されています。これを使うことで明示的なAPIGatewayの作成ができます。
ただ、明示的に作成したAWS::Serverless::ApiリソースをAWS::Serverless::FunctionリソースのEventSourceからどのように使うのかググってもあまり出てこず、調べた内容を記事としてまとめます。
(多分、間違っているところが多いと思うのでマサカリ歓迎です。。。!!!)
AWS::Serverless::ApiリソースとEventSource
AWS::Serverless::Apiリソースのドキュメントのサンプル[1]によると、作成したAWS::Serverless::Apiリソースは、AWS::Serverless::FunctionリソースのEventSourceのRestApiIdから参照すれば良さそうです。
とある本[2]では、!Ref ApiGatewayApi
のようにリファレンス関数を挟んでいますが、結局これで返ってくる値はApiGatewayApi
というIDなので挟む必要はあまりなさそうです[3]。
また、EventSourceからは、下記のようにType: Api
でApiGatewayのEventであることを明記した上でRestApiIdから参照すると良いみたいです。
Events:
ApiEvent:
Type: Api
Properties:
Path: /
Method: get
RestApiId:
Ref: ApiGatewayApi
ただ、注意点としてドキュメントによると他のSAMもしくはCloudFormationで作成したAPIGatewayを参照することはできない模様です[4]。
DefinitionUriとDefinitionBody
脇道に逸れますが、AWS::Serverless::Apiリソースについてググっていたときに、DefinitionUriとDefinitionBodyを明示的に指定している記事を見つけました。
これは、APIについて説明するためのOpenAPI仕様を指定するものです。
ドキュメントによると、DefinitionUriとDefinitionBody共に指定しない場合は、SAMがtemplateの設定基づいて、DefinitionBodyを自動的に生成してくれます。
(ただ、生成したOpenAPI仕様にどのようにアクセスすれば良いのかは見つけられませんでした・・・)
AWS::Serverless::Apiリソースの使い道
AWS::Serverless::FunctionリソースのEventSourceでApiGatewayを生成できるにもかかわらず、どのようなときにAWS::Serverless::Apiリソースを使うのでしょうか?
結論から説明すると、認証などを組み込んだ複雑なAPIGatwayを使うときにAWS::Serverless::Apiリソースをを使うようです。
例えば、Cognito認証を使う場合は、以下のようなプロパティのAWS::Serverless::Apiリソースを作ります。
Resources:
ApiGatewayApi:
Type: AWS::Serverless::Api
Properties:
StageName: Prod
Cors: "'*'"
Auth:
DefaultAuthorizer: MyCognitoAuthorizer
Authorizers:
MyCognitoAuthorizer:
UserPoolArn:
Fn::GetAtt: [MyCognitoUserPool, Arn]
まとめ
- AWS::Serverless::Apiリソースを使えば複雑な設定のAPIGatewayを作ることができる。
- 作成したAPIGatewayはAWS::Serverless::FunctionリソースのEventSourceのRestApiIdで IDを参照する。
- 制約として他のSAMやCloudFormationで作成したAWS::Serverless::ApiリソースをAWS::Serverless::FunctionリソースのEventSourceから参照することはできない。
-
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-api.html ↩︎
-
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-api.html#sam-resource-api-return-values ↩︎
-
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-api.html#sam-property-function-api-properties ↩︎
Discussion