Tradeoffs para nomear tabelas do DynamoDB com o CloudFormation

1

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

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

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

    
por jedberg 25.02.2018 / 23:18

1 resposta

1

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.

    
por 12.03.2018 / 01:03