首页 > 解决方案 > AWS CloudWatch 触发 CodePipeline 执行在一个账户中有效,但在另一个账户中无效

问题描述

我们使用两个 AWS 账户,一个用于开发 (dev)一个用于生产 (prod)一个用于主 AWS CodePipeline

这个主要管道 -目前在 prod 中运行- 正在将我们的应用程序构建到 Docker 映像中并将其推送到 dev 中的 ECR 存储库,并且应该从那里触发一个单独的管道以开始部署到 dev 中的 ECS。如果在 ECS 开发中部署成功,则在管道 1 中有一个手动批准步骤,以将容器提升到 ECR 产品,这会触发部署到 ECS 产品。

现在有一个问题:

我们正在使用 CloudWatch 事件规则来触发两个部署管道,并且该规则正在检查来自 CloudTrail的“PutImage”事件。

这仅适用于在 prod 中放入 ECR 的图像,但不适用于在 dev 中。规则根本不会触发,尽管我可以在开发中看到 Cloudtrail 中的事件。

可能是什么问题?使用 Terraform,dev 和 prod 的设置是相同的。

我首先认为在 prod 中运行的管道可能需要能够向开发人员发送事件(https://aws.amazon.com/about-aws/whats-new/2017/06/cloudwatch-events-adds-cross -account-event-delivery-support/),但这不太可能,因为我已经可以在 CloudTrail dev 中看到这些事件。

可能是因为管道本身正在生产中运行吗?

管道 1:应用程序 git -> Docker 构建并推送到 dev ECR - 如果在 dev 中部署成功:手动批准 -> 推送到 prod ECR

管道 2(未触发) Alibi git 源 -> 从 ECR 开发人员获取最新图像标签,输出 imagedefinitions.json -> 输入 imagedefinitions.json,部署到 ECS 开发人员

管道 3(手动批准后正确触发)Alibi git 源 -> 从 ECR pro 获取最新图像标签,输出 imagedefinitions.json -> 输入 imagedefinitions.json,部署到 ECS prod

我们使用的是不在场证明的 git 源代码,因为 Codepipeline 在开始时需要一个源代码;所以我们正在检查一个 repo,但是从 ECR 获取最新的图像标签是这里重要的一步。

适用于 prod 但不适用于 dev的 Cloudwatch 事件规则:

resource "aws_cloudwatch_event_rule" "latest_image" {
  name        = "latest-image"
  description = "Capture push to ECR"

  event_pattern = <<PATTERN
{
  "source": [
    "aws.ecr"
  ],
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "detail": {
    "eventSource": [
      "ecr.amazonaws.com"
    ],
    "eventName": [
      "PutImage"
    ],
    "awsRegion": [
      "${var.region}"
    ],
    "requestParameters": {
      "repositoryName": [
        "${var.application_name}"
      ],
      "registryId": [
        "${var.account_id}"
      ]
    }
  }
}

非常感谢您的帮助!

标签: amazon-web-servicesamazon-ecsaws-codepipeline

解决方案


推荐阅读