2017-03-10 1 views
2

Je suis en train de migrer ma gestion de configuration sur AWS vers Terraform pour la rendre plus connectable. Ce que j'aime, c'est la possibilité de gérer les mises à jour tournantes vers un groupe de mise à jour automatique où Terraform attend que les nouvelles instances soient en service avant de détruire l'ancienne infrastructure. Cela fonctionne très bien avec l'infrastructure «nue». Mais j'ai rencontré un problème lors de la mise à jour des instances d'applications réelles. Le code est déployé via AWS CodeDeploy et je peux dire à Terraform d'utiliser le nom généré du nouveau groupe de mise à jour automatique comme cible de déploiement, mais il ne déploie pas le code sur les nouvelles instances au démarrage. Lorsque je sélectionne manuellement "déployer les modifications dans le groupe de déploiement", le déploiement démarre correctement. Des idées pour automatiser cette étape?Un moyen de déclencher un déploiement de CodeDeploy avec Terraform après des changements de configuration?

Répondre

1

https://www.terraform.io/docs/provisioners/local-exec.html pourrait être en mesure de le faire. Hypothèses de couple

Une fois que votre code a été affiché, vous suffit d'ajouter un

resource "something" "some_name" { 
    # Whatever config you've setup for the resource 
    provisioner "local-exec" { 
     command = "aws deploy create-deployment" 
    } 
} 

Pour votre information Aws déploiement commande create déploiement n'est pas complète, vous Je vais devoir jouer avec ça dans votre environnement jusqu'à ce que vous ayez les valeurs nécessaires pour déclencher le déploiement, mais j'espère que c'est suffisant pour vous aider à démarrer.

+0

Merci pour l'entrée. Oui, je connais l'option exec locale dans Terraform et pour l'instant cela semble être la seule option pour implémenter cette "fonctionnalité". Comme ce n'est pas vraiment "transportable/apatride" assez pour notre utilisation (plusieurs comptes AWS, aws cli non mandantory, différents Rôles et cetera) nous avons changé notre workflow (encore). – kgorskowski

0

Vous pouvez déclencher le déploiement directement dans vos données utilisateur dans le

resource "aws_launch_configuration" "my-application" { 
    name     = "my-application" 
    ... 
    user_data   = "${data.template_file.node-init.rendered}" 
} 

data "template_file" "node-init" { 
    template = "${file("${path.module}/node-init.yaml")}" 
} 

Contenu de mon nœud init.yaml, à la suite des recommandations de cette documentation: https://aws.amazon.com/premiumsupport/knowledge-center/codedeploy-agent-launch-configuration/

write_files: 
- path: /root/configure.sh 
content: | 
    #!/usr/bin/env bash 
    REGION=$(curl 169.254.169.254/latest/meta-data/placement/availability-zone/ | sed 's/[a-z]$//') 
    yum update -y 
    yum install ruby wget -y 
    cd /home/ec2-user 
    wget https://aws-codedeploy-$REGION.s3.amazonaws.com/latest/install 
    chmod +x ./install 
    ./install auto 
    # Add the following line for your node to update itself 
    aws deploy create-deployment --application-name=<my-application> --region=ap-southeast-2 --deployment-group-name=<my-deployment-group> --update-outdated-instances-only 
runcmd: 
    - bash /root/configure.sh 

Dans cette mise en œuvre le noeud est responsable du déclenchement du déploiement lui-même. Cela fonctionne parfaitement à ce jour pour moi mais peut entraîner le déploiement échoue si l'ASG crée plusieurs instances en même temps (dans ce cas les instances échouées seront terminées rapidement parce qu'elles ne sont pas saines).

Bien sûr, vous devez ajouter les autorisations suffisantes au rôle associé à vos nœuds pour déclencher le déploiement.

Ceci est toujours une solution de contournement et si quelqu'un sait solution se comporte de la même manière que cfn-init, je suis intéressé.