#amazon-web-services #amazon-s3 #terraform #acl #terraform-provider-aws
Вопрос:
Я пытаюсь терраформировать и импортировать существующий сегмент журнала. Код HCL выглядит следующим образом и является полной копией того, что находится в производстве:
locals {
bucket_name = "log-bucket-${var.environment}-${var.region}"
}
module "bucket" {
source = "git@github.com:mycompany/s3-bucket-module?ref=1.0.5"
name = local.bucket_name
log_bucket = local.bucket_name
bucket_policy = jsonencode({
"Version" : "2012-10-17",
"Statement" : [
{
"Sid" : "AllowSSLRequestsOnly",
"Effect" : "Deny",
"Principal" : "*",
"Action" : "s3:*",
"Resource" : [*],
"Condition" : {
"Bool" : {
"aws:SecureTransport" : "false"
}
}
}
]
})
grant = [
{
id = data.aws_canonical_user_id.current_user.id
type = "CanonicalUser"
permissions = ["FULL_CONTROL"]
},
{
type = "Group"
uri = "http://acs.amazonaws.com/groups/s3/LogDelivery"
permissions = ["READ_ACP", "WRITE"]
},
]
lifecycle_rules = [
{
id = "log"
enabled = true
prefix = "log/"
tags = {
"rule" = "log"
"autoclean" = "true"
}
transition = [
{
days = 30
storage_class = "STANDARD_IA"
},
{
days = 60
storage_class = "GLACIER"
}
]
expiration = {
days = 90
}
}
]
}
После импорта корзины terraform import ...
и создания плана terraform я получаю следующие изменения:
# module.s3-bucket-module.module.bucket.aws_s3_bucket.bucket will be updated in-place
~ resource "aws_s3_bucket" "bucket" {
acl = "private"
force_destroy = false
id = "mycompany-log-bucket-myenvironment-myregion"
tags = {}
# (8 unchanged attributes hidden)
# (6 unchanged blocks hidden)
}
На основе этого плана terraform хочет выполнить две вещи:
acl = "private"
force_destroy = false
но это значения по умолчанию, которые я никогда явно не менял. Я предполагаю, что я пытаюсь сказать, что на самом деле это, похоже, ничего не меняет, а скорее явно устанавливает значения по умолчанию.
Это меня смущает, и, поскольку это производственный сегмент, я хочу узнать ваше мнение перед подачей заявки. Почему там появляются эти два «изменения»?
Комментарии:
1. Привет, я предполагаю, что в Terraform есть проблема github.com/hashicorp/terraform-provider-aws/issues/6193 . Я бы попытался специально передать эти переменные в свой ресурс s3 bucket, затем импортировать его снова и посмотреть, изменит ли он их.
2. атрибут «acl» конфликтует с атрибутом «grant». Необходимо определить одно из двух
3. К вашему сведению, явная настройка
force_destroy = false
не подавила предупреждение terraform4. Это значения по умолчанию для API, но не для пользовательского интерфейса. Предполагая, что этот сегмент был создан в консоли, это объясняет, почему поставщик пытается внести эти изменения.
5. @bembas Рассмотрите возможность прочтения ответа, он может быть вам интересен
Ответ №1:
Это связано с ошибкой, о которой упоминал бембас в комментариях.
Я создал сегмент реплик и импортировал его.
Шаг 1
Перед применением плана
~ resource "aws_s3_bucket" "bucket" {
acl = "private"
force_destroy = false
id = "mycompany-log-bucket-myenvironment-myregion"
tags = {}
# (8 unchanged attributes hidden)
# (6 unchanged blocks hidden)
}
Я запустил aws s3api get-bucket-acl --bucket mycompany-log-bucket-myenvironment-myregion
и получил этот ответ:
{
"Owner": {
"ID": "hidden"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/s3/LogDelivery"
},
"Permission": "READ_ACP"
},
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/s3/LogDelivery"
},
"Permission": "WRITE"
},
{
"Grantee": {
"ID": "hidden",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
}
]
}
Шаг 2
После применения плана
{
"Owner": {
"ID": "hidden"
},
"Grants": [
{
"Grantee": {
"ID": "hidden",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
}
]
}
Шаг 3
Создан новый план, ресурс хочет снова изменить ресурс!
~ resource "aws_s3_bucket" "bucket" {
# (10 unchanged attributes hidden)
grant {
permissions = [
"READ_ACP",
"WRITE",
]
type = "Group"
uri = "http://acs.amazonaws.com/groups/s3/LogDelivery"
}
grant {
id = "hidden"
permissions = [
"FULL_CONTROL",
]
type = "CanonicalUser"
}
# (4 unchanged blocks hidden)
}
После применения этого второго плана все возвращается в нормальное состояние, и terraform больше не запрашивает изменения.
No changes. Your infrastructure matches the configuration.
Ответ №2:
16/11/2021
Я предполагаю, что есть открытая ошибка, и terraform см. Как обновить следующие атрибуты :
acl = "private"
force_destroy = false
В конкретном ресурсе tf обходным путем является применение обновления (ошибка), а затем повторное применение для обновления состояния terraform.
Комментарии:
1. Я хотел бы принять ваш ответ, но, как показывает мой ответ, это не совсем «безопасно применять» — после первого устройства произойдут временные изменения, и после второго они вернутся к нормальному состоянию. Не могли бы вы отредактировать его?
2. Да, вы правы. 🙂