Terraform-provider-aws: Добавление настраиваемого атрибута пула пользователей когнитивного анализа приводит к созданию нового ресурса

Созданный на 22 мар. 2018  ·  44Комментарии  ·  Источник: hashicorp/terraform-provider-aws

Добавление новых настраиваемых атрибутов не должно приводить к повторному созданию пула пользователей когнитивного типа.

Версия Terraform

$ terraform -v
Terraform v0.11.4
+ provider.aws v1.11.0

Затронутые ресурсы

aws_cognito_user_pool

Файлы конфигурации Terraform

variable "region" {
  default = "us-east-1"
}

provider "aws" {
  region = "${var.region}"
}

resource "aws_cognito_user_pool" "pool" {
  name = "bug-test-pool"

  /*
  schema {
    attribute_data_type      = "Number"
    developer_only_attribute = false
    mutable                  = false
    name                     = "custom-attribute"
    required                 = false
  }
  */
}

Вывод отладки

Результат выполнения terraform plan после добавления настраиваемого атрибута выше.

Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

aws_cognito_user_pool.pool: Refreshing state... (ID: us-east-1_Cj77gRCdj)

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

-/+ aws_cognito_user_pool.pool (new resource required)
      id:                                               "us-east-1_Cj77gRCdj" => <computed> (forces new resource)
      admin_create_user_config.#:                       "1" => <computed>
      arn:                                              "arn:aws:cognito-idp:us-east-1:326947223243:userpool/us-east-1_Cj77gRCdj" => <computed>
      creation_date:                                    "2018-03-22T19:06:44Z" => <computed>
      email_verification_message:                       "" => <computed>
      email_verification_subject:                       "" => <computed>
      lambda_config.#:                                  "0" => <computed>
      last_modified_date:                               "2018-03-22T19:06:44Z" => <computed>
      mfa_configuration:                                "OFF" => "OFF"
      name:                                             "bug-test-pool" => "bug-test-pool"
      password_policy.#:                                "1" => <computed>
      schema.#:                                         "" => "1" (forces new resource)
      schema.2616754751.attribute_data_type:            "" => "Number"
      schema.2616754751.developer_only_attribute:       "" => "false"
      schema.2616754751.mutable:                        "" => "false"
      schema.2616754751.name:                           "" => "custom-attribute"
      schema.2616754751.number_attribute_constraints.#: "" => "0"
      schema.2616754751.required:                       "" => "false"
      schema.2616754751.string_attribute_constraints.#: "" => "0"
      verification_message_template.#:                  "1" => <computed>


Plan: 1 to add, 0 to change, 1 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

Выход паники

Никто

Ожидаемое поведение

Добавьте атрибут, не разрушая и не восстанавливая пул пользователей когнитивного анализа. Это поддерживается через пользовательский интерфейс и API когнитивного анализа (https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AddCustomAttributes.html).

Фактическое поведение

Пул пользователей когнито был перестроен.

schema.#: "" => "1" (forces new resource)

Действия по воспроизведению

  1. terraform apply - Создать новый пул пользователей
  2. Добавить новый настраиваемый атрибут
  3. terrform plan - просмотр выходных данных показывает, что он перестроит пул пользователей когнито.

Важные факты

Никто

использованная литература

Никто

enhancement serviccognito

Самый полезный комментарий

Есть ли в этом прогресс? Вы, ребята, вынуждаете нас уничтожить ресурс, который включает в себя просьбу клиента сбросить свои пароли (при условии, что у нас даже есть резервные данные для импорта в первую очередь), или для меня я настраиваю жизненный цикл ignore_changes * и надеюсь, что кто-то, наконец, обойдется чтобы исправить это, прежде чем мне понадобится еще одно изменение.

Тот факт, что он простоял 9 месяцев, серьезно заставляет меня задуматься, стоит ли доверять критическую инфраструктуру Terraform.

Все 44 Комментарий

Я не уверен, как работает удаление настраиваемых атрибутов, поскольку AWS, похоже, не поддерживает удаление настраиваемых атрибутов или обновление настраиваемых атрибутов.

Как и предполагалось, нельзя обновлять или удалять настраиваемые атрибуты, однажды созданные как часть user_pool. Так что текущее поведение - единственный выход, я думаю 🤔 Подробности в документации AWS

Верно, как только атрибуты добавлены, их нельзя удалить. Однако вы можете добавлять новые атрибуты.

