我们使用两个AWS账户,一个用于开发(开发),一个用于生产(产品),以及一个主要的AWS CodePipeline 。< / p>
此主要管道-目前在产品中运行-正在将我们的应用程序构建到Docker映像中并将其推送到dev中的ECR存储库,然后应触发一个单独的管道以启动一个在dev中部署到ECS。 如果在ECS开发人员中部署成功,则管道1中将执行手动批准步骤,以将容器升级为ECR产品,从而触发向ECS产品的部署。
现在存在问题:
我们正在使用CloudWatch事件规则来触发两个部署管道,并且该规则正在检查是否有来自CloudTrail的“ PutImage” 事件。
这仅适用于产品中放入ECR的图像,但不适用于开发中的图像。尽管我可以在dev中的Cloudtrail中看到事件,但规则不会触发。 >
可能是什么问题?使用Terraform,dev和prod的设置是相同的。
我首先认为运行在产品中的管道可能需要能够将事件发送给开发人员(https://aws.amazon.com/about-aws/whats-new/2017/06/cloudwatch-events-adds-cross-account-event-delivery-support/),但这不太可能,因为我已经可以在CloudTrail开发人员中看到这些事件了。
是因为管道本身在生产中运行?
管道1:应用程序git-> Docker构建并推送至开发人员ECR-如果在开发人员中进行部署 成功:手动批准->推送至产品ECR
管道2(未触发) Alibi git source->从ECR获取最新的图像标签 开发人员,输出imagedefinitions.json->输入imagedefinitions.json, 部署到ECS开发人员
管道3(经过手动批准已正确触发) 阿里比git source-> 从ECR pro获得最新的图像标签,输出imagedefinitions.json-> 输入imagedefinitions.json,部署到ECS产品
我们正在使用alibi git源,因为Codepipeline在开始时需要一个源。因此我们正在检查一个存储库,但是从ECR获取最新的图像标签是这里的重要步骤。
适用于产品而不适用于开发人员的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}"
]
}
}
}
非常感谢您的帮助!