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