Есть ли обходной путь для добавления новых атрибутов через terraform без повторного создания всего пользовательского пула? Похоже, будет сложно добавить новый атрибут в будущем, когда приложение будет запущено.

Изменить: похоже, привязка версии к 1.12 исправила это для нас.

А пока вы можете сделать это вне Terraform (веб-консоль, CLI и т. Д.), А потом просто синхронизировать конфигурацию Terraform.

Проведу еще немного исследований. Я нашел проблему. Если атрибут схемы (в моем случае String) не включает string_attribute_constraints он будет вызывать новый ресурс каждый раз.

Следующее генерирует каждый раз новый ресурс:

schema {
    attribute_data_type      = "String"
    developer_only_attribute = false
    mutable                  = false
    name                     = "picture"
    required                 = true
  }

Пока этого нет:

schema {
    attribute_data_type      = "String"
    developer_only_attribute = false
    mutable                  = false
    name                     = "picture"
    required                 = true

    string_attribute_constraints {
      min_length = 6
      max_length = 32
    }
  }

Скорее всего это другой баг.

@leonfs Я думаю, нам здесь нужна настраиваемая @bflad Не могли бы вы подтвердить, что нужно сделать, и я могу забрать это.

@ Puneeth-n Да, похоже, так и будет. На данный момент в наборе схемы есть ForceNew: true , но это явно не относится к настраиваемым атрибутам.

Я упомянул (см. Выше) еще одну проблему, с которой я столкнулся после добавления поставщика удостоверений (Google) в пул пользователей.

Похоже, AWS добавляет настраиваемый атрибут с именем identities после добавления поставщика, что приводит к изменению схемы и принудительному воссозданию всего нового пула. Как видите, я предложил краткосрочное решение, но работает только в том случае, если вы заранее знаете (создание ресурсов), что будете использовать поставщиков удостоверений.

Похоже, что terraform принудительно уничтожает и создает пул пользователей, даже если в файле .tf ничего не изменилось.

$ cat main.tf

provider "aws" {
}

resource "aws_cognito_user_pool" "pankajk_security" {
  name                       = "pankajk-security"
  email_verification_subject = "Your Verification Code"
  email_verification_message = "Please use the following code: {####}"
  alias_attributes           = ["email", "preferred_username"]
  auto_verified_attributes   = ["email"]

  verification_message_template {
    default_email_option = "CONFIRM_WITH_CODE"
  }

  password_policy {
    minimum_length    = 10
    require_lowercase = true
    require_numbers   = true
    require_symbols   = true
    require_uppercase = true
  }

  schema {
    attribute_data_type      = "String"
    developer_only_attribute = false
    mutable                  = true
    name                     = "email"
    required                 = true

    string_attribute_constraints {
      min_length = 7
      max_length = 256
    }
  }

  schema {
    attribute_data_type      = "String"
    developer_only_attribute = false
    mutable                  = true
    name                     = "oid"
    required                 = false

    number_attribute_constraints {
      min_value = 1
      max_value = 256
    }
  }
}

$ terraform -v

Terraform v0.11.7
+ provider.aws v1.14.1

