У меня есть список корзин s3, к которым я хочу применить разные политики жизненного цикла.
переменные.tf
variable "bucket_name" {
type = list(any)
default = ["in", "out", "in-archive", "out-archive"]
}
Для первых двух элементов в списке я хочу, чтобы их содержимое было удалено через 180 дней. А оставшиеся 2 корзины переместить их содержимое в класс GLACIER, а затем удалить их через 600 дней. Я объявил два разных блока ресурсов для разных политик, но проблема в том, как заставить terraform начинать подсчет индекса с 3-го элемента вместо 1-го.
ресурсный блок
resource "aws_s3_bucket" "bucket" {
count = length(var.bucket_name)
bucket = "${var.bucket_name[count.index]}"
}
resource "aws_s3_bucket_lifecycle_configuration" "bucket_lifecycle_rule" {
count = length(aws_s3_bucket.bucket)
bucket = aws_s3_bucket.bucket[count.index].id ///Want this index to stop at 2nd element
rule {
status = "Enabled"
id = "bucket-lifecycle-rule"
expiration {
days = 180
}
}
}
resource "aws_s3_bucket_lifecycle_configuration" "archive_bucket_lifecycle_rule" {
count = length(aws_s3_bucket.bucket)
bucket = aws_s3_bucket.bucket[count.index + 4].id ///Want this index to begin from 3rd and end
rule { ///at 4th element
status = "Enabled"
id = "archive-bucket-lifecycle-rule"
transition {
days = 181
storage_class = "GLACIER"
}
expiration {
days = 600
}
}
}
Пока я приближаюсь к этому правилу, я получаю сообщение об ошибке:
in resource "aws_s3_bucket_lifecycle_configuration" "archive_bucket_lifecycle_rule":
31: bucket = aws_s3_bucket.bucket[count.index + 2].id
├────────────────
│ aws_s3_bucket.bucket is tuple with 4 elements
│ count.index is 2
The given key does not identify an element in this collection value.
Простите за это. Моя главная проблема заключается в том, как применить различные правила жизненного цикла к разным блокам в списке, не разделяя их и не создавая для них разные блоки ресурсов. Если бы это было так, я мог бы разделить его, но это делает код излишним. Я искал реализацию, которая выполняет работу в одном списке. Спасибо @marko-e
Итак, вы хотите, чтобы отличался только 4-й элемент или 3-й и 4-й?
и 3-й, и 4-й, чтобы иметь разные конфигурации жизненного цикла по сравнению с 1 и 2
Как насчет того, чтобы сделать входную переменную немного более сложной, чтобы приспособить то, что вам нужно...
Вот краткий пример:
provider "aws" { region = "us-east-1" }
variable "buckets" {
type = map(any)
default = {
"in" : { expiration : 180, transition : 0 },
"out" : { expiration : 120, transition : 0 },
"in-archive" : { expiration : 200, transition : 180 },
"out-archive" : { expiration : 360, transition : 180 }
}
}
resource "aws_s3_bucket" "bucket" {
for_each = var.buckets
bucket = each.key
}
resource "aws_s3_bucket_lifecycle_configuration" "lifecycle" {
for_each = var.buckets
bucket = aws_s3_bucket.bucket[each.key].id
rule {
status = "Enabled"
id = "bucket-lifecycle-rule"
expiration {
days = each.value.expiration
}
}
rule {
status = each.value.transition > 0 ? "Enabled" : "Disabled"
id = "archive-bucket-lifecycle-rule"
transition {
days = each.value.transition
storage_class = "GLACIER"
}
}
}
Теперь наша переменная type = map(any)
мы можем создать там более сложный объект и передать истечение жизненного цикла, вы можете сделать это настолько сложным, насколько вам нужно, чтобы соответствовать более сложным правилам.
Это действительно умная реализация. И, к моему большому удовольствию, это сработало. Спасибо за быстрый ответ.
@it's_superbird, если ответ правильный, не забудьте отметить его как таковой
ошибка новичка
Ошибка показывает, что это не тот код, который вы разместили в вопросе.