cfn-init を使用して CodeDeploy エージェントをインストールするにはどうすればよいですか ?

最終更新日: 2019 年 11 月 22 日

AWS CloudFormation を使用してインフラストラクチャと CodeDeploy リソースをプロビジョニングするときに、AWS CodeDeploy エージェントが Amazon Elastic Compute Cloud (Amazon EC2) インスタンスにインストールされ、実行されていることを確認するにはどうすればよいですか ?

簡単な説明

CodeDeploy を使用したデプロイのターゲットとして AWS::EC2::Instance リソースまたは AWS::AutoScaling::AutoScalingGroup リソースを作成する場合は、cfn-init および cfn-signal ヘルパースクリプトを使用します。インフラストラクチャのデプロイをプロビジョニングする前に、ヘルパースクリプトを使用して CodeDeploy エージェントでターゲットインスタンスを完全にプロビジョニングできます。

解決方法

cfn-init および cfn-signal ヘルパースクリプトを使用して CodeDeploy エージェントをデプロイするには、次のステップを実行して AWS CloudFormation テンプレートを適切に設定します。

1.    コードエディタで、リソースの AWS CloudFormation テンプレートとして使用する JSON または YAML ファイルを作成します。

2.    Metadata キーの場合、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" : {
                ...
            }
        }

注: AWS::CloudFormation::Init タイプには、CodeDeploy エージェントの インストール手順 と、次のステップを完了した後に AWS CloudFormation スタックにシグナルバックするコマンドが含まれます。

3.    UserData プロパティを設定して 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.    インスタンスリソースの場合、CreationPolicy 属性 を使用して、Amazon EC2 インスタンスまたは Amazon EC2 Auto Scaling グループが指定期間内に AWS CloudFormation に成功シグナルを送信するように要求します。次の例をご参照ください。

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

5.    Amazon EC2 インスタンスまたは Amazon EC2 Auto Scaling グループのデプロイグループリソースの明示的な依存関係を作成するには、DependsOn 属性を使用します。次の例をご参照ください。

"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.    AWS CloudFormation テンプレートを完了するには、環境に必要なその他の追加リソース、プロパティ、または出力を含めます。

7.    完成したテンプレートを使用して、 AWS CloudFormation スタックを作成します