O CloudFormation permite que você crie modelos para suas configurações de pilha, então eu sugiro tratá-los como tal. Você provavelmente não deseja ter valores codificados em seus modelos.
Existem algumas maneiras de tornar os nomes dinâmicos, um deles - não especifique um e o AWS gerará um nome exclusivo para você.
Outros - use as funções !Sub
ou !ImportValue
/ !Ref
intrinsic para criar valores dinâmicos. Por exemplo, TableName: !Sub "${AWS::StackName}-my-unique-content"
, que será sempre exclusivo por pilha, mas também conterá algumas informações descritivas sobre o conteúdo interno.
Se você tiver seus lambdas do Python dentro da mesma pilha, passe o nome da tabela como uma variável de ambiente (da maneira mais fácil)
PythonFunction:
Type: "AWS::Serverless::Function"
Properties:
Environment:
Variables:
TABLE_NAME: !Ref DynamoTableResource
Se eles forem criados em outra pilha, mas na mesma conta - sua melhor chance é exportar o nome da tabela como Output
e, em seguida, referenciá-lo chamando !ImportValue
function. Por exemplo:
dynamostack.yaml
Outputs:
DynamoDBResource:
Description: "DynamoDB table"
Value: !Ref DynamoTableResource
Export:
Name: !Sub "${AWS::StackName}-exported-dynamo-table-name"
E em outra pilha:
functionstack.yaml
PythonFunction:
Type: "AWS::Serverless::Function"
Properties:
Environment:
Variables:
TABLE_NAME: !ImportValue "dynamostack-exported-dynamo-table-name"
Tenha cuidado com as referências entre pilha, no entanto, você pode acabar com dependências circulares por todo o lugar.
Outra opção é utilizar parâmetros no modelo do CloudFormation e passar nomes de tabelas do DynamoDB por meio deles e fazer referência a eles (usando !Ref
) em suas funções lambda.