Как избежать ошибки цикла при настройке политики сегмента S3 с шаблоном, который зависит от имени сегмента?

У меня есть terraform файл, который не работает, когда я запускаю terraform plan, и я получаю сообщение об ошибке:

Error: Cycle: module.hosting.data.template_file.bucket_policy, module.hosting.aws_s3_bucket.website

Это имеет смысл, поскольку сегмент относится к политике и наоборот:

data "template_file" "bucket_policy" {
  template = file("${path.module}/policy.json")
  vars = {
    bucket = aws_s3_bucket.website.arn
  }
}

resource "aws_s3_bucket" "website" {
  bucket = "xxx-website"

  website {
    index_document = "index.html"
  }

  policy = data.template_file.bucket_policy.rendered
}

Как я могу избежать этой двунаправленной ссылки?




Ответы (2)


Вы можете построить ARN ведра самостоятельно:

locals {
  bucket_name = "example"
  bucket_arn  = "arn:aws:s3:::${local.bucket_name}"
}

data "template_file" "bucket_policy" {
  template = file("${path.module}/policy.json")
  vars = {
    bucket = local.bucket_arn
  }
}

resource "aws_s3_bucket" "website" {
  bucket = local.bucket_name

  website {
    index_document = "index.html"
  }

  policy = data.template_file.bucket_policy.rendered
}
person ydaetskcoR    schedule 18.05.2020
comment
Хорошее предложение, но потом появляется еще одна ошибка: Error putting S3 policy: MalformedPolicy: Policy has invalid resource - person saronet; 18.05.2020
comment
Отредактируйте мой комментарий выше: работает отлично. Мне также пришлось внести соответствующие изменения в файл policy.json - person saronet; 18.05.2020
comment
Это работает, но это сложнее, чем необходимо. Кроме того, создать Amazon S3 ARN вручную просто, но есть и другие типы ресурсов, которые могут иметь циклические зависимости с более сложными ARN. И создание ARN вручную для всех из них может быть довольно громоздким и подверженным ошибкам. По этой причине существуют определенные подключаемые ресурсы, например aws_s3_bucket_policy, которые помогают разрешить циклическую зависимость без взлома. - person Dennis Traub; 18.05.2020

Вы можете использовать ресурс aws_s3_bucket_policy. Это позволяет создавать ресурсы без циклической зависимости.

Таким образом, Terraform может:

  1. Создайте ведро
  2. Создайте файл шаблона, используя корзину ARN
  3. Создайте политику, вернувшись к файлу шаблона и прикрепив его к корзине.

Код будет выглядеть примерно так:

data "template_file" "bucket_policy" {
  template = file("${path.module}/policy.json")
  vars = {
    bucket = aws_s3_bucket.website.arn
  }
}

resource "aws_s3_bucket" "website" {
  bucket = "xxx-website"

  website {
    index_document = "index.html"
  }
}

resource "aws_s3_bucket_policy" "b" {
  bucket = "${aws_s3_bucket.website.id}"

  policy = data.template_file.bucket_policy.rendered
}
person Dennis Traub    schedule 18.05.2020