如何使用 codedeploy 自动将代码部署到 ASG 下新创建的 EC2 实例?

Posted

技术标签:

【中文标题】如何使用 codedeploy 自动将代码部署到 ASG 下新创建的 EC2 实例?【英文标题】:How to automatically deploy code to newly created EC2 instances under ASG with codedeploy? 【发布时间】:2017-12-23 22:45:22 【问题描述】:

我在 ASG 下有 2 个 EC2 实例。我使用设置为使用自动缩放的 DeploymentGroup1 在 codeDeploy 中创建了 Application1。

我面临的问题是,当配置新的 EC2 实例时,codedeploy 不会创建新的部署并且代码不会推送到实例。看起来连日志都看不到发生了什么。

当我为我的自动缩放组列出挂钩时,我确实看到了它们:

$ aws autoscaling describe-lifecycle-hooks --auto-scaling-group-name SAND-web-ASG 

    "LifecycleHooks": [
        
            "GlobalTimeout": 60000,
            "HeartbeatTimeout": 600,
            "AutoScalingGroupName": "SAND-web-ASG",
            "LifecycleHookName": "CodeDeploy-managed-automatic-launch-deployment-hook-DeployToNewEC2underASG-...",
            "NotificationMetadata": "....",
            "DefaultResult": "ABANDON",
            "NotificationTargetARN": "arn:aws:sqs:us-west-1:blabla:blahh-us-west-1-prod-default-autoscaling-lifecycle-hook",
            "LifecycleTransition": "autoscaling:EC2_INSTANCE_LAUNCHING"
        
    ]

这里有什么遗漏或错误吗?这些不是自定义的,它们是由 codedeploy 创建的。

我一直在关注guide to setup codedeploy with ASG,所有内容都已创建,但由于某种原因,当创建新实例时,codedeploy 不会创建新部署..我有点迷失为什么..

我的服务角色有 2 个 IAM 政策:

1 - 默认来自亚马逊 AWSCodedeployRole

2 - 具有以下权限的 codePipelinePolicy(自定义):


  "Version": "2012-10-17",
  "Statement": [
    
      "Effect": "Allow",
      "Action": [
        "autoscaling:CompleteLifecycleAction",
        "autoscaling:DeleteLifecycleHook",
        "autoscaling:DescribeAutoScalingGroups",
        "autoscaling:DescribeLifecycleHooks",
        "autoscaling:PutLifecycleHook",
        "autoscaling:RecordLifecycleActionHeartbeat",
        "autoscaling:CreateAutoScalingGroup",
        "autoscaling:UpdateAutoScalingGroup",
        "autoscaling:EnableMetricsCollection",
        "autoscaling:DescribeAutoScalingGroups",
        "autoscaling:DescribePolicies",
        "autoscaling:DescribeScheduledActions",
        "autoscaling:DescribeNotificationConfigurations",
        "autoscaling:DescribeLifecycleHooks",
        "autoscaling:SuspendProcesses",
        "autoscaling:ResumeProcesses",
        "autoscaling:AttachLoadBalancers",
        "autoscaling:PutScalingPolicy",
        "autoscaling:PutScheduledUpdateGroupAction",
        "autoscaling:PutNotificationConfiguration",
        "autoscaling:PutLifecycleHook",
        "autoscaling:DescribeScalingActivities",
        "autoscaling:DeleteAutoScalingGroup",
        "ec2:DescribeInstances",
        "ec2:DescribeInstanceStatus",
        "ec2:TerminateInstances",
        "tag:GetTags",
        "tag:GetResources",
        "sns:Publish",
        "cloudwatch:DescribeAlarms",
        "elasticloadbalancing:DescribeLoadBalancers",
        "elasticloadbalancing:DescribeInstanceHealth",
        "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
        "elasticloadbalancing:DeregisterInstancesFromLoadBalancer"
      ],
      "Resource": "*"
    
  ]

我在这里遗漏了什么,或者我没有看到什么错误(愚蠢的错误)?

任何建议都非常感谢。 谢谢, 欧内斯特

【问题讨论】:

是否已在这些 EC2 实例上安装并运行 CodeDeploy 代理?如果没有,它必须是。如果是,请检查 CodeDeploy 代理的日志(在 /opt/codedeploy-agent/deployment-root/deployment-logs 中)。 是的,代理已安装。这是Amazon Linux OS,日志在/var/log/aws/codedeploy-agent/codedeploy-agent.log下它显示 2017-07-19 15:17:13 INFO [codedeploy-agent(3534)]: Version file found in /opt/codedeploy-agent/.version. 2017-07-19 15:18:13 INFO [codedeploy-agent(3534)]: [Aws::CodeDeployCommand::Client 200 60.290274 0 retries] poll_host_command(host_identifier:"arn:aws:ec2:us-west-1:<ACCOUNT-ID>:instance/i-<INSTANCE-ID>") 2017-07-19 15:18:14 INFO [codedeploy-agent(3534)]: Version file found in /opt/codedeploy-agent/.version. 谢谢 如果您还没有,请查看故障排除指南 (docs.aws.amazon.com/codedeploy/latest/userguide/…)。 【参考方案1】:

根据您的描述,我没有看到您提到已成功部署到您的应用程序。在扩展期间,CodeDeploy 将尝试部署应用程序的目标版本,但如果找不到,则根本不会发布部署,这将导致您看到的问题。您应该执行部署以更新应用程序的目标版本,然后尝试扩大规模,看看是否能解决问题。

【讨论】:

问题是缺少权限。在我正确设置 IAM 策略后,一切都开始工作了。 有没有人成功编写过用于创建 codedeploy 部署的 lambda 函数?我在 AWS forum 上发过帖子,但这里的人似乎要快得多。提前致谢。

以上是关于如何使用 codedeploy 自动将代码部署到 ASG 下新创建的 EC2 实例?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 lambda 将 s3 中的最新代码部署到 lambda 函数

git webhook自动部署服务端代码django python docker等

Jenkins+python+selenium持续继承自动化测试

如何自动将战争从 Nexus 部署到 Tomcat?

怎么把python部署到服务器

如何从 Xcode Bot 将自动化构建部署到 TestFlight?