$ terraform применить

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + aws_cognito_user_pool.pankajk_security
      id:                                                          <computed>
      admin_create_user_config.#:                                  <computed>
      alias_attributes.#:                                          "2"
      alias_attributes.1888159429:                                 "preferred_username"
      alias_attributes.881205744:                                  "email"
      arn:                                                         <computed>
      auto_verified_attributes.#:                                  "1"
      auto_verified_attributes.881205744:                          "email"
      creation_date:                                               <computed>
      email_verification_message:                                  "Please use the following code: {####}"
      email_verification_subject:                                  "Your Verification Code"
      lambda_config.#:                                             <computed>
      last_modified_date:                                          <computed>
      mfa_configuration:                                           "OFF"
      name:                                                        "pankajk-security"
      password_policy.#:                                           "1"
      password_policy.0.minimum_length:                            "10"
      password_policy.0.require_lowercase:                         "true"
      password_policy.0.require_numbers:                           "true"
      password_policy.0.require_symbols:                           "true"
      password_policy.0.require_uppercase:                         "true"
      schema.#:                                                    "2"
      schema.1734507539.attribute_data_type:                       "String"
      schema.1734507539.developer_only_attribute:                  "false"
      schema.1734507539.mutable:                                   "true"
      schema.1734507539.name:                                      "email"
      schema.1734507539.number_attribute_constraints.#:            "0"
      schema.1734507539.required:                                  "true"
      schema.1734507539.string_attribute_constraints.#:            "1"
      schema.1734507539.string_attribute_constraints.0.max_length: "256"
      schema.1734507539.string_attribute_constraints.0.min_length: "7"
      schema.3768180960.attribute_data_type:                       "String"
      schema.3768180960.developer_only_attribute:                  "false"
      schema.3768180960.mutable:                                   "true"
      schema.3768180960.name:                                      "oid"
      schema.3768180960.number_attribute_constraints.#:            "1"
      schema.3768180960.number_attribute_constraints.0.max_value:  "256"
      schema.3768180960.number_attribute_constraints.0.min_value:  "1"
      schema.3768180960.required:                                  "false"
      schema.3768180960.string_attribute_constraints.#:            "0"
      verification_message_template.#:                             "1"
      verification_message_template.0.default_email_option:        "CONFIRM_WITH_CODE"
      verification_message_template.0.email_message:               <computed>
      verification_message_template.0.email_message_by_link:       <computed>
      verification_message_template.0.email_subject:               <computed>
      verification_message_template.0.email_subject_by_link:       <computed>
      verification_message_template.0.sms_message:                 <computed>


Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_cognito_user_pool.pankajk_security: Creating...
  admin_create_user_config.#:                                  "" => "<computed>"
  alias_attributes.#:                                          "" => "2"
  alias_attributes.1888159429:                                 "" => "preferred_username"
  alias_attributes.881205744:                                  "" => "email"
  arn:                                                         "" => "<computed>"
  auto_verified_attributes.#:                                  "" => "1"
  auto_verified_attributes.881205744:                          "" => "email"
  creation_date:                                               "" => "<computed>"
  email_verification_message:                                  "" => "Please use the following code: {####}"
  email_verification_subject:                                  "" => "Your Verification Code"
  lambda_config.#:                                             "" => "<computed>"
  last_modified_date:                                          "" => "<computed>"
  mfa_configuration:                                           "" => "OFF"
  name:                                                        "" => "pankajk-security"
  password_policy.#:                                           "" => "1"
  password_policy.0.minimum_length:                            "" => "10"
  password_policy.0.require_lowercase:                         "" => "true"
  password_policy.0.require_numbers:                           "" => "true"
  password_policy.0.require_symbols:                           "" => "true"
  password_policy.0.require_uppercase:                         "" => "true"
  schema.#:                                                    "" => "2"
  schema.1734507539.attribute_data_type:                       "" => "String"
  schema.1734507539.developer_only_attribute:                  "" => "false"
  schema.1734507539.mutable:                                   "" => "true"
  schema.1734507539.name:                                      "" => "email"
  schema.1734507539.number_attribute_constraints.#:            "" => "0"
  schema.1734507539.required:                                  "" => "true"
  schema.1734507539.string_attribute_constraints.#:            "" => "1"
  schema.1734507539.string_attribute_constraints.0.max_length: "" => "256"
  schema.1734507539.string_attribute_constraints.0.min_length: "" => "7"
  schema.3768180960.attribute_data_type:                       "" => "String"
  schema.3768180960.developer_only_attribute:                  "" => "false"
  schema.3768180960.mutable:                                   "" => "true"
  schema.3768180960.name:                                      "" => "oid"
  schema.3768180960.number_attribute_constraints.#:            "" => "1"
  schema.3768180960.number_attribute_constraints.0.max_value:  "" => "256"
  schema.3768180960.number_attribute_constraints.0.min_value:  "" => "1"
  schema.3768180960.required:                                  "" => "false"
  schema.3768180960.string_attribute_constraints.#:            "" => "0"
  verification_message_template.#:                             "" => "1"
  verification_message_template.0.default_email_option:        "" => "CONFIRM_WITH_CODE"
  verification_message_template.0.email_message:               "" => "<computed>"
  verification_message_template.0.email_message_by_link:       "" => "<computed>"
  verification_message_template.0.email_subject:               "" => "<computed>"
  verification_message_template.0.email_subject_by_link:       "" => "<computed>"
  verification_message_template.0.sms_message:                 "" => "<computed>"
aws_cognito_user_pool.pankajk_security: Creation complete after 3s (ID: us-west-2_t6jMrbPx1)

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

$ terraform план

Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

