设置CodePipeline-部署步骤的状态为失败

问题描述

this tutorial之后设置CodeDeploy时,在Setup CodePipeline的最后一步下

Deploy step has a status of failed

如果我单击失败下的详细信息

Action execution failed

如果我单击链接到执行详细信息

部署失败,因为找不到您的实例 部署组。检查您的部署组设置以确保 您的Amazon EC2实例或Auto Scaling组的标签 正确标识要部署到的实例,然后尝试 再次。

Link to execution details

这很可能是由于位置问题所致-有时在弗吉尼亚北部和伦敦使用过。

  • IAM-不需要选择区域。
  • S3-不需要区域选择。
  • LightSail实例-伦敦,A区(eu-west-2a)
  • CodeDeploy应用程序-弗吉尼亚北部(us-east-1)
  • CodeDeploy管道-伦敦,A区(eu-west-2a)

因此,我去了CodeDeploy,删除了北弗吉尼亚州的应用程序,并在伦敦的部署组创建了一个应用程序。然后,在伦敦在那里创建一条新管道。

这次部署也失败了,但是原因不同

整体部署失败,因为单个实例过多 部署失败,可用的健康实例太少 部署,或部署组中的某些实例是 遇到问题。

deployment failed because too many individual instances failed deployment

为了解决这个问题,我删除了两个管道并创建了一个新管道。由于我不得不更改角色,因此我使用了AWSCodePipelineserviceRole-eu-west-2-CodeDeployLightsailDemoPipeline,但这在创建管道的那一刻给我带来了麻烦

无法创建角色 AWSCodePipelineserviceRole-eu-west-2-CodeDeployLightsailDemoPipeline

Could not create role

因此,我将其更改为AWSCodePipelineserviceRole-eu-west-2-CodeDeployLightsailDemoP。然后,这使我陷入另一个问题

称为 AWSCodePipelineserviceRole-eu-west-2-CodeDeployLightsailDemoPipeline 已经存在。不允许重复的名称

Duplicate names are not allowed

因此,我回过头来,将管道名称更改为CodeDeployLightsailDemoPi,并将角色名称更改为AWSCodePipelineserviceRole-eu-west-2-CodeDeployLightsailDemoPi

这使我陷入困境

整体部署失败,因为单个实例过多 部署失败,可用的健康实例太少 部署,或部署组中的某些实例是 遇到问题。

我决定等待30分钟,并创建一个新管道,以其命名CodeDeployLightsailPipeline和角色名称AWSCodePipelineserviceRole-eu-west-2-CodeDeployLightsailPipelin,但是发生了相同的问题。

这是“部署ID”>“查看事件”中显示的信息

View Events

根据Marcin,我应该已经找到appspec.yml

version: 0.0
os: linux
files:
  - source: /index.html
    destination: /var/www/html/
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies
      timeout: 300
      runas: root
    - location: scripts/start_server
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server
      timeout: 300
      runas: root

其中提到了destination: /var/www/html/,但是在实例中没有这样的/var/www/html路径

No such path as /var/www/html

所以,我在其中创建了这两个文件

SSH and folders

并重新启动部署

Restart deployment

但是它像以前一样失败了。

如何使部署状态成功?


编辑

根据the documentation,此错误代码显示 HEALTH_CONSTRAINTS 。所以,我现在正在阅读:

解决方法

基于评论:

为了尝试重现问题,我在自己的具有CodeDeploy的Amazon Linux 2实例上部署了OP使用的应用程序CodeDeployGitHubDemo。我可以验证CodeDeployGitHubDemo及其appspec.yml文件是正确的并且可以按预期工作。

由于OP使用的是CodePipline(CP),因此建议退后一步并仅专注于使用CodeDeploy(CD)进行部署,而不会增加使用CP + CD组合的复杂性。这允许仅关注CD问题,并且应简化查找问题的根本原因。独立CD部署完成后,下一步就是将CP纳入部署过程,确切了解CD应该如何设置才能工作。


更具体地说,这就是完成的事情

  1. https://console.aws.amazon.com/iam/的IAM控制台中

    1.1。删除了一个角色(CodeDeployServiceRole)。

    1.2。创建了服务角色。

  2. https://console.aws.amazon.com/s3/的S3控制台中

    2.1。清空并删除一个存储桶(tiagocodedeploylightsailbucket)。

    2.2。在欧盟伦敦(eu-west-2)中创建了一个新存储桶。

  3. 返回到https://console.aws.amazon.com/iam/的IAM控制台

    3.1。删除了一个策略(CodeDeployS3BucketPolicy)。

    3.2。创建了新政策。

  4. 留在https://console.aws.amazon.com/iam/的IAM控制台中

    4.1。删除一个用户(LightSailCodeDeployUser)

    4.2。创建了一个新用户(请注意,该用户需要使用其他名称,否则将获得this problem)。

  5. 导航至https://lightsail.aws.amazon.com/上的Lightsail主页

    5.1。删除以前的实例(codedeploy)。

    5.2。使用Amazon Linux(Amazon_Linux_1)创建一个新实例(请注意,如果使用Amazon Linux 2,则将达到this problem

使用脚本

mkdir /etc/codedeploy-agent/

mkdir /etc/codedeploy-agent/conf

cat <<EOT >> /etc/codedeploy-agent/conf/codedeploy.onpremises.yml

---

aws_access_key_id: ACCESS_KEY

aws_secret_access_key: SECRET_KEY

iam_user_arn: arn:aws:iam::525221857828:user/GeneralUser

region: eu-west-2

EOT

wget https://aws-codedeploy-us-west-2.s3.us-west-2.amazonaws.com/latest/install

chmod +x ./install

sudo ./install auto
    在两个实例中都使用
  1. SSH

    6.1。验证codedeploy-agent是否正在运行(sudo service codedeploy-agent status

  2. 在具有本地设备上的AWS CLI的PowerShell中

    7.1。

运行

aws deploy register-on-premises-instance --instance-name Amazon_Linux_1 --iam-user-arn arn:aws:iam::525221857828:user/GeneralUser --region eu-west-2

然后

aws deploy add-tags-to-on-premises-instances --instance-names Amazon_Linux_1 --tags Key=Name,Value=CodeDeployLightsailDemo --region eu-west-2

然后

aws deploy list-on-premises-instances --region eu-west-2

最后,得到了输出

{
    "instanceNames": [
        "Amazon_Linux_1","codedeploy"
    ]
}
  1. https://eu-west-2.console.aws.amazon.com/codesuite/codedeploy/start?region=eu-west-2#上导航到CodeDeploy控制台

    8.1。删除应用程序(CodeDeployLightsailDemo)。

    8.2。使用新的部署组(CodeDeployLightsailDemoDeploymentGroup)创建一个新应用程序。

  2. https://eu-west-2.console.aws.amazon.com/codesuite/codepipeline/start?region=eu-west-2上浏览至CodePipeline控制台

    9.1。删除管道(CodeDeployLightsailDemoPipeline)。

    9.2。使用“新服务角色”创建新管道。

It worked