web-dev-qa-db-fra.com

CloudFormation ne se déploie pas aux étapes de la passerelle API lors de la mise à jour

Lorsque j'exécute CloudFormation deploy à l'aide d'un modèle avec des ressources API Gateway, la première fois que je l'exécute, il crée et se déploie sur des étapes. Les fois suivantes que je l'exécute, il met à jour les ressources mais ne se déploie pas par étapes.

Ce comportement est-il comme prévu? Si oui, comment l'ai-je déployé sur des étapes chaque fois qu'il est mis à jour?

(Terraform mentionne un problème similaire: https://github.com/hashicorp/terraform/issues/661 )

24
bjfletcher

Il semble qu'il n'y ait aucun moyen de créer facilement un nouveau déploiement chaque fois que l'une de vos ressources Cloudformation change.

Une façon de contourner ce problème serait d'utiliser une ressource personnalisée soutenue par Lambda (voir http://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html ).

Lambda doit créer le nouveau déploiement, uniquement si l'une de vos ressources a été mise à jour. Pour déterminer si l'une de vos ressources a été mise à jour,
vous devrez probablement implémenter une logique personnalisée autour de cet appel d'API: http://docs.aws.Amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeStackEvents.html

Afin de déclencher des mises à jour sur votre ressource personnalisée, je vous suggère de fournir un paramètre Cloudformation qui sera utilisé pour forcer une mise à jour de votre ressource personnalisée (par exemple l'heure actuelle ou un numéro de version).

Notez que vous devrez ajouter une clause DependsOn à votre ressource personnalisée qui inclura toutes les ressources pertinentes pour votre API. Sinon, votre déploiement peut être créé avant la mise à jour de toutes vos ressources API.

J'espère que cela t'aides.

11
spg

CloudFormation dans les mots d'Amazon est:

AWS CloudFormation s'occupe de l'approvisionnement et de la configuration de ces ressources pour vous http://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html

Le redéploiement des API n'est pas une tâche de provisionnement ... C'est une activité de promotion qui fait partie d'une étape de votre processus de sortie de logiciel.

AWS CodePipeline est un service de livraison continue que vous pouvez utiliser pour modéliser, visualiser et automatiser les étapes requises pour publier votre logiciel. http://docs.aws.Amazon.com/codepipeline/latest/userguide/welcome.html

CodePipeline prend également en charge l'exécution des fonctions Lambda à partir des actions du pipeline. Ainsi, comme indiqué précédemment, créez une fonction Lambda pour déployer votre API mais appelez-la à partir de Codepipeline au lieu de CloudFormation.

Consultez cette page pour plus de détails: http://docs.aws.Amazon.com/codepipeline/latest/userguide/actions-invoke-lambda-function.html

5
Teimatini Marín Meza

Lorsque votre modèle spécifie un déploiement, CloudFormation créera ce déploiement uniquement s'il n'existe pas déjà. Lorsque vous essayez de l'exécuter à nouveau, il observe que le déploiement existe toujours afin qu'il ne le recrée pas, donc pas de déploiement. Vous avez besoin d'un nouvel identifiant de ressource pour le déploiement afin qu'il crée un nouveau déploiement. Lisez ceci pour plus d'informations: https://currentlyunnamed-theclassic.blogspot.com/2018/12/mastering-cloudformation-for-api.html

4
TheClassic

À partir du billet de blog lié par TheClassic (meilleure réponse jusqu'à présent!), Vous devez garder à l'esprit que si vous ne générez pas vos modèles avec quelque chose qui peut insérer un horodatage valide à la place de $ TIMESTAMP $, vous devez le mettre à jour manuellement avec un horodatage ou une autre identification unique. Voici mon exemple fonctionnel, il supprime avec succès le déploiement existant et en crée un nouveau, mais je devrai mettre à jour ces valeurs uniques manuellement lorsque je veux créer un autre ensemble de modifications:

    rDeployment05012019355:
        Type: AWS::ApiGateway::Deployment
        DependsOn: rApiGetMethod
        Properties:
            RestApiId:
                Fn::ImportValue: 
                    !Sub '${pApiCoreStackName}-RestApi'
            StageName: !Ref pStageName

    rCustomDomainPath:
        Type: AWS::ApiGateway::BasePathMapping
        DependsOn: [rDeployment05012019355]
        Properties:
            BasePath: !Ref pPathPart
            Stage: !Ref pStageName
            DomainName:
                Fn::ImportValue: 
                    !Sub '${pApiCoreStackName}-CustomDomainName'
            RestApiId:
                Fn::ImportValue: 
                    !Sub '${pApiCoreStackName}-RestApi'
3
dontpanic42