J'essaie de tester localement le passage du nom de table d'une table DynamoDB tel que déclaré dans mon fichier de modèle CloudFormation.
D'après toute la documentation que j'ai lue, je devrais être en mesure de référencer la valeur de la propriété TableName
d'une ressource DynamoDB en utilisant le !Ref
fonction intrinsèque. Cependant, lorsque je teste cela localement, la propriété n'est pas définie.
Prenons l'exemple suivant:
Transform: 'AWS::Serverless-2016-10-31'
Resources:
ServerlessFunction:
Type: AWS::Serverless::Function
Properties:
Runtime: nodejs10.x
Handler: index.handler
Environment:
Variables:
TABLE_NAME: !Ref DynamoDBTable # <- returning undefined
Events:
GetCocktails:
Type: Api
Properties:
Path: /
Method: get
DynamoDBTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: DynamoDBTableName
AttributeDefinitions:
- AttributeName: ID
AttributeType: S
KeySchema:
- AttributeName: ID
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
J'attends le TABLE_NAME
la variable d'environnement doit être DynamoDBTableName
mais elle renvoie undefined. Comment faire fonctionner le modèle comme prévu?
Pourriez-vous vérifier que cela ne fonctionne pas en regardant la fonction lambda dans la console et en vérifiant la variable d'environnement pas en dessous où elle est censée être?
Comme indiqué par quelqu'un d'autre, les seuls attributs exposés par une table AWS :: DynamoDB :: sont: Arn
et StreamArn
(Voir Documentation AWS CloudFormation DynamoDB ).
Si la syntaxe des arn
de DynamoDB vous permet de récupérer le nom de la table de la manière suivante:
Environment:
Variables:
TABLE_NAME: !Select [1, !Split ['/', !GetAtt DynamoDBTable.Arn]]
qui renverra DynamoDBTableName
.
!Ref
renvoie un nom de la ressource par "nom logique" et devrait fonctionner pour votre situation. Cependant, la ressource (votre table) doit exister avant de la référencer, vous avez donc 2 options:
déclarer votre ressource de table plus tôt dans le modèle (avant de la référencer)
utilisez la propriété DependsOn
sur votre lambda comme
ServerlessFunction:
Type: AWS::Serverless::Function
DependsOn: DynamoDBTable
Quant à l'utilisation de Fn::GetAtt
:
Basé sur AWS Documentation lorsque vous créez une ressource de type AWS::DynamoDB::Table
il n'y a que 2 attributs disponibles pour Fn::GetAtt
:
Arn
StreamArn
ce qui signifie qu'il n'y a aucun moyen d'obtenir l'attribut TableName
pour la table DynamoDB avec Fn::GetAtt
dans la version actuelle de CloudFormation.