かなーーりむかしにAWS SAMで作成したAPIを眺めていると、不要なステージ(Stage)の存在に気づきました。
デプロイ済みのAPIから、この不要なステージを削除してみました。 なお、OpenAPIを使わずにデプロイしたAPIを扱います。
おすすめの方
- AWS SAMでOpenAPIを利用しないAPI(デプロイ済み)から不要な「Stage」を削除したい方
準備:APIをデプロイする(複数のステージがある)
sam init
sam init \
--runtime python3.9 \
--name ApiGateway-Stage-Sample \
--app-template hello-world \
--no-tracing \
--package-type Zip
AWS SAMテンプレート
AWS::Serverless::Api
の定義をせず、AWS SAMにお任せしています。OpenAPIも利用しません。
template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: ApiGateway-Stage-Sample
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.9
Timeout: 5
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
HelloWorldFunctionLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}
Lambdaコード
app.py
import json
def lambda_handler(event, context):
return {
"statusCode": 200,
"body": json.dumps({
"message": "hello world",
}),
}
デプロイ
sam deploy \
--stack-name ApiGateway-Stage-Sample-Stack \
--s3-bucket cm-fujii.genki-deploy \
--capabilities CAPABILITY_NAMED_IAM \
--no-fail-on-empty-changeset
API Gatewayのステージは、2つできた
「Prod」と「Stage」の2つのステージができました。
API Gateway用の設定にOpenApiVersion
を追加する
AWS SAMテンプレート
GlobalにOpenApiVersion
を追加しました。
template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: ApiGateway-Stage-Sample
Globals:
Api:
OpenApiVersion: 3.0.1
Resources:
# Serverless::Apiを作成しても良いが、APIのIDが変わるので注意
# WebApi:
# Type: AWS::Serverless::Api
# Properties:
# OpenApiVersion: 3.0.1
# StageName: Prod
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.9
Timeout: 5
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
# RestApiId: !Ref WebApi
HelloWorldFunctionLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}
なお、Resources
に次のAWS::Serverless::Api
を追加すると、新しいAPI Gatewayを作成することになり、API GatewayののID(URLにも利用される)が変わります。
デプロイ済みのAPIのURLが変わるのは嬉しくない場合が多いので、注意が必要です。
template.yaml
Resources:
GatewaysPostApi:
Type: AWS::Serverless::Api
Properties:
StageName: Prod
OpenApiVersion: 3.0.1
デプロイ前に、Stageを手動で削除する
マネジメントコンソールなどで、Stage
を削除します。
デプロイする
さきほどのコマンドでデプロイします。成功します。
API Gatewayのステージは1つのまま(増えてない)
API Gatewayのステージは、1つのままです。増えていません。
さいごに
新しいAWS::Serverless::Api
を追加するとAPI GatewayのIDが変わる点に注意です。
参考になれば幸いです。