スキップしてコンテンツを表示

CloudFormation を使用して Amazon EC2 インスタンスをプロビジョニングするときに、CodeDeploy エージェントを確実にデプロイする方法を教えてください。

所要時間2分
0

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

簡単な説明

CodeDeploy デプロイのターゲットとして次のリソースのいずれかを作成する場合は、cfn-init および cfn-signal ヘルパースクリプトを使用します。

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

インフラストラクチャのデプロイをプロビジョニングする前にヘルパースクリプトを使用すると、ターゲットインスタンスを CodeDeploy エージェントで完全にプロビジョニングできます。

解決策

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

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

2.Metadata キーに、AWS::CloudFormation::Init タイプを使用してインスタンスまたは起動設定のメタデータを含めます。

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 エージェントのインストールステップが含まれています。次のステップを完了した後に、CloudFormation スタックにシグナルバックするコマンドも含まれています。

3.UserData プロパティを設定して cfn-init スクリプトを呼び出します。

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 オートスケーリンググループに、特定の期間内に CloudFormation に成功シグナルを送信するよう要求します。

Amazon EC2 インスタンスが特定の期間内に CloudFormation に成功シグナルを送信することを要求する CreationPolicy 属性の例

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

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

デプロイグループリソースの明示的な依存関係を作成する 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.CloudFormation テンプレートを完成させるために、環境に必要なその他のリソース、プロパティ、出力を含めます。

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

関連情報

CodeDeploy 用 AWS CloudFormation テンプレートのリファレンス

CodeDeploy 用の Amazon EC2 インスタンスを作成する (AWS CloudFormation テンプレート)

AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