Компромисс для именования таблиц DynamoDB с CloudFormation

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

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

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

1 ответ

CloudFormation позволяет вам создавать шаблоны для ваших стековых конфигураций, поэтому я бы посоветовал рассматривать их как таковые. Вы, вероятно, не хотите иметь жестко закодированные значения в своих шаблонах.

Есть несколько способов сделать имена динамическими, один из них - не указывать один, и AWS создаст для вас уникальный. Другое - использовать !Sub или же !ImportValue/!Ref внутренние функции для создания динамических значений. То есть: TableName: !Sub "${AWS::StackName}-my-unique-content" который всегда будет уникальным для каждого стека, но также будет содержать некоторую описательную информацию о содержимом внутри.

Если у вас есть лямбды Python внутри одного стека, передайте имя таблицы в качестве переменной среды (imo самый простой способ)

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

Другие вопросы по тегам