Terraform терпит неудачу в CI, работая хорошо локально при создании корзины S3 и журналов потока - PullRequest
0 голосов
/ 08 января 2019

Я написал следующий код Terraform:

data "template_file" "external-bucket-policy" {
    template = "${file("${path.module}/policies/bucket-policy.tpl")}"

    vars {
        bucket-name = "${local.bucket_name}"
    }
}

resource "aws_s3_bucket" "vpc_logs_recordsyes" {
    bucket = "${local.bucket_name}"
    acl = "private"
    force_destroy = false
    versioning {
        enabled = true
    }


    policy = "${data.template_file.external-bucket-policy.rendered}"

}

тогда я хочу создать журналы потока VPC:

resource "aws_flow_log" "example" {
    log_destination      = "arn:aws:s3:::${local.bucket_name}"
    log_destination_type = "${var.log_destination_type}"
    traffic_type         = "${var.traffic_type}"
    vpc_id               = "${var.vpc_id}"
}

при работе в CI я получаю следующее:

aws_s3_bucket.vpc_logs_recordsyes: Creating...
  acceleration_status:         "" => "<computed>"
  acl:                         "" => "private"
  arn:                         "" => "<computed>"
  bucket:                      "" => "xsight-logging-bucket-Dev-us-east-1"
  bucket_domain_name:          "" => "<computed>"
  bucket_regional_domain_name: "" => "<computed>"
  force_destroy:               "" => "false"
  hosted_zone_id:              "" => "<computed>"
  policy:                      "" => "{\r\n    \"Version\": \"2012-10-17\",\r\n    \"Statement\": [\r\n        {\r\n            \"Sid\": \"\",\r\n            \"Effect\": \"Deny\",\r\n            \"Principal\": {\r\n                \"AWS\": \"*\"\r\n            },\r\n            \"Action\": \"s3:DeleteBucket\",\r\n            \"Resource\": \"arn:aws:s3:::xsight-logging-bucket-Dev-us-east-1\"\r\n        },\r\n        {\r\n             \"Sid\": \"DenyIncorrectEncryptionHeader\",\r\n             \"Effect\": \"Deny\",\r\n             \"Principal\": \"*\",\r\n             \"Action\": \"s3:PutObject\",\r\n             \"Resource\": \"arn:aws:s3:::xsight-logging-bucket-Dev-us-east-1/*\",\r\n             \"Condition\": {\r\n                     \"StringNotEquals\": {\r\n                            \"s3:x-amz-server-side-encryption\": \"AES256\"\r\n                      }\r\n             }\r\n        },\r\n        {\r\n            \"Sid\": \"DenyUnEncryptedObjectUploads\",\r\n            \"Effect\": \"Deny\",\r\n            \"Principal\": \"*\",\r\n            \"Action\": \"s3:PutObject\",\r\n            \"Resource\": \"arn:aws:s3:::xsight-logging-bucket-Dev-us-east-1/*\",\r\n            \"Condition\": {\r\n                \"Null\": {\r\n                    \"s3:x-amz-server-side-encryption\": true\r\n                }\r\n            }\r\n        }\r\n    ]\r\n}"
  region:                      "" => "<computed>"
  request_payer:               "" => "<computed>"
  versioning.#:                "" => "1"
  versioning.0.enabled:        "" => "true"
  versioning.0.mfa_delete:     "" => "false"
  website_domain:              "" => "<computed>"
  website_endpoint:            "" => "<computed>"
aws_flow_log.example: Creating...
  log_destination:      "" => "arn:aws:s3:::xsight-logging-bucket-Dev-us-east-1"
  log_destination_type: "" => "s3"
  log_group_name:       "" => "<computed>"
  traffic_type:         "" => "ALL"
  vpc_id:               "" => "vpc-3e2ab845"

Error: Error applying plan:

2 error(s) occurred:

* aws_s3_bucket.vpc_logs_recordsyes: 1 error(s) occurred:

