AWS SAMでデプロイ済みのAPI Gatewayの不要な「Stage」を削除する

デプロイ済みのAPIから不要な「Stage」を削除します。OpenAPIを利用しないAPIの場合です。
2023.01.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

かなーーりむかしにAWS SAMで作成したAPIを眺めていると、不要なステージ(Stage)の存在に気づきました。

API Gatewayでステージが2つある

デプロイ済みの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でステージが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のステージはひとつだけ

デプロイする

さきほどのコマンドでデプロイします。成功します。

API Gatewayのステージは1つのまま(増えてない)

API Gatewayのステージは、1つのままです。増えていません。

API Gatewayのステージはひとつだけ

さいごに

新しいAWS::Serverless::Apiを追加するとAPI GatewayのIDが変わる点に注意です。 参考になれば幸いです。

参考