Compensaciones para nombrar tablas de DynamoDB con CloudFormation

Compensaciones para nombrar tablas de DynamoDB con CloudFormation

Estoy creando algunas tablas de dynamodb a través de CloudFormation, a las que accederán las lambdas de Python. Parece que tengo dos opciones para nombrar las tablas: dejar que CF lo haga y, por lo tanto, poner un montón de caracteres aleatorios en el nombre, o especificar el nombre explícitamente, lo que me da un nombre de fácil acceso pero significa que no puedo realizar cambios a través de CF sin reemplazar la tabla.

Creo que la desventaja de no tener un nombre simple es que tengo que tener un archivo de configuración que sea diferente para cada cuenta en la que ejecuto el CF (porque tendrán diferentes nombres aleatorios) o tengo que escribir código para detectar el nombre en cada invocación de lambda.

Entonces, ¿qué hacéis? ¿Nombres explícitos y luego ocuparse del reemplazo de los cambios, o dejar que CF lo haga y se ocupe del descubrimiento de nombres de bases de datos en el código? ¿O algo más en lo que no estoy pensando?

Respuesta1

CloudFormation le permite crear plantillas para las configuraciones de su pila, por lo que sugeriría tratarlas como tales. Probablemente no quieras tener valores codificados en tus plantillas.

Hay algunas formas de hacer que los nombres sean dinámicos, una de ellas: no especifique uno y AWS generará uno único para usted. Otros: utilice funciones intrínsecas !Subo para generar valores dinámicos. Es decir: que siempre será único por pila, pero también contendrá información descriptiva sobre el contenido del interior.!ImportValue!RefTableName: !Sub "${AWS::StackName}-my-unique-content"

Si tiene sus lambdas de Python dentro de la misma pila, pase el nombre de la tabla como una variable ambiental (en mi opinión, la forma más fácil)

PythonFunction:
  Type: "AWS::Serverless::Function"
  Properties:
    Environment:
      Variables:
        TABLE_NAME: !Ref DynamoTableResource

Si se crean en otra pila, pero en la misma cuenta, su mejor oportunidad es exportar el nombre de la tabla como un archivo Outputy luego hacer referencia a él llamando a !ImportValuela función. Por ejemplo:

dynamostack.yaml
Outputs: 
  DynamoDBResource:
    Description: "DynamoDB table"
    Value: !Ref DynamoTableResource
    Export:
      Name: !Sub "${AWS::StackName}-exported-dynamo-table-name"

Y en otra pila:

functionstack.yaml
PythonFunction:
  Type: "AWS::Serverless::Function"
  Properties:
    Environment:
      Variables:
        TABLE_NAME: !ImportValue "dynamostack-exported-dynamo-table-name"

Sin embargo, tenga cuidado con las referencias entre pilas, ya que podría terminar con dependencias circulares por todas partes.

Otra opción es utilizar parámetros en la plantilla de CloudFormation y pasar nombres de tablas de DynamoDB a través de ellos y hacer referencia a ellos (usando !Ref) en sus funciones lambda.

información relacionada