Compensações para nomear tabelas do DynamoDB com CloudFormation

Compensações para nomear tabelas do DynamoDB com CloudFormation

Estou criando algumas tabelas do Dynamodb via CloudFormation, que serão acessadas pelos lambdas do Python. Parece que tenho duas opções para nomear as tabelas - deixar o CF fazer isso e, portanto, colocar um monte de caracteres aleatórios no nome ou especificar o nome explicitamente, o que me dá um nome de fácil acesso, mas significa que não posso fazer alterações via CF sem substituir a tabela.

Acho que a desvantagem de não ter um nome simples é que preciso ter um arquivo de configuração diferente para cada conta em que executo o CF (porque eles terão nomes aleatórios diferentes) ou preciso escrever um código para detectar o nome em cada invocação do lambda.

Então, o que vocês fazem? Nomes explícitos e depois lidar com a substituição das alterações ou deixar o CF fazer isso e lidar com a descoberta do nome do banco de dados no código? Ou alguma outra coisa em que não estou pensando?

Responder1

CloudFormation permite criar modelos para suas configurações de pilha, então 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, uma delas é não especificar uma e a AWS gerará um nome exclusivo para você. Outros - usam funções !Subou !ImportValue/ !Refintrínsecas para construir valores dinâmicos. Ou seja: TableName: !Sub "${AWS::StackName}-my-unique-content"que será sempre único por pilha, mas também conterá algumas informações descritivas sobre o conteúdo interno.

Se você tiver seus lambdas Python dentro da mesma pilha, passe o nome da tabela como uma variável ambiental (é a 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 Outpute referenciá-lo chamando !ImportValuea função. 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"

Porém, tenha cuidado com as referências entre pilhas, pois você pode acabar com dependências circulares por todo o lugar.

Outra opção é utilizar parâmetros no modelo CloudFormation e passar nomes de tabelas do DynamoDB por meio deles e referenciá-los (usando !Ref) em suas funções lambda.

informação relacionada