aws_cognito_user_pool.pankajk_security: Refreshing state... (ID: us-west-2_t6jMrbPx1)

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

-/+ aws_cognito_user_pool.pankajk_security (new resource required)
      id:                                                          "us-west-2_t6jMrbPx1" => <computed> (forces new resource)
      admin_create_user_config.#:                                  "1" => <computed>
      alias_attributes.#:                                          "2" => "2"
      alias_attributes.1888159429:                                 "preferred_username" => "preferred_username"
      alias_attributes.881205744:                                  "email" => "email"
      arn:                                                         "arn:aws:cognito-idp:us-west-2:166326852216:userpool/us-west-2_t6jMrbPx1" => <computed>
      auto_verified_attributes.#:                                  "1" => "1"
      auto_verified_attributes.881205744:                          "email" => "email"
      creation_date:                                               "2018-04-18T18:11:08Z" => <computed>
      email_verification_message:                                  "Please use the following code: {####}" => "Please use the following code: {####}"
      email_verification_subject:                                  "Your Verification Code" => "Your Verification Code"
      lambda_config.#:                                             "0" => <computed>
      last_modified_date:                                          "2018-04-18T18:11:08Z" => <computed>
      mfa_configuration:                                           "OFF" => "OFF"
      name:                                                        "pankajk-security" => "pankajk-security"
      password_policy.#:                                           "1" => "1"
      password_policy.0.minimum_length:                            "10" => "10"
      password_policy.0.require_lowercase:                         "true" => "true"
      password_policy.0.require_numbers:                           "true" => "true"
      password_policy.0.require_symbols:                           "true" => "true"
      password_policy.0.require_uppercase:                         "true" => "true"
      schema.#:                                                    "2" => "2"
      schema.1734507539.attribute_data_type:                       "String" => "String"
      schema.1734507539.developer_only_attribute:                  "false" => "false"
      schema.1734507539.mutable:                                   "true" => "true"
      schema.1734507539.name:                                      "email" => "email"
      schema.1734507539.number_attribute_constraints.#:            "0" => "0"
      schema.1734507539.required:                                  "true" => "true"
      schema.1734507539.string_attribute_constraints.#:            "1" => "1"
      schema.1734507539.string_attribute_constraints.0.max_length: "256" => "256"
      schema.1734507539.string_attribute_constraints.0.min_length: "7" => "7"
      schema.3768180960.attribute_data_type:                       "" => "String" (forces new resource)
      schema.3768180960.developer_only_attribute:                  "" => "false" (forces new resource)
      schema.3768180960.mutable:                                   "" => "true" (forces new resource)
      schema.3768180960.name:                                      "" => "oid" (forces new resource)
      schema.3768180960.number_attribute_constraints.#:            "" => "1" (forces new resource)
      schema.3768180960.number_attribute_constraints.0.max_value:  "" => "256" (forces new resource)
      schema.3768180960.number_attribute_constraints.0.min_value:  "" => "1" (forces new resource)
      schema.3768180960.required:                                  "" => "false" (forces new resource)
      schema.3768180960.string_attribute_constraints.#:            "" => "0"
      schema.383977790.attribute_data_type:                        "String" => "" (forces new resource)
      schema.383977790.developer_only_attribute:                   "false" => "false"
      schema.383977790.mutable:                                    "true" => "false" (forces new resource)
      schema.383977790.name:                                       "oid" => "" (forces new resource)
      schema.383977790.number_attribute_constraints.#:             "0" => "0"
      schema.383977790.required:                                   "false" => "false"
      schema.383977790.string_attribute_constraints.#:             "1" => "0" (forces new resource)
      schema.383977790.string_attribute_constraints.0.max_length:  "" => ""
      schema.383977790.string_attribute_constraints.0.min_length:  "" => ""
      verification_message_template.#:                             "1" => "1"
      verification_message_template.0.default_email_option:        "CONFIRM_WITH_CODE" => "CONFIRM_WITH_CODE"
      verification_message_template.0.email_message:               "Please use the following code: {####}" => <computed>
      verification_message_template.0.email_message_by_link:       "" => <computed>
      verification_message_template.0.email_subject:               "Your Verification Code" => <computed>
      verification_message_template.0.email_subject_by_link:       "" => <computed>
      verification_message_template.0.sms_message:                 "" => <computed>


Plan: 1 to add, 0 to change, 1 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

@pankajku Проблема, с которой вы столкнулись, в другом. Однако IMHO terraform должен уметь отлавливать такие ошибки.

