AWS SAM에서 dynamo 리소스를 변경할 때 오류가 발생했습니다.

lambda + Dynamo DB의 서버리스 웹 API를 개발하고 있습니다. 인프라 구축은 공부를 겸해 AWS SAM을 이용.
템플릿에서 Dynamo의 정의를 변경하고 배포하면 다음 오류가 발생합니다.
CloudFormation cannot update a stack when a custom-named resource requires replacing. Rename FugaDynamoDBTable and update the stack again.

일단 템플릿에서 삭제 한 후 배포, 다시 빌드하는 것이 잘되었습니다. 이하 그 과정입니다.

하고 싶은 것 & 오류



개발 중 Dynamo의 GSI를 다시 붙이고 싶어졌다. 템플릿으로 다시 정의하고 배포하면 마치 리플레이스되지만 해당 테이블에는 수동으로 넣은 테스트 데이터 밖에 없었기 때문에 문제 없음.

template.yml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
  HogeFunction:
    Type: AWS::Serverless::Function 
    Properties: #中略
  FugaDynamoDBTable:
    Type: AWS::DynamoDB::Table
    Properties:
        TableName: FugaTable
        GlobalSecondaryIndexes: # ←ここに変更を加えた
#以下略
sam buildsam deploy 라고 치고 출력을 관찰.
CloudFormation stack changeset (抜粋)
---------------------------------------------------------------------------------------------
Operation       LogicalResourceId         ResourceType                  Replacement       
---------------------------------------------------------------------------------------------
* Modify        FugaDynamoDBTable        AWS::DynamoDB::Table           True     
   :                   :                          :                      :

Replacement가 True로 문제 없기 때문에, 그대로 배포했는데, 해당 Dynamo의 업데이트에 이하의 에러가 발생해 롤백이 실행되었다.
CloudFormation cannot update a stack when a custom-named resource requires replacing. Rename FugaDynamoDBTable and update the stack again.

대응



오류 메시지는 테이블 이름( FugaTable )을 변경하라고 한다. 그러나 테이블 이름은 바꾸고 싶지 않습니다.

AWS CloudFormation > 사용 설명서 > 스택 리소스 업데이트 동작 에 의하면, 리플레이스는 치환 자원을 작성하고 나서 낡은 자원을 삭제한다고 한다. 거기서 「이름이 쓰고 있는 것이 나쁜 것일까」라고 생각해, Dynamo DB의 웹 콘솔로부터 수동으로 삭제해, 재배포. 그러나 결과는 변함없이.

자원명( FugaDynamoDBTable )을 바꾸면 신설 자원으로 볼 수 있을 것 같은 생각도 하지만, 왠지 기분 나쁘다.

마찬가지로 사용자 가이드 이름 유형

스택 리소스를 AWS CloudFormation 이외의 변경 사항으로 변경하지 마십시오. 예를 들어 스택에 속한 리소스의 이름을 AWS CloudFormation 없이 변경한 경우 스택을 업데이트하거나 삭제하려고 할 때 오류가 발생합니다.

의 묘사를 발견 (죄송합니다).

그럼 템플릿상에서도 없었던 것으로 해 실태에 맞추려고, FugaDynamoDBTable 의 정의를 통째로 코멘트 아웃 해 재차 배포.
CloudFormation stack changeset
------------------------------------------------------------------------------
Operation       LogicalResourceId      ResourceType               Replacement
------------------------------------------------------------------------------
- Delete        FugaDynamoDBTable      AWS::DynamoDB::Table       N/A        

확인하고 실행. 특히 오류없이 삭제되었습니다.

다시 해당 부분을 코멘트 인해 배포.
CloudFormation stack changeset
-----------------------------------------------------------------------------------
Operation        LogicalResourceId       ResourceType               Replacement   
-----------------------------------------------------------------------------------
+ Add            FugaDynamoDBTable       AWS::DynamoDB::Table       N/A           

의도대로의 changeset가 되었으므로 그대로 실행. 무사히 배포 . 콘솔에서도 의도한 설정으로 되어 있는 것을 확인할 수 있었다.

추가



약 1년 전에 똑같은 문제로 똑같은 과정을 거치는 편이 있었다. SAM에서 빠지면 CloudFormation의 정보도 제대로 찾아야 할까.
CloudFormation의 DynamoDB 리소스 업데이트로 빠진 이야기

좋은 웹페이지 즐겨찾기