AWS SAM이 API 게이트웨이 단계에서 기본 "단계"를 생성하지 못하도록 방지하는 방법

개발자 여러분, 안녕하세요.

리소스AWS::Serverless::Api 및 변환AWS::Serverless-2016-10-31에 대한 AWS SAM 문제StackOverflow와 이 문제가 여전히 존재하기 때문에 일시적인 해결 방법을 알려드리겠습니다. 먼저 문제가 무엇인지 설명하겠습니다.

문제 설명 :


AWS Serverless API gateway using SAM 이 구성을 생성하는 동안 서버리스 코드 샘플과 함께 '프로덕션' 단계에 배포하지만 리소스를 생성하는 동안 아래 예에 따라 제공한 API 게이트웨이 아래에 두 단계를 생성하고 다른 하나는 기본 단계입니다. 따라서 자신의 스테이지를 생성하려는 경우 생성할 수 없습니다. 오류는 Stage already exists입니다.

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS SAM template with a simple API definition
Resources:
  ApiGatewayApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: prod
  ApiFunction: # Adds a GET api endpoint at "/" to the ApiGatewayApi via an Api event
    Type: AWS::Serverless::Function
    Properties:
      Events:
        ApiEvent:
          Type: Api
          Properties:
            Path: /
            Method: get
            RestApiId:
              Ref: ApiGatewayApi
      Runtime: python3.7
      Handler: index.handler
      InlineCode: |
        def handler(event, context):
            return {'body': 'Hello World!', 'statusCode': 200}



생성할 때마다 AWS SAM에 버그가 있습니다StageName. Prod와 같이 제공한 단계 이름과 함께 기본 단계를 생성합니다. 먼저 현재 항목을 삭제한 다음 이러한 변경 사항을 적용할 수 있습니다.

이 문제를 해결하려면 YAML 파일에 OpenApiVersion: '2.0'를 추가하는 두 가지 방법이 있습니다.

해결 방법 1: 다음 속성StageName에서 이를 추가할 수 있습니다. 이 속성은 AWS::Serverless::Api 또는 AWS::Serverless::Lambda와 같은 다른 리소스에 추가할 수 있습니다.

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS SAM template with a simple API definition
Resources:
  ApiGatewayApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: 'V1'
      OpenApiVersion: '2.0'
  ApiFunction: # Adds a GET api endpoint at "/" to the ApiGatewayApi via an Api event
    Type: AWS::Serverless::Function
    Properties:
      Events:
        ApiEvent:
          Type: Api
          Properties:
            Path: /
            Method: get
            RestApiId:
              Ref: ApiGatewayApi
      Runtime: python3.7
      Handler: index.handler
      InlineCode: |
        def handler(event, context):
            return {'body': 'Hello World!', 'statusCode': 200}



해결 방법 2: 최상위 수준의 SAM 템플릿에 다음을 수행하고 AWS::Serverless:Api 리소스에서 "StageName"을 사용하여 단계를 정의했는지 확인합니다. API 또는 람다 등과 같은 여러 리소스가 있는 경우 전역 수준이 됩니다.

Globals:
  Api:
    OpenApiVersion: 3.0.1
    Cors: '*'

Resources:
  ImplicitApiFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: s3://sam-demo-bucket/member_portal.zip
      Handler: index.gethtml
      Runtime: nodejs12.x
      Events:
        GetHtml:
          Type: Api
          Properties:
            Path: /
            Method: get
  ExplicitApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod


참고: 이 솔루션은 처음부터 API를 생성할 때만 작동합니다. API가 이전에 생성되었고 사용자가 추가한 경우OpenApiVersion: '2.0' "Stage"단계가 제거되지 않습니다. 처음부터 추가해야 합니다. 또한 YAML에 대한 이 예제는 JSON 형식에도 동일하게 적용될 수 있습니다.

내 블로그가 마음에 든다면 기사를 좋아해 주세요. 그런 문제 지향적인 블로그를 더 많이 쓰도록 격려해 줄 것입니다. 소중한 제안을 공유해 주세요. 솔직한 피드백에 감사드립니다!. 질문이 있으시면 내 트위터 핸들을 통해 저에게 연락할 수 있습니다.

참조 :

https://github.com/aws/serverless-application-model/blob/master/tests/translator/input/api_with_open_api_version.yaml#L3
https://github.com/aws/serverless-application-model/issues/191#issuecomment-551051431

좋은 웹페이지 즐겨찾기