Сегмент S3 — Terraform: план показывает несуществующие изменения для значений по умолчанию

#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 не подавила предупреждение terraform

4. Это значения по умолчанию для 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. Да, вы правы. 🙂