AWS SAMで「Stage」ステージが作られるバグを回避する

AWS::Serverless::ApiのOpenApiVersionを指定すればOK

Takashi Iwamoto
VELTRA Engineering
4 min readJan 16, 2020

--

先日、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, like 3.0.1. For more information about OpenAPI, see the OpenAPI Specification.

Globalsセクションで指定する場合

実際の指定先として手っ取り早いのはGlobalsセクションです。下記のように指定するだけで、不要な「Stage」ステージが作られなくなります。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Globals:
Function:
Timeout: 3
Api:
OpenApiVersion: 3.0.2
Resources:
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-31
Globals:
Function:
Timeout: 3
Resources:
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」ステージが作られるバグについて、回避策をご紹介しました。余分なステージを作ってもメリットはないので、忘れずに回避しましょう。

--

--

Takashi Iwamoto
VELTRA Engineering

ENECHANGE株式会社VPoT兼CTO室マネージャー。AWS Community Builder (Cloud Operations)。前職はAWS Japan技術サポート。社内外を問わず開発者体験の向上に取り組んでいます。