AWS SAMで「Stage」ステージが作られるバグを回避する
AWS::Serverless::ApiのOpenApiVersionを指定すればOK
先日、AWS SAMのチュートリアルを進めていて、アプリケーションをデプロイした際、API Gatewayに2つのステージ(「Prod」と「Stage」)が作られ、不思議に思いました。必要なのは「Prod」だけです。調べると、これはSAMのバグで、すでに回避策が提供されていることが分かりました。本記事では、その回避策をご紹介します。
回避策:AWS::Serverless::ApiのOpenApiVersionを指定する
その回避策とは「SAMテンプレートのAWS::Serverless::Apiリソースに対するOpenApiVersionの指定」です。GitHubのissueで正式な回避策として紹介されています。
OpenApiVersionに指定できる値は下記の通りです。
This can either be
2.0
for the Swagger specification, or one of the OpenApi 3.0 versions, like3.0.1
. For more information about OpenAPI, see the OpenAPI Specification.
Globalsセクションで指定する場合
実際の指定先として手っ取り早いのはGlobalsセクションです。下記のように指定するだけで、不要な「Stage」ステージが作られなくなります。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31Globals:
Function:
Timeout: 3
Api:
OpenApiVersion: 3.0.2Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.7
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
Resourcesセクションで指定する場合
もしくは下記のように、AWS::Serverless::FunctionリソースのEventSource側で指定しても、不要な「Stage」ステージが作られなくなります。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31Globals:
Function:
Timeout: 3Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.7
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
RestApiId:
Ref: HelloWorldApiGatewayApi
HelloWorldApiGatewayApi:
Properties:
StageName: Prod
OpenApiVersion: 3.0.2
Type: AWS::Serverless::Api
回避策が使えるAWS SAM CLIのバージョン
この回避策はAWS SAM CLI 0.22.0以降であれば使えるはずです。aws-sam-translator 1.13.0で回避策が追加され、AWS SAM CLI 0.22.0で依存しているaws-sam-translatorのバージョンが上がりました。
まとめ
AWS SAMで余分な「Stage」ステージが作られるバグについて、回避策をご紹介しました。余分なステージを作ってもメリットはないので、忘れずに回避しましょう。