Компромиссы при именовании таблиц DynamoDB с помощью CloudFormation

Компромиссы при именовании таблиц DynamoDB с помощью CloudFormation

Я создаю несколько таблиц dynamodb через CloudFormation, к которым будут обращаться лямбды Python. Похоже, у меня есть два варианта именования таблиц — позволить CF сделать это и, следовательно, добавить целую кучу случайных символов в имя, или указать имя явно, что даст мне легкодоступное имя, но означает, что я не смогу вносить изменения через CF, не заменив таблицу.

Я думаю, что недостаток отсутствия простого имени заключается в том, что мне либо придется иметь файл конфигурации, который будет отличаться для каждой учетной записи, в которой я запускаю CF (потому что у них будут разные случайные имена), либо мне придется писать код для определения имени при каждом вызове лямбды.

Так что же делать? Явные имена и потом разбираться с заменой изменений, или позволить CF делать это и разбираться с обнаружением имени БД в коде? Или что-то еще, о чем я не подумал?

решение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) в ваших лямбда-функциях.

Связанный контент