Comment m'assurer que l'agent CodeDeploy est déployé lorsque j'utilise CloudFormation pour allouer des instances Amazon EC2 ?

Dernière mise à jour : 11/03/2022

J'approvisionne mon infrastructure et mes ressources AWS CodeDeploy à l'aide d'AWS CloudFormation. Comment puis-je m'assurer que l'agent CodeDeploy est installé et s'exécute sur mes instances Amazon Elastic Compute Cloud (Amazon EC2) ?

Brève description

Si vous créez l'une des ressources suivantes comme cible d'un déploiement CodeDeploy, utilisez alors les scripts d'assistance cfn-init et cfn-signal :

  • AWS::EC2::Instance
  • AWS::AutoScaling::AutoScalingGroup

Avant d'allouer votre déploiement d'infrastructure, vous pouvez utiliser les scripts d'assistant pour allouer totalement vos instances cible avec l'agent CodeDeploy.

Solution

Pour utiliser les scripts d'assistant cfn-init et cfn-signal afin de déployer l'agent CodeDeploy, suivez la procédure ci-dessous pour configurer correctement le modèle AWS CloudFormation.

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

2.    Pour la clé Metadata, utilisez le type AWS::CloudFormation::Init pour inclure des métadonnées pour votre instance ou votre configuration du lancement.

Exemple de clé de métadonnées qui utilise le type AWS::CloudFormation::Init

"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 les étapes d'installation de l'agent CodeDeploy. Il inclut également la commande permettant de renvoyer un signal à la pile CloudFormation une fois que vous avez effectué les étapes suivantes.

3.    Définissez la propriété UserData pour invoquer le script cfn-init.

Exemple de propriété UserData qui appelle le script cfn-init

"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, configurez l'attribut CreationPolicy pour faire ce qui suit : exiger que l'instance Amazon EC2 ou le groupe Amazon EC2 Auto Scaling envoie des signaux de réussite à CloudFormation au cours d'une période spécifique.

Exemple d'attribut CreationPolicy qui exige qu'une instance Amazon EC2 envoie des signaux de réussite à CloudFormation au cours d'une période spécifique

"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 Amazon EC2 Auto Scaling, utilisez l'attribut DependsOn.

Exemple d'attribut DependsOn qui crée une dépendance explicite pour une ressource de groupe de déploiement

"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 finaliser le modèle CloudFormation, incluez toutes les autres ressources, propriétés ou sorties obligatoires pour votre environnement.

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