2017-09-07 5 views
0

Dans un modèle de CloudFormation, je définir une application serverless avec une fonction lambda déclenchée par une passerelle API, comme suit:Obtenir une référence au api qui déclenche une AWS :: Serverless :: Fonction dans CloudFormation

AWSTemplateFormatVersion: '2010-09-09' 
Transform: AWS::Serverless-2016-10-31 

Resources: 
    MyFunction: 
    Type: AWS::Serverless::Function 
    Properties: 
     # ... 
     Events: 
     GetStuff: 
      Type: Api 
      Properties: 
      Path: /stuff 
      Method: get 

Cela génère une ressource API Gateway configurée pour recevoir les requêtes GET et les transférer vers mon lambda, et cela fonctionne comme je le souhaite.

Cependant, je ne peux pas comprendre comment référencer cette instance API dans la section Output du modèle:

Output: 
    MyGatewayId: 
    Description: Id of the auto-generated API Gateway resource 
    Value: # what do I put here? 

J'ai essayé !GetAtt MyFunction.RootResourceId comme suggéré here, mais qui a abouti à un échec quand je a tenté de déployer la pile:

Echec de la création du changeset: Waiter ChangeSetCreateComplete a échoué: le serveur a rencontré un état de panne du terminal. Statut: ECHEC. Raison: propriété de modèle de modèle non valide 'MyGatewayId'

Répondre

1

Si vous voulez vraiment être capable de produire La clé pour cela est de comprendre ce que la transformation sans serveur fait pour vous, en générant une série de ressources basées sur vos spécifications.

Vous pouvez vérifier vos ressources CloudFormations pour être sûr, mais en fonction de vos spécifications

AWSTemplateFormatVersion: '2010-09-09' 
Transform: AWS::Serverless-2016-10-31 

Resources: 
    MyFunction: 
    Type: AWS::Serverless::Function 
    Properties: 
     # ... 
     Events: 
     GetStuff: 
      Type: Api 
      Properties: 
      Path: /stuff 
      Method: get 

Il vous devrait générer quelques ressources. En fonction de votre propriété Events et du fait que vous n'avez pas spécifié de RestApiId, il génère pour vous une API API Rest Rest par défaut et lui attribue l'ID logique ServerlessRestApi. Donc, pour répondre à votre question initiale concernant Outputs

Output: 
    MyGatewayId: 
    Description: Id of the auto-generated API Gateway resource 
    Value: !Ref ServerlessRestApi 
1

Vous pouvez l'avoir comme sortie si vous spécifiez la passerelle API dans votre modèle.

Resources: 
    MyAPI 
    Type AWS::Serverless::Api 
    Properties: 
     DefinitionUri: s3://<bucket>/swagger.yaml 

Avec cette approche, vous disposez d'une ressource que vous pouvez utiliser dans vos sorties. Cependant, cela nécessite également que vous utilisiez swagger puisque le DefinitionUri est un attribut obligatoire.

Vous pouvez toujours extraire l'identifiant avec la commande suivante:

aws cloudformation describe-stack-resources --stack-name <your-stack> \ 
    --query "StackResources[?ResourceType == 'AWS::ApiGateway::RestApi'].PhysicalResourceId" \ 
    --output text 

Ce qui signifie que vous pouvez extraire facilement l'URL de votre API par:

aws cloudformation describe-stack-resources --stack-name <your-stack> \ 
    --query "StackResources[?ResourceType == 'AWS::ApiGateway::RestApi'].PhysicalResourceId" \ 
    --output text \ 
    | awk '{print "https://"$1".execute-api.eu-west-1.amazonaws.com/Prod"}' 
+0

Depuis mon objectif final était d'obtenir le script de déploiement à la sortie de ces paramètres, un couple de CLI supplémentaire appelle est parfaitement bien. Merci! –