Я создаю несколько таблиц Dynamodb через CloudFormation, к которым будут обращаться лямбды Python. Похоже, у меня есть два варианта именования таблиц - позвольте CF сделать это и, следовательно, добавить к имени целую кучу случайных символов, или указать имя явно, что дает мне легкодоступное имя, но означает, что я не могу вносить изменения через CF без замены таблицы.
Я думаю, что недостатком простого имени является то, что мне либо нужно иметь файл конфигурации, который отличается для каждой учетной записи, в которой я запускаю CF (потому что они будут иметь разные случайные имена), либо мне нужно написать код для обнаружения name при каждом вызове лямбды.
Так что же вы делаете? Явные имена, а затем займитесь заменой изменений, или пусть CF сделает это и займется обнаружением имени БД в коде? Или что-то еще, о чем я не думаю?
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
) в ваших лямбда-функциях.