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