* aws_s3_bucket.vpc_logs_recordsyes: Error creating S3 bucket: InvalidBucketName: The specified bucket is not valid.
    status code: 400, request id: A2E94D42FF9CF218, host id: eD0zSCQ8+85kIIsctFeXcG4jLd4LDpeW0PRK01aq5JrWiW3qkyDKF76WeVKGgJVOcJT3gB2BBzk=
* aws_flow_log.example: 1 error(s) occurred:

* aws_flow_log.example: unexpected EOF

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Вы получаете сообщение об ошибке от вызова AWS, которое означает, что что-то не так на стороне AWS (и нет проблем с кодом Terraform). Ссылка: https://github.com/terraform-providers/terraform-provider-aws/blob/master/aws/resource_aws_s3_bucket.go#L583

Теперь, глядя на ошибку, важным ключевым словом является Error creating S3 bucket: InvalidBucketName.
Это говорит о том, что выбранное вами имя сегмента не соответствует всем правилам именования. Ссылаясь на документацию AWS (https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html) предлагает, имя сегмента должно НЕ иметь Верхний регистр .

Можете ли вы обновить имя вашего Bucket до xsight-logging-bucket-dev-us-east-1 и попробовать?

Кроме того, для ведения журнала vpc_flow вам не нужно добавлять arn:aws:s3:::.
Вы можете просто определить как log_destination = "${local.bucket_name}". Ссылка: https://www.terraform.io/docs/providers/aws/r/flow_log.html

0 голосов
/ 08 января 2019

Похоже, что ваше имя корзины не является действительным именем корзины S3, как указано в Руководство пользователя AWS :

Ниже приведены правила именования сегментов S3 во всех регионах AWS:

  • Имена сегментов должны быть уникальными для всех существующих имен сегментов в Amazon S3.

  • Имена сегментов должны соответствовать соглашениям об именах DNS.

  • Имена сегментов должны быть длиной не менее 3 и не более 63 символов.

  • Имена сегментов не должны содержать заглавных букв или подчеркиваний.

  • Имена контейнеров должны начинаться со строчной буквы или цифры.

  • Имена ковшей должны состоять из одной или нескольких меток. Смежные метки разделены одним периодом (.). Названия ведер могут содержат строчные буквы, цифры и дефисы. Каждый ярлык должен начинаться и заканчиваться строчной буквой или цифрой.

  • Имена сегментов не должны форматироваться как IP-адрес (например, 192.168.5.4).

  • При использовании виртуальных сегментов в стиле хостинга с Secure Sockets Layer (SSL), подстановочный сертификат SSL совпадает только с сегментами, которые не
    содержать периоды. Чтобы обойти это, используйте HTTP или напишите свой
    логика проверки сертификата. Мы рекомендуем не использовать
    точки (".") в именах сегментов при использовании виртуального размещенного стиля
    ковши.

В частности, обратите внимание на ту часть, которую я выделил жирным шрифтом, в которой упоминается, что имя сегмента не должно содержать заглавных букв, в то время как ваш план показывает, что вы используете заглавный символ в имени блока S3:

  bucket:                      "" => "xsight-logging-bucket-Dev-us-east-1"

Terraform обычно может отлавливать эти типы ошибок в плановое время, так как проверка известна заранее. К сожалению, он также должен быть обратно совместимым, и до 1 марта 2018 года корзины в США-Восток-1 имели менее ограничительную схему именования блоков, поэтому проверить это нелегко в плановое время.


Кроме того, ваши журналы потока имеют состояние состязания, потому что Terraform пытается одновременно создать корзину S3 и журнал потока VPC.

Чтобы дать Terraform подсказку о порядке зависимости ресурсов, вы можете интерполировать выходные данные одного в параметры другого или использовать depends_on, если это невозможно.

В вашем случае вам просто нужно обратиться к ресурсу S3 bucket в ресурсе журнала потока VPC:

resource "aws_flow_log" "example" {
  log_destination      = "${aws_s3_bucket.vpc_logs.bucket}"
  log_destination_type = "${var.log_destination_type}"
  traffic_type         = "${var.traffic_type}"
  vpc_id               = "${var.vpc_id}"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...