Как условно создать корзину S3

Есть ли способ использовать вызов данных terraform для корзины (возможно, созданной и сохраненной в другом файле состояния), а затем, если в данных ничего нет, создать ресурс, установив счетчик?

Я проводил несколько экспериментов и постоянно получал следующее:

      Error: Failed getting S3 bucket (example_random_bucket_name): NotFound: Not Found
        status code: 404, request id: <ID here>, host id: <host ID here>

Пример кода для тестирования (он был изменен по сравнению с исходным кодом, который вызвал эту ошибку):

      variable "bucket_name" {
  default = "example_random_bucket_name"
}

data "aws_s3_bucket" "new" {
  bucket = var.bucket_name
}

resource "aws_s3_bucket" "s3_bucket" {
  count = try(1, data.aws_s3_bucket.new.id == "" ? 1 : 0 )
  bucket = var.bucket_name
}

Мне кажется, что вместо того, чтобы генерировать ошибку, я должен получить пустой результат, но это не так.

3 ответа

Terraform — это система с желаемым состоянием, поэтому вы можете описать только желаемый результат, а не шаги/условия для его достижения.

Если бы Terraform позволял вам решать, объявлять ли корзину на основе того, существует ли уже корзина с таким именем, вы бы создали конфигурацию, которая никогда не сможет сойтись: при первом запуске она не будет существовать, и поэтому ваша конфигурация объявит ее. . Но при втором запуске ведро будет существовать, и поэтому ваша конфигурация больше не будет его объявлять, и поэтому Terraform запланирует его уничтожить. При третьем запуске предложит создать заново и так далее.

Вместо этого вы должны решить в рамках проектирования вашей системы, какая конфигурация Terraform (или другая система) отвечает за управление каждым объектом:

  • Если вы решите, что конкретная конфигурация Terraform отвечает за управление этой корзиной S3, вы можете объявить ее с помощью безусловного ресурса.
  • Если вы решите, что какая-то другая система должна управлять корзиной, то вы напишете свою конфигурацию, чтобы каким-то образом узнать имя корзины откуда-то еще, например, с помощью входной переменной или с помощью aws_s3_bucketисточник данных.

К сожалению, вы не можете этого сделать. data sourcesдолжны существовать, иначе они ошибаются. В TF нет возможности проверить, существует ли ресурс или нет. Между ними нет ничего в том смысле, что ресурс может существовать, а может и не существовать.

Если вам требуется такая функциональность, вы должны запрограммировать ее самостоятельно с помощью внешнего источника данных . Или, может быть, проще, укажите входную переменную bucket_exist, чтобы вы явно установили его во время применения.

Источники данных рассчитаны на такой сбой.

Однако, если вы используете файл состояния из внешней конфигурации, можно объявить outputво внешнем состоянии, в зависимости от того, управляется ли корзина s3 этим состоянием, и использовать его в s3_bucketресурс как условие.

Например, вывод во внешнем состоянии будет пустой строкой (неуправляемой) или значением любого полезного для вас свойства. Boolean - еще один выбор. Удалите источник данных из этой конфигурации и добавьте условие к ресурсу на основе вывода.

Вам решать, если такие обходные пути усложняют или упрощают вашу конфигурацию.

Другие вопросы по тегам