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 !Sub
o 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
!Ref
TableName: !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 Output
y luego hacer referencia a él llamando a !ImportValue
la 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.