web-dev-qa-db-fra.com

Comment utiliser les fonctions Sub et GetAtt simultanément dans le modèle CloudFormation?

Je crée un modèle yaml CloudFormation et je dois utiliser !GetAtt "TestLambda.Arn" dans le cadre de la fonction !Sub dans "AWS :: ApiGateway :: Method". Uri d'intégration:

...
Type: "AWS::ApiGateway::Method"
  Properties:
    RestApiId:
      Ref: "RestApi"
    ResourceId:
      Ref: "TestResource"
    HttpMethod: "GET"
    AuthorizationType: "NONE"
    Integration:
      Type: "AWS_PROXY"
      IntegrationHttpMethod: "POST"
      Uri: !Sub "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/[[place where I want to use !GetAtt "TestLambda.Arn"]]/invocations"
...

En conséquence, je veux obtenir une valeur quelque chose comme ça:

"arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/my-endpoint-lambda/invocations"

Comment puis-je utiliser ces fonctions ensemble et obtenir le résultat souhaité?

6
Gleb Kosteiko

Vous n'avez pas besoin d'utiliser !GetAtt ici, !Sub décompressera automatiquement les valeurs si vous les placez dans l'espace réservé:

Uri: !Sub arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/${TestLambda.Arn}/invocations

Ceci est expliqué dans la docs :

Si vous spécifiez des noms de paramètre de modèle ou des ID logiques de ressources, tels que ${InstanceTypeParameter}, AWS CloudFormation renvoie les mêmes valeurs que si vous utilisiez la fonction intrinsèque Ref. Si vous spécifiez des attributs de ressource, tels que ${MyInstance.PublicIp}, AWS CloudFormation renvoie les mêmes valeurs que si vous utilisiez la fonction intrinsèque Fn::GetAtt

9
Stefano

AWS CloudFormation fournit plusieurs fonctions intégrées qui vous aident à gérer vos piles. Utilisez des fonctions intrinsèques dans vos modèles pour affecter des valeurs à des propriétés qui ne sont disponibles qu'au moment de l'exécution. 

Source d'AWS

La fonction intrinsèque Fn::GetAtt renvoie la valeur d'un attribut à partir d'une ressource du modèle. 

Déclaration 

  • JSON
    • { "Fn::GetAtt" : [ "logicalNameOfResource", "attributeName" ] }
  • YAML
    • Syntaxe pour le nom complet de la fonction:
    • Fn::GetAtt: [ logicalNameOfResource, attributeName ]
  • Syntaxe pour la forme abrégée:
    • !GetAtt logicalNameOfResource.attributeName

Remarque: ne doit pas être confondu avec un double-point: Fn::GetAtt est comme Fn_GetAtt

3
Premraj

Nous pouvons utiliser Fn:: pour les fonctions intrinsèques imbriquées si vous utilisez d'abord la forme abrégée !. Alors

!Sub "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/$(Fn::GetAtt:[TestLambda, Arn])/invocations"
0
Gleb Kosteiko