😎

AWS::Serverless::Apiリソースとその使い方

2022/09/24に公開

背景

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から参照することはできない。
脚注
  1. https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-api.html ↩︎

  2. https://book.impress.co.jp/books/1121101032 ↩︎

  3. https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-api.html#sam-resource-api-return-values ↩︎

  4. https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-api.html#sam-property-function-api-properties ↩︎

Discussion