web-dev-qa-db-fra.com

Référence! Ref Nom de la table DynamoDB dans un modèle AWS CloudFormation

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?

6
McShaman

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?

1
Nick Littrell

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.

1
Lord of the Goo

!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.

0
Andrew Kovalenko