Ошибка в вашем конфиге. Для oid необходимо указать attribute_data_type = "String" но указать number_attribute_constraints Исправленная конфигурация приведена ниже:

variable "region" {
  default = "us-east-1"
}

provider "aws" {
  version               = "1.14.1"
  region                = "${var.region}"
}

resource "aws_cognito_user_pool" "pankajk_security" {
  name                       = "pankajk-security"
  email_verification_subject = "Your Verification Code"
  email_verification_message = "Please use the following code: {####}"
  alias_attributes           = ["email", "preferred_username"]
  auto_verified_attributes   = ["email"]

  verification_message_template {
    default_email_option = "CONFIRM_WITH_CODE"
  }

  password_policy {
    minimum_length    = 10
    require_lowercase = true
    require_numbers   = true
    require_symbols   = true
    require_uppercase = true
  }

  schema {
    attribute_data_type      = "String"
    developer_only_attribute = false
    mutable                  = true
    name                     = "email"
    required                 = true

    string_attribute_constraints {
      min_length = 7
      max_length = 256
    }
  }

  schema {
    attribute_data_type      = "String"
    developer_only_attribute = false
    mutable                  = true
    name                     = "oid"
    required                 = false

    string_attribute_constraints {
      min_length = 1
      max_length = 256
    }
  }
}

@ Puneeth-n, Спасибо, что уловили проблему в моем конфиге. Я изменил его согласно вашему предложению, и теперь terraform обновляет только измененные атрибуты.

Я заметил, что после того, как я внесу простое изменение (например, текст сообщения подтверждения) в файл конфигурации и запустил команду «terraform apply», флаг проверки электронной почты сбрасывается.

$ terraform применить

aws_cognito_user_pool.pankajk_security: Refreshing state... (ID: us-west-2_LKVhvfWsH)

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  ~ aws_cognito_user_pool.pankajk_security
      email_verification_subject: "Your verification code" => "Your Verification Code"


Plan: 0 to add, 1 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_cognito_user_pool.pankajk_security: Modifying... (ID: us-west-2_LKVhvfWsH)
  email_verification_subject: "Your verification code" => "Your Verification Code"
aws_cognito_user_pool.pankajk_security: Modifications complete after 1s (ID: us-west-2_LKVhvfWsH)

Apply complete! Resources: 0 added, 1 changed, 0 destroyed.

$ terraform план

Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

aws_cognito_user_pool.pankajk_security: Refreshing state... (ID: us-west-2_LKVhvfWsH)

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  ~ aws_cognito_user_pool.pankajk_security
      auto_verified_attributes.#:         "0" => "1"
      auto_verified_attributes.881205744: "" => "email"


Plan: 0 to add, 1 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

Интересно, связано ли это также с какой-то ошибкой в ​​файле конфигурации или с ошибкой.

Это все еще кажется проблемой и однажды вызовет у кого-то много душевной боли, когда tf отбросит пул пользователей, и они потеряют всех своих пользователей ...

Добавление этого в схему приводит к уничтожению пула пользователей, несмотря на то, что его можно создать в консоли / cli без разрушения.

    {
      name                     = "foo"
      attribute_data_type      = "String"
      mutable                  = true
      developer_only_attribute = "false"
      required                 = "false"

      string_attribute_constraints = {
        min_length = 0
        max_length = 256
      }
    },

Да. У меня prevent_destroy установлено как на pool и на client

По-прежнему возникает проблема воссоздания ресурса, когда я пытаюсь добавить новые настраиваемые атрибуты.

Версия Terraform
Terraform v0.11.8
Providerr.aws v1.36.0

Перед добавлением нового настраиваемого атрибута

resource "aws_cognito_user_pool" "pool" {
  name                       = "Test"
  username_attributes        = ["email"]
  auto_verified_attributes   = ["email"]

  schema = [
    {
      attribute_data_type          = "String"
      developer_only_attribute     = false
      mutable                      = false
      name                         = "email"
      required                     = true
      string_attribute_constraints = {
        min_length = 1
        max_length = 256
      }
    },
    {
      attribute_data_type          = "String"
      developer_only_attribute     = false
      mutable                      = true
      name                         = "custom1"
      required                     = false
      string_attribute_constraints = {
        min_length = 0
        max_length = 256
      }
    }
  ]
}

Добавить новый настраиваемый атрибут

