Terraform 中 S3 存储桶的 AWS Cloudtrail 事件

问题描述

我很难用 Beanstalk 和 Codepipeline 设置自动化...

我终于让它运行了,主要问题是触发 Codepipeline 开始的 S3 Cloudwatch 事件。我错过了必要的 Cloudtrail 部分,但在任何文档中都找不到。

所以当前的设置是: S3 文件上传 -> CloudWatch 事件触发 Codepipeline -> Codepipeline 部署到 ElasticBeanstalk 环境。

正如我所说,要获得 CloudWatch 事件触发器,您需要一个 Cloudtrail 跟踪,例如:

resource "aws_cloudtrail" "example" {
  # ... other configuration ...
  name = "codepipeline-source-trail" #"codepipeline-${var.project_name}-trail"
  is_multi_region_trail = true
  s3_bucket_name = "codepipeline-cloudtrail-placeholder-bucket-eu-west-1"
  event_selector {
    read_write_type           = "writeonly"
    include_management_events = true

    data_resource {
      type = "AWS::S3::Object"

      values = ["${data.aws_s3_bucket.bamboo-deploy-bucket.arn}/${var.project_name}/file.zip"]
    }
  }
}

但这只是为了创建一个新路径。问题是 AWS 最多只允许 5 个路径。在 AWS console 上,您可以向一条轨迹添加多个数据事件,但我无法在 terraform 中做到这一点。我尝试使用相同的名称,但这只会引发错误

“创建 CloudTrail 时出错:TrailAlreadyExistsException:客户的跟踪代码管道源跟踪已存在:XXXX”

我已尽力解释我的问题。不确定是否可以理解。 简而言之:我想在带有 terraform 的现有 cloudtrail 路径中添加一个 data events:S3

感谢帮助, 丹尼尔

解决方法

正如我所说,要获得 CloudWatch Event 触发器,您需要一个 Cloudtrail 跟踪,例如:

您不需要多个 CloudTrail 来调用 CloudWatch 事件。您也可以创建特定于服务的规则。

Create a CloudWatch Events rule for an Amazon S3 source (console)

CloudWatch 事件规则调用 CodePipeline 作为目标。假设您创建了此事件规则

{
  "source": [
    "aws.s3"
  ],"detail-type": [
    "AWS API Call via CloudTrail"
  ],"detail": {
    "eventSource": [
      "s3.amazonaws.com"
    ],"eventName": [
      "PutObject"
    ]
  }
}

您添加 CodePipeline 作为此规则的目标,最终,Codepipeline 部署到 ElasticBeanstalk 环境。

,

您是否尝试将多个 data_resources 添加到当前跟踪而不是添加具有相同名称的新跟踪:

resource "aws_cloudtrail" "example" {
  # ... other configuration ...
  name = "codepipeline-source-trail" #"codepipeline-${var.project_name}-trail"
  is_multi_region_trail = true
  s3_bucket_name = "codepipeline-cloudtrail-placeholder-bucket-eu-west-1"
  event_selector {
    read_write_type           = "WriteOnly"
    include_management_events = true

    data_resource {
      type = "AWS::S3::Object"

      values = ["${data.aws_s3_bucket.bamboo-deploy-bucket.arn}/${var.project_A}/file.zip"]
    }

    data_resource {
      type = "AWS::S3::Object"

      values = ["${data.aws_s3_bucket.bamboo-deploy-bucket.arn}/${var.project_B}/fileB.zip"]
    }
  }
}

您应该能够添加最多 250 个数据资源(在一个跟踪中的所有事件选择器中),以及最多 5 个事件选择器到您当前的跟踪 (CloudTrail quota limits)