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

Setup CodePipeline - Deploy step has a status of failed

this tutorial 之后设置 CodeDeploy 时,在设置 CodePipeline

的最后一步下

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

如果我点击 Link 进入执行详情

The deployment failed because no instances were found for your deployment group. Check your deployment group settings to make sure the tags for your Amazon EC2 instances or Auto Scaling groups correctly identify the instances you want to deploy to, and then try again.

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

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

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

The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems.

为了解决这个问题,我删除了两个管道并创建了一个新管道。因为我不得不改变角色,所以我使用了 AWSCodePipelineServiceRole-eu-west-2-CodeDeployLightsailDemoPipeline 但这让我在创建管道时遇到了麻烦

Could not create role AWSCodePipelineServiceRole-eu-west-2-CodeDeployLightsailDemoPipeline

所以,我把它改成了AWSCodePipelineServiceRole-eu-west-2-CodeDeployLightsailDemoP。然后,这让我陷入了另一个问题

A policy called AWSCodePipelineServiceRole-eu-west-2-CodeDeployLightsailDemoPipeline already exists. Duplicate names are not allowed.

所以,我回去将管道名称更改为 CodeDeployLightsailDemoPi,将角色名称更改为 AWSCodePipelineServiceRole-eu-west-2-CodeDeployLightsailDemoPi

这让我陷入了同样的境地

The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems.

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

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

根据Marcin, I should have found the 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 路径

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

并重新启动部署

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

如何使部署状态变为成功?


编辑

根据 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. 返回 IAM 控制台 https://console.aws.amazon.com/iam/

    3.1。删除了一项政策 (CodeDeployS3BucketPolicy)。

    3.2。已创建新政策。

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

    4.1。删除一个用户 (LightSailCodeDeployUser)

    4.2。创建了一个新用户(注意它需要有一个不同的名字,否则会得到 )。

  5. 导航至位于 https://lightsail.aws.amazon.com/

    的 Lightsail 主页

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

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

使用脚本

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。使用“新服务角色”创建新管道。