Событие AWS Cloudtrail для сегмента S3 в Terraform

Мне было довольно сложно настроить автоматизацию с помощью Beanstalk и Codepipeline ...

Наконец-то я запустил его, основная проблема заключалась в событии S3 Cloudwatch, которое запускало Codepipeline. Я пропустил необходимую часть Cloudtrail и не нашел ее ни в одной документации.

Итак, текущая настройка такова: файл S3 загружается - ›Событие CloudWatch запускает Codepipeline -› Codepipeline развертывается в среде ElasticBeanstalk.

Как я уже сказал, чтобы получить триггер CloudWatch Event, вам понадобится 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 вы можете добавить несколько событий данных в один трейл, но мне не удалось сделать это в терраформе. Я пытался использовать то же имя, но это вызывает ошибку

Ошибка при создании CloudTrail: TrailAlreadyExistsException: Trail codepipeline-source-trail уже существует для клиента: XXXX

Я изо всех сил пытался объяснить свою проблему. Не уверен, понятно ли это. Вкратце: я хочу добавить data events:S3 в существующий след облаков с терраформой.

Спасибо за помощь, Даниэль




Ответы (2)


Вы пытались добавить несколько 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)

person Nick    schedule 02.02.2021
comment
Спасибо за быстрый ответ. Да, думаю, это возможно. Проблема здесь в том, что вы по-прежнему создаете новый трейл каждый раз, когда развертываете новый стек. Я мог бы изменить файлы терраформирования, чтобы добавить несколько beanstalks и codepipelines, а не просто каждый раз добавлять ресурс данных. но если вы развертываете по одному стеку для каждого проекта за раз, вы не можете добавить еще один источник данных к существующему следу ... - person can-I-do; 03.02.2021
comment
Как я писал в другом комментарии, возможно, единственный способ - создать облачный след для всего ведра, а не более детально использовать несколько событий облачного наблюдения для каждого файла. - person can-I-do; 03.02.2021
comment
Да, изучите второй вариант, где у вас есть выделенная тропа для стеблей бобов, а затем поиграйте с фильтрами в Правиле события. Если нет возможности отфильтровать нужные вам данные (если вы немного углубитесь в точный файл, который вы загружаете), вы можете взглянуть на вариант, в котором у вас есть: Выделенная трасса - ›CW Event -› триггеры лямбда с некоторой логикой для анализа того, какой это был файл - ›Лямбда запускает рассматриваемый конвейер на основе ключа имени файла. - person Nick; 03.02.2021
comment
Хм, это все еще кажется неправильным :) Но я думаю, я просто создаю один журнал следа для всех сегментов S3 и всех событий, а затем создаю событие Cloudwatch, указанное для каждого файла, которое будет запускать разные кодовые конвейеры ... спасибо за вашу помощь! - person can-I-do; 03.02.2021

Как я уже сказал, чтобы получить триггер CloudWatch Event, вам понадобится след Cloudtrail, например:

Для вызова события CloudWatch не требуется несколько CloudTrail. Вы также можете создавать правила для конкретных услуг.

Создайте правило CloudWatch Events для Amazon Источник S3 (консоль)

Из правила события CloudWatch для вызова CodePipeline в качестве цели. Допустим, вы создали это правило события

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

Вы добавляете CodePipeline в качестве цели для этого правила, и в конечном итоге Codepipeline развертывается в среде ElasticBeanstalk.

person samtoddler    schedule 02.02.2021
comment
Спасибо за ваш быстрый ответ, это была именно та проблема, с которой я столкнулся :) Без облачной части событие не будет запущено, поскольку оно зависит от регистрации для S3. Итак, вам нужно, чтобы оба триггера сработали окончательно! - person can-I-do; 03.02.2021
comment
Возможно, обходным путем было бы иметь только один след в облаке на всем S3 Bucekt и событие Cloudwatch в конкретном файле ... - person can-I-do; 03.02.2021
comment
@ can-I-do вам нужен только один облачный трейл, а не несколько. Как правило, всегда нужно иметь одну облачную трассу, а затем использовать ее для перехвата вызовов API через CloudWatch. - person samtoddler; 03.02.2021