如何使用 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等