
AWS SAMでデプロイ済みのAPI Gatewayの不要な「Stage」を削除する
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
かなーーりむかしに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も利用しません。
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コード
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を追加しました。
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が変わるのは嬉しくない場合が多いので、注意が必要です。
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が変わる点に注意です。
参考になれば幸いです。









