CloudFormation을 사용한 DynamoDB 테이블 이름 지정에 대한 장단점

CloudFormation을 사용한 DynamoDB 테이블 이름 지정에 대한 장단점

Python 람다에서 액세스할 CloudFormation을 통해 일부 dynamodb 테이블을 생성 중입니다. 테이블 이름을 지정하는 데 두 가지 선택이 있는 것 같습니다. CF를 사용하여 이름에 임의의 문자를 잔뜩 넣거나 이름을 명시적으로 지정하면 이름에 쉽게 액세스할 수 있지만 이름을 지정할 수는 없습니다. 테이블을 교체하지 않고 CF를 통해 변경합니다.

간단한 이름이 없을 때의 단점은 CF를 실행하는 모든 계정에 대해 다른 구성 파일이 있어야 하거나(임의의 이름이 다르기 때문에) 코드를 작성해야 한다는 것입니다. 람다를 호출할 때마다 이름을 지정합니다.

그럼 다들 뭐하세요? 명시적인 이름을 지정한 다음 변경 사항에 대한 대체를 처리합니까, 아니면 CF에서 이를 수행하고 코드에서 DB 이름 검색을 처리하도록 하시겠습니까? 아니면 내가 생각하지 못하는 다른 것?

답변1

CloudFormation을 사용하면 스택 구성에 대한 템플릿을 생성할 수 있으므로 이를 그렇게 처리하는 것이 좋습니다. 아마도 템플릿에 값을 하드코딩하고 싶지 않을 것입니다.

이름을 동적으로 만드는 방법은 몇 가지가 있습니다. 그 중 하나입니다. 이름을 지정하지 않으면 AWS가 고유한 이름을 생성합니다. 기타 - 동적 가치를 구축하기 위해 !Sub또는 !ImportValue/ 내장 기능을 사용합니다. !Ref즉, TableName: !Sub "${AWS::StackName}-my-unique-content"스택마다 항상 고유하지만 내부 내용에 대한 설명 정보도 포함됩니다.

동일한 스택 내에 Python 람다가 있는 경우 테이블 이름을 환경 변수로 전달합니다(가장 쉬운 방법).

PythonFunction:
  Type: "AWS::Serverless::Function"
  Properties:
    Environment:
      Variables:
        TABLE_NAME: !Ref DynamoTableResource

다른 스택에 생성되었지만 동일한 계정에 생성된 경우 가장 좋은 방법은 테이블 이름을 로 내보낸 Output다음 함수를 호출하여 참조하는 것입니다 !ImportValue. 예를 들어:

dynamostack.yaml
Outputs: 
  DynamoDBResource:
    Description: "DynamoDB table"
    Value: !Ref DynamoTableResource
    Export:
      Name: !Sub "${AWS::StackName}-exported-dynamo-table-name"

그리고 다른 스택에서는 다음과 같습니다.

functionstack.yaml
PythonFunction:
  Type: "AWS::Serverless::Function"
  Properties:
    Environment:
      Variables:
        TABLE_NAME: !ImportValue "dynamostack-exported-dynamo-table-name"

하지만 스택 간 참조에 주의하세요. 결국 모든 곳에서 순환 종속성이 발생할 수 있습니다.

또 다른 옵션은 CloudFormation 템플릿의 매개변수를 활용하고 이를 통해 DynamoDB 테이블 이름을 전달하고 !Ref람다 함수에서 이를 참조하는 것입니다( 를 사용하여).

관련 정보