Comment puis-je installer l'agent CodeDeploy à l'aide de cfn-init ?

Date de la dernière mise à jour : 22/11/2019

Comment puis-je m'assurer que l'agent AWS CodeDeploy est installé et exécuté sur des instances Amazon Elastic Compute Cloud (Amazon EC2) lorsque je mets en service mon infrastructure et mes ressources CodeDeploy à l'aide d'AWS CloudFormation ?

Brève description

Si vous créez une ressource AWS::EC2::Instance ou AWS::AutoScaling::AutoScalingGroup comme cible d'un déploiement avec CodeDeploy, utilisez les scripts d'assistantcfn-init et cfn-signal. Avant de mettre en service le déploiement de votre infrastructure, vous pouvez commencer par utiliser les scripts d'assistant pour mettre entièrement en service vos instances cibles avec l'agent CodeDeploy.

Résolution

Pour utiliser les scripts d'assistant cfn-init et cfn-signal afin de déployer l'agent CodeDeploy, procédez comme suit pour configurer correctement le modèle AWS CloudFormation.

1.    Dans un éditeur de code, créez un fichier JSON ou YAML à utiliser comme modèle AWS CloudFormation pour vos ressources.

2.    Pour la clé « Metadata » (Métadonnées), utilisez le type AWS::CloudFormation::Init pour inclure les métadonnées pour votre instance ou configuration de lancement. Consultez l'exemple suivant :

"SampleLinuxInstance" : {
            "Type" : "AWS::EC2::Instance",
            "Metadata" : {
                "AWS::CloudFormation::Init" : {
                    "config" : {
                        "packages" : {
                            "yum" : {
                                "ruby" : []
                            }
                        },
                        "files" : {
                            "/home/ec2-user/install" : {
                                "source" : {"Fn::Join" : ["", ["https://aws-codedeploy-", {"Ref" : "AWS::Region"}, ".s3.amazonaws.com/latest/install"]]},
                                "mode" : "000755"
                            }
                        },
                        "commands" : {
                            "00-install-agent" : {
                                "command" : "./install auto",
                                "cwd" : "/home/ec2-user/"
                            },
                            "01-cfn-signal" : {
                                "command" : {"Fn::Join" : ["", ["/opt/aws/bin/cfn-signal -e 0 --stack ", { "Ref": "AWS::StackName" }, " --resource SampleLinuxInstance --region ", { "Ref" : "AWS::Region" }]]}
                            }
                        }
                    }
                }
            },
            "Properties" : {
                ...
            }
        }

Remarque : le type AWS::CloudFormation::Init inclut des étapes d'installation de l'agent CodeDeploy ainsi que la commande destinée à envoyer un signal à la pile AWS CloudFormation une fois que vous avez terminé les étapes suivantes.

3.    Définissez la propriété UserData pour appeler le script cfn-init. Consultez l'exemple suivant :

"Properties" : {
                "InstanceType" : "t2.micro",
                "ImageId" : {"Ref" : "AMI"},
                "IamInstanceProfile" : {"Ref" : "SampleInstanceProfile"},
                "KeyName" : {"Ref" : "SSHKey"},
                "UserData" :  {"Fn::Base64" : {
                    "Fn::Join" : ["", [
                        "#!/bin/bash\n",
                        "yum -y update\n",
                        "yum -y install cfn-bootstrap\n",
                        "/opt/aws/bin/cfn-init -v",
                        " --stack ", { "Ref" : "AWS::StackName" },
                        " --resource SampleLinuxInstance",
                        " --region ", { "Ref" : "AWS::Region" }, 
                        "\n"
                    ]]
                }},
                "Tags" : [
                    {
                        "Key" : {"Ref" : "InstanceTagKey"},
                        "Value" : {"Ref" : "InstanceTagValue"}
                    }
                ]
            }

4.    Pour la ressource d'instance, utilisez l'attribut CreationPolicy pour demander à l'instance Amazon EC2 ou au groupe Auto Scaling d'Amazon EC2 d'envoyer des signaux de réussite à AWS CloudFormation dans un délai spécifié. Consultez l'exemple suivant :

"SampleLinuxInstance" : {
            "Type" : "AWS::EC2::Instance",
            "CreationPolicy" : {
                "ResourceSignal" : {
                    "Count" : "1",
                    "Timeout" : "PT5M"
                }
            },

5.    Pour créer une dépendance explicite pour votre ressource de groupe de déploiement sur l'instance Amazon EC2 ou le groupe Auto Scaling d'Amazon EC2, utilisez l'attribut DependsOn. Consultez l'exemple suivant :

"SampleLinuxCDDeploymentGroup" : {
            "Type" : "AWS::CodeDeploy::DeploymentGroup",
            "DependsOn" : "SampleLinuxInstance",
            "Properties" : {
                "ApplicationName" : {"Ref" : "SampleCDApp"},
                "ServiceRoleArn" : {"Ref" : "ServiceRole"},
                "Ec2TagFilters" : [
                    {
                        "Key" : {"Ref" : "InstanceTagKey"},
                        "Value" : {"Ref" : "InstanceTagValue"},
                        "Type" : "KEY_AND_VALUE"
                    }
                ],
                "Deployment" : {
                    "Revision" : {
                        "RevisionType" : "S3",
                        "S3Location" : {
                            "Bucket" : {"Ref" : "BucketName"},
                            "BundleType" : {"Ref" : "BundleType"},
                            "Key" : {"Ref" : "BundleKey"}
                        }
                    }
                }
            }
        }

6.    Pour renseigner le modèle AWS CloudFormation, incluez toutes les autres ressources, propriétés ou sorties obligatoires pour votre environnement.

7.    Utilisez le modèle renseigné pour créer une pile AWS CloudFormation.