{
      attribute_data_type          = "String"
      developer_only_attribute     = false
      mutable                      = true
      name                         = "custom2"
      required                     = false
      string_attribute_constraints = {
        min_length = 0
        max_length = 256
      }
    }

Отладка Ouput

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

-/+ aws_cognito_user_pool.pool (new resource required)
 ...
      lambda_config.#:                                             "0" => <computed>
      last_modified_date:                                          "2018-09-19T03:33:52Z" => <computed>
      mfa_configuration:                                           "OFF" => "OFF"
      name:                                                        "Test" => "Test"
      password_policy.#:                                           "1" => <computed>
      schema.#:                                                    "2" => "3" (forces new resource)
      schema.2766842814.attribute_data_type:                       "" => "String" (forces new resource)
      schema.2766842814.developer_only_attribute:                  "" => "false" (forces new resource)
      schema.2766842814.mutable:                                   "" => "true" (forces new resource)
      schema.2766842814.name:                                      "" => "custom2" (forces new resource)
      schema.2766842814.number_attribute_constraints.#:            "" => "0"
      schema.2766842814.required:                                  "" => "false" (forces new resource)
      schema.2766842814.string_attribute_constraints.#:            "" => "1" (forces new resource)
      schema.2766842814.string_attribute_constraints.0.max_length: "" => "256" (forces new resource)
      schema.2766842814.string_attribute_constraints.0.min_length: "" => "0" (forces new resource)
      schema.3686385984.attribute_data_type:                       "String" => "String"
      schema.3686385984.developer_only_attribute:                  "false" => "false"
      schema.3686385984.mutable:                                   "false" => "false"
      schema.3686385984.name:                                      "email" => "email"
      schema.3686385984.number_attribute_constraints.#:            "0" => "0"
      schema.3686385984.required:                                  "true" => "true"
      schema.3686385984.string_attribute_constraints.#:            "1" => "1"
      schema.3686385984.string_attribute_constraints.0.max_length: "256" => "256"
      schema.3686385984.string_attribute_constraints.0.min_length: "1" => "1"
      schema.893709367.attribute_data_type:                        "String" => "String"
      schema.893709367.developer_only_attribute:                   "false" => "false"
      schema.893709367.mutable:                                    "true" => "true"
      schema.893709367.name:                                       "custom1" => "custom1"
      schema.893709367.number_attribute_constraints.#:             "0" => "0"
      schema.893709367.required:                                   "false" => "false"
      schema.893709367.string_attribute_constraints.#:             "1" => "1"
      schema.893709367.string_attribute_constraints.0.max_length:  "256" => "256"
      schema.893709367.string_attribute_constraints.0.min_length:  "0" => "0"
      username_attributes.#:                                       "1" => "1"
      username_attributes.0:                                       "email" => "email"
      verification_message_template.#:                             "1" => <computed>


Plan: 1 to add, 0 to change, 1 to destroy.

К вашему сведению: я сделал настраиваемый атрибут без string_attribute_constraints , тогда я столкнулся с той же ошибкой.

  schema {
    name                     = "custom_id"
    required                 = false
    attribute_data_type      = "String"
    developer_only_attribute = false
    mutable                  = true
  }

После того, как я добавил пустые string_attribute_constraints , я смог избежать этой ошибки!

  schema {
    name                     = "custom_id"
    required                 = false
    attribute_data_type      = "String"
    developer_only_attribute = false
    mutable                  = true

    string_attribute_constraints {}
  }

Я очень ценю обходной путь каждого!

Обходной путь у меня не работает.

schema {
    attribute_data_type      = "String"
    developer_only_attribute = false
    mutable                  = true
    name                     = "parent_id"
    required                 = false

    string_attribute_constraints {
      min_length = 1
      max_length = 256
    }
  }

План:

schema.#:                                                    "10" => "11" (forces new resource)
schema.2272806367.attribute_data_type:                       "" => "String" (forces new resource)
schema.2272806367.developer_only_attribute:                  "" => "false" (forces new resource)
schema.2272806367.mutable:                                   "" => "false" (forces new resource)
schema.2272806367.name:                                      "" => "parent_id" (forces new resource)
schema.2272806367.number_attribute_constraints.#:            "" => "0"
schema.2272806367.required:                                  "" => "false" (forces new resource)
schema.2272806367.string_attribute_constraints.#:            "" => "1" (forces new resource)
schema.2272806367.string_attribute_constraints.0.max_length: "" => "256" (forces new resource)
schema.2272806367.string_attribute_constraints.0.min_length: "" => "1" (forces new resource)

Версии:

Terraform v0.11.11
+ provider.archive v1.1.0
+ provider.aws v1.52.0

Это огромная проблема для всех, кто разрабатывает новые приложения и хочет добавлять / экспериментировать с настраиваемыми атрибутами. Из-за этого наш бассейн разрушался более 10 раз.

Есть ли в этом прогресс? Вы, ребята, вынуждаете нас уничтожить ресурс, который включает в себя просьбу клиента сбросить свои пароли (при условии, что у нас даже есть резервные данные для импорта в первую очередь), или для меня я настраиваю жизненный цикл ignore_changes * и надеюсь, что кто-то, наконец, обойдется чтобы исправить это, прежде чем мне понадобится еще одно изменение.

Тот факт, что он простоял 9 месяцев, серьезно заставляет меня задуматься, стоит ли доверять критическую инфраструктуру Terraform.

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

> terraform --version
Terraform v0.11.11
+ provider.archive v1.1.0
+ provider.aws v1.54.0

все еще проблема

Terraform v0.11.11
+ provider.aws v1.57.0

И еще...

Terraform v0.11.11
+ provider.aws v1.59.0

Меня это тоже касается, ни один из обходных путей у меня не сработал.

Terraform v0.11.11
+ provider.aws v1.60.0

Тот факт, что он простоял 9 месяцев, серьезно заставляет меня задуматься, стоит ли доверять критическую инфраструктуру Terraform.

Я задаю себе тот же вопрос. Многие критические ошибки не исправляются более года, некоторые - более двух лет. На множество этих багов есть готовый пиар, который тоже больше года висит в нерабочем состоянии.

Также недавно я заполнил отчет об ошибке для серьезной функции jsonencode - они отказались ее использовать. Ответ был - это исправлено в версии 12, которая выйдет в неизвестное время в будущем, и нас не волнует версия 11.

Кстати, проблема из этой темы - не единственная, которая есть в пуле пользователей когнитивного анализа. Callback_urls необходимо заказывать точно так же, как это делает AWS, иначе terraform будет постоянно пытаться изменить порядок.

@voroniys Мой

По-прежнему проблема.

Я исследовал это и нашел способ "исправить" это.

Лучший способ разрешить управление настраиваемыми атрибутами - сделать настраиваемый атрибут отдельным ресурсом, например aws_cognito_user_pool_schema_custom_attribute .

В Terraform ресурс определяется схемой вместе с обратными вызовами функций Create, Read, Update и Delete. Core Terraform вычисляет разницу между текущим состоянием и тем, что вы определили в своем коде Terraform. Мы хотим как можно больше полагаться на то, что TF будет делать правильные вещи.

Если вы выделите атрибут схемы как отдельный ресурс, у вас будет более точный контроль над вычислением разницы: добавление нового ресурса настраиваемого атрибута схемы заставляет Terraform вызывать функцию Create отдельного ресурса, а не последовательность Destroy / Create для бассейн. В функции Create ресурса атрибута схемы мы можем вызвать вызов API AWS Cognito AddCustomAttributes .

Изменение свойств атрибута схемы также можно обрабатывать более детально, но это необходимо проверить.

Когда вы (случайно) удаляете ресурс атрибута пользовательской схемы из кода Terraform, TF вызовет функцию удаления ресурса атрибута. Мы могли ошибиться, указывая на то, что удаление не поддерживается и ваш TF-код необходимо восстановить.

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

@bflad , вы знаете, кто может помочь в разработке изменений?

Спасибо @ringods за вашу работу и предложение. Это может быть верный путь к решению этой проблемы!

Проблема все еще подтверждается при использовании последних версий на сегодняшний день:

Terraform v0.12.3
+ provider.aws v2.18.0 

Краткое резюме:

resource "aws_cognito_user_pool" "pool" {
  name = "mypooltest2"
  }

Затем добавьте любой атрибут:

resource "aws_cognito_user_pool" "pool" {
  name = "mypooltest2"

  schema {
  attribute_data_type = "String"
  name = "email" 
  required = true
  }
}

Вместо того, чтобы просто выполнять инкрементное обновление, как должно, Terraform уничтожает, а затем снова добавляет ресурс:

Plan: 1 to add, 0 to change, 1 to destroy.

Мы застряли в развертывании новой функции в нашей производственной среде, нам нужен новый настраиваемый атрибут, если мы добавим его через cli, это испортит всю конфигурацию terraform, в которой также есть много других ресурсов.

Предложение @ringods может сработать для нас, не нарушая существующую конфигурацию tf. следовательно, пытаюсь внести свой вклад в это решение.
Вот первый черновик моего кода. Мне удалось успешно протестировать его, указав на локально созданный terraform-provider-aws. Сейчас пишу приемочные испытания. Предложения / комментарии по PR приветствуются!

Мы добавили атрибуты в когнито, не теряя пул пользователей, следующим образом:

  1. Используйте CLI для добавления атрибутов в существующую схему: aws cognito-idp --region ... add-custom-attributes --user-pool-id ... --custom-attributes Name=...,AttributeDataType=Boolean,DeveloperOnlyAttribute=false, Mutable=true,Required=false
  2. Удалите текущее состояние когнито, чтобы импортировать обновленный ресурс. terraform state rm aws_cognito_user_pool.main
  3. Импортировать обновленный ресурс. terraform import aws_cognito_user_pool.main ...

В нашем случае наш ресурс, состояние и файл main.tf теперь совпадают. Я предлагаю сначала попробовать dev env, надеюсь, это поможет.

Пожалуйста, исправьте это! Делать то, что обходит ePoromaa, просто смешно, когда приходится вручную управлять состоянием.

Есть еще какие-то подвижки в этом вопросе? Мы с нетерпением ждем решения, которое не требует ручных манипуляций с состоянием терраформирования. :-)

пинг тоже. Ручное управление состоянием ... смешно

Ребят, обновления есть? Мы в 2020 году сейчас ...

Да, все еще проблема ...

Надеюсь, это поможет всем остальным, более простой способ, чем приведенное выше решение, и потенциально менее беспорядочный, чем игра с состоянием терраформирования и импортом.

Как и в случае с ePoromaa, вам нужно будет вручную запустить aws cli cmd, чтобы добавить настраиваемый атрибут в пул пользователей когнито.
aws cognito-idp add-custom-attributes --user-pool-id us-west-2_aaaaaaaaa --custom-attributes Name="CustomAttr1",AttributeDataType="String",DeveloperOnlyAttribute=false,Required=false,StringAttributeConstraints="{MinLength=1,MaxLength=15}"
Дополнительную информацию о доступных атрибутах можно найти: https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/add-custom-attributes.html

После того, как вы добавили настраиваемый атрибут через aws cli, вам нужно будет добавить для него блок схемы в код пула пользователей terraformognito. Например

schema { name = "CustomAttr1" attribute_data_type = "String" required = false developer_only_attribute = false string_attribute_constraints { min_length = 1 max_length = 15 } }

Как только блок схемы добавлен в terraform, terraform не принимает никаких изменений. Считал бы это безопасным делать и в продукте.

Terraform v0.12.26

  • Providerr.aws v2.56.0

Все еще есть проблема ...

Всем привет, есть обновления здесь?

Пожалуйста, исправьте эту проблему!

Это все еще проблема с

Terraform v0.12.28
+ provider.aws v2.67.0

Пожалуйста, обращайтесь.

Обходной путь для предотвращения разрушения пула пользователей:
1) Добавьте настраиваемый атрибут через консоль или cli.
2) Добавьте блок схемы в шаблон терраформирования, ИДЕНТИЧНЫЙ ВСЕМ СПОСОБОМ к только что созданному атрибуту.
3) Запустите обновление терраформы. Он должен обновить файл состояния, чтобы отразить схему.
4) Запустите terraform plan, чтобы убедиться, что пул пользователей больше не уничтожается.

Привет, мы тоже столкнулись с этой проблемой. Любые обновления? Спасибо!

Есть там кто-нибудь из HashiCorp? Приветоо ....

Столкнувшись с этим также:

Terraform v0.12.29

Terraform v0.13.3

  • поставщик registry.terraform.io/hashicorp/aws v2.70.0

Все еще сталкиваюсь с проблемой

Всем привет! : wave: Просто хотел направить вас к нашей общедоступной дорожной карте на этот квартал (ноябрь-январь), в которой упоминался этот элемент.

Поскольку сообщество проявляет значительный интерес к решению этой проблемы, мы вскоре рассмотрим возможность объединения существующих вкладов.

Мы ценим все вклады и отзывы на данный момент.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги