Terraform — «Аргумент с именем здесь не ожидается» при использовании карт

#amazon-web-services #terraform #terraform-provider-aws

Вопрос:

Я создаю простой модуль терраформирования, подобный этому

 resource "aws_s3_bucket" "terraform_state" {
  bucket = var.bucket

  lifecycle_rule = var.s3_lifecycle

  versioning {
    enabled = true
    mfa_delete = false
  }

  server_side_encryption_configuration = var.s3_server_side_encryption_configuration

  policy = var.s3_policy

  tags = var.s3_tags

  force_destroy = var.s3_force_destroy

  logging = var.s3_logging
}
 

Все переменные определяются как карты, кроме имени корзины.

Когда я пытаюсь вызвать модуль таким образом

 module "backend" {
    source = "../"

    bucket = "terraform_state_test_${random_id.random_bucket_id.hex}"

    s3_lifecycle = {
      prevent_destroy = false
    }

    s3_force_destroy = false

    s3_tags = {
        TerraformManaged = "true"
        env = "test"
    }

    s3_server_side_encryption_configuration = {
      rule = {
      apply_server_side_encryption_by_default = {
        sse_algorithm = "AES256"
      }
    }
  }
}
 

У меня есть несколько ошибок на всех картах (кроме «тегов»), таких как это

 Error: Unsupported argument

  on ../main.tf line 11, in resource "aws_s3_bucket" "terraform_state":
  11:   server_side_encryption_configuration = var.s3_server_side_encryption_configuration

An argument named "server_side_encryption_configuration" is not expected here.
Did you mean to define a block of type "server_side_encryption_configuration"?
 

Я не могу понять, что я делаю не так…Кто-нибудь может мне помочь?

Спасибо,

Комментарии:

1. Тот server_side_encryption_configuration ожидает server_side_encryption_configuration { ... } чего — то похожего на то versioning . Это не карта.

2. @luk2302 в данном случае… что это за переменная? В документах не упоминается этот тип… И как я могу передать переменную?

3. У него нет типа, это блок.

Ответ №1:

это неверно в соответствии с документами.

server_side_encryption_конфигурация = var.s3_server_side_encryption_конфигурация

 resource "aws_s3_bucket" "mybucket" {
  bucket = "mybucket"

  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        kms_master_key_id = aws_kms_key.mykey.arn
        sse_algorithm     = "aws:kms"
      }
    }
  }
}
 

Включить Шифрование На Стороне Сервера По Умолчанию

вот наглядный пример.

 # Max 1 block - server_side_encryption_configuration
dynamic "server_side_encryption_configuration" {
for_each = length(keys(var.server_side_encryption_configuration)) == 0 ? [] : [var.server_side_encryption_configuration]

content {

    dynamic "rule" {
    for_each = length(keys(lookup(server_side_encryption_configuration.value, "rule", {}))) == 0 ? [] : [lookup(server_side_encryption_configuration.value, "rule", {})]

    content {

        dynamic "apply_server_side_encryption_by_default" {
        for_each = length(keys(lookup(rule.value, "apply_server_side_encryption_by_default", {}))) == 0 ? [] : [
        lookup(rule.value, "apply_server_side_encryption_by_default", {})]

        content {
            sse_algorithm     = apply_server_side_encryption_by_default.value.sse_algorithm
            kms_master_key_id = lookup(apply_server_side_encryption_by_default.value, "kms_master_key_id", null)
        }
        }
    }
    }
}
}
 

В зависимости от ваших потребностей вы можете настроить пример модуля.

Комментарии:

1. Значит, я не могу создать модуль для этого ресурса?

2. @LucaB да, ты можешь.

3. Теперь я увидел ваш ответ на редактирование… хорошо, я попробую так, спасибо 🙂

4. @LucaB Обратите внимание, что последний фрагмент может быть излишним в вашем случае использования, зависит от того, насколько сложным server_side_encryption_configuration он будет в вашем случае.

5. @luk2302 Я добавил упоминание об этом уже в ответе, <В зависимости от ваших потребностей вы можете настроить пример модуля.> 🙂 . Код, которым я поделился, был просто примером, чтобы подтолкнуть его в правильном направлении, и ресурс терраформирования для использования в таком случае.