1

Serverless 프레임 워크를 사용할 때 실수로 다른 서비스에서 같은 이름의 서비스를 사용했기 때문에 문제가 발생합니다.Serverless 서비스 업데이트 DeletionPolicy로 생성 된 Dynamodb 테이블 retain

An error occurred: tableX - TableX already exists.

의 내가 서비스의 같은 이름을 가진 두 개의 "serverless.yml"파일을 모두 가지고 있다고 가정하자. 그 중 하나 ("test1"이라고 함)에 리소스 (DynamoDB 테이블)가 있고 다른 하나는 리소스가 없습니다 ("test2"). 다음 조각처럼 :

Test1을

service: sandbox-core 
provider: 
    name: aws 
    stage: core 
    runtime: nodejs6.10 
    region: sa-east-1 
    memorySize: 128 
    timeout: 300 

resources: 
    Resources: 

    table3: 
     Type: 'AWS::DynamoDB::Table' 
     DeletionPolicy: Retain 
     Properties: 
     TableName: SandboxTable3 
     AttributeDefinitions: 
      - 
      AttributeName: provider 
      AttributeType: S 
      - 
      AttributeName: appId 
      AttributeType: S 
     KeySchema: 
      - 
      AttributeName: provider 
      KeyType: HASH 
      - 
      AttributeName: appId 
      KeyType: RANGE 

     ProvisionedThroughput: 
      ReadCapacityUnits: 1 
      WriteCapacityUnits: 1 

    table4: 
     Type: 'AWS::DynamoDB::Table' 
     DeletionPolicy: Retain 
     Properties: 
     TableName: SandboxTable4 
     AttributeDefinitions: 
      - 
      AttributeName: session 
      AttributeType: S 
     KeySchema: 
      - 
      AttributeName: session 
      KeyType: HASH 

     ProvisionedThroughput: 
      ReadCapacityUnits: 5 
      WriteCapacityUnits: 1 

functions: 
    auth: 
    handler: handler.auth 
    events: 
     - http: 
      path: auth/{session}/{provider}/{appId} 
      method: get 
      cors: true 

Test2를

service: sandbox-core 

provider: 
    name: aws 
    stage: core 
    runtime: nodejs6.10 
    region: sa-east-1 
    memorySize: 128 
    timeout: 300 

functions: 
    createCustomData: 
    handler: handler.createCustomData 
    events: 
     - http: 
      path: teste2 
      method: post 
      cors: true 

나는 DeletionPolicy: Retain으로, 원로 "TEST1는"그가와 테이블, 테이블을 생성 sls deploy 때 매우 현명한 데이터. 그런 다음 다른 기능이 있지만 자원 (DynamoDB 테이블)이없는 i sls deploy "test2"과 같이 예상 한대로 수행합니다. 테이블 삭제를 건너 뜁니다.

그러나 "test1"을 다시 배포하면 테이블을 인식하지 못하고 기존 테이블을 업데이트하지 않고 "만들기"시작하여 배포하지 못합니다.

삭제되지 않은 테이블이 필요하며 서비스에서 기능이 필요합니다. Cloud Formation이 첫 번째 배포에서 생성 된 테이블의 트랙을 잃어버린 것처럼 보입니다.

나는이 github thread에 말한 것과 같은 서비스 (리소스에 대해서만)를 분리하고 싶지 않습니다. 실행중인 테이블이 필요합니다. 많은 양의 데이터가 있으며 백업 및 복구가 너무 비싸서 많은 사용자가 영향을받을 수 있습니다.

그래서 Cloud Formation Stack에서 해당 테이블을 업데이트하고 생성하려고 시도하지 않는다는 것을 어떻게 알 수 있습니까? Cloud Formation Stack에서 서비스를 추적하는 방법은 무엇입니까? 그리고 리소스가없는 서비스를 배포하지 못하게하려면 어떻게해야합니까?

이 경우 가장 좋은 해결책은 무엇입니까? 내 질문은 이해하기에 충분할만큼 분명하길 바랍니다.

답변

2

test2과 관련된 문제는 없습니다.

test1의 경우 sls deploy 번으로 여러 번 업데이트해야합니다. 이전에 sls remove을 할 경우 DynamoDB의이 serverless.ymlRetain로 설정되어있는 경우

그러나, 당신은 sls deploy으로 다시 만들 수 없습니다. 이것은 aws cloudformation의 디자인입니다.

새로운 기능에 대한 공개 티켓이 이미 리소스를 건너 뛰는 것을 발견했습니다. 이 기능이 개발되고 병합 될 때까지 기다려야합니다. 나는 똑같은 해결책을 기다리고있다. 거기에 가서 투표하십시오!

dynamodb를 백업하고 파괴 한 다음 sls deploy을 실행하고 실제로 문제가 있으면 복원해야합니다.

나는 일반적으로 변수를 관리

, 서로 다른 환경에 대한 사용자 정의에서 같은 DeletionPolicy: ${self:custom.${self:custom.stage}.deletion_policy}는 :

custom 
    dev: 
    deletion_policy: Delete 
    prod: 
    deletion_policy: Retain 
+0

하지만 난 그것을 다시 만들지 않으려는, 나는 테이블과 기능을 업데이트 할. "test2"를 배포 할 때 "test1"이 더 이상 존재하지 않습니다. "테이블이 이미 존재하기 때문에"sls가 "test1"을 다시 배포하려고 할 때 다시 시도 할 수 없습니다. 무슨 일이 일어 났는지 보려면 여기에 적어 놓은 코드를 사용해보십시오. –