AWS::ApiGateway::Stage と AWS::ApiGateway::Deployment の違い

CloudFormationでAPI Gatewayを作成する際の AWS::ApiGateway::StageAWS::ApiGateway::Deployment の役割分担というか違いがよくわからないまま、適当なサンプルを使いまわして雰囲気で使っていたのですが、やっとわかってきたので、メモです。

  • AWS::ApiGateway::Stage
    • ステージを表す。ステージはAPI Gatewayに複数ありえる。典型的には本番環境と検証環境の2つ
    • ステージだけが存在してデプロイがないとAPIは機能しない
    • DeploymentId プロパティで AWS::ApiGateway::Deployment を参照することでデプロイとステージが紐づく
    • AWS::ApiGateway::Stage - AWS CloudFormation
  • AWS::ApiGateway::Deployment
    • ステージへのデプロイを表す
    • ステージがないとステージだけでは意味がない
    • AWS::ApiGateway::StageDeploymentId プロパティが AWS::ApiGateway::Deployment を参照することでデプロイとステージが紐づく
    • AWS::ApiGateway::Stage がなくても AWS::ApiGateway::DeploymentStageName プロパティがあればその名前のステージが作成される(これが理解を妨げる混乱の元だった)
    • AWS::ApiGateway::Deployment - AWS CloudFormation

API Gatewayのステージングの機能を使わずに本番用ステージひとつだけのCloudFormationは次のようになります。

AWSTemplateFormatVersion: '2010-09-09'

Resources:
  SampleApiGateway:
    Type: AWS::ApiGateway::RestApi
    ...
  SampleApiGatewayProdStage:
    Type: AWS::ApiGateway::Stage
    Properties:
      DeploymentId: !Ref SampleApiGatewayDeployment
      RestApiId: !Ref SampleApiGateway
      StageName: Prod
  SampleApiGatewayDeployment:
    Type: AWS::ApiGateway::Deployment
    Properties:
      RestApiId: !Ref SampleApiGateway

または AWS::ApiGateway::Stage を省略すると次のようになります。 StageNameAWS::ApiGateway::Deployment に必須になります。

AWSTemplateFormatVersion: '2010-09-09'

Resources:
  SampleApiGateway:
    Type: AWS::ApiGateway::RestApi
    ...
  SampleApiGatewayDeployment:
    Type: AWS::ApiGateway::Deployment
    Properties:
      RestApiId: !Ref SampleApiGateway
      StageName: Prod