Terraform-provider-aws: Das Hinzufügen eines benutzerdefinierten Cognito-Benutzerpoolattributs erzwingt eine neue Ressource

Erstellt am 22. März 2018  ·  44Kommentare  ·  Quelle: hashicorp/terraform-provider-aws

Das Hinzufügen neuer benutzerdefinierter Attribute sollte nicht die Neuerstellung des Cognito-Benutzerpools erzwingen.

Terraform-Version

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

Betroffene Ressource(n)

aws_cognito_user_pool

Terraform-Konfigurationsdateien

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
  }
  */
}

Debug-Ausgabe

Ausgabe von terraform plan nach dem Hinzufügen des benutzerdefinierten Attributs oben.

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.

Panikausgang

Keiner

Erwartetes Verhalten

Fügen Sie das Attribut hinzu, ohne den Cognito-Benutzerpool zu zerstören und neu aufzubauen. Dies wird durch die cognito-Benutzeroberfläche und -API (https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AddCustomAttributes.html) unterstützt.

Tatsächliches Verhalten

Der Cognito-Benutzerpool wurde neu erstellt.

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

Schritte zum Reproduzieren

  1. terraform apply - Neuen Benutzerpool erstellen
  2. Fügen Sie ein neues benutzerdefiniertes Attribut hinzu
  3. terrform plan - Die Anzeige der Ausgabe zeigt, dass sie den Kognito-Benutzerpool neu aufbauen würde.

Wichtige Fakten

Keiner

Verweise

Keiner

enhancement serviccognito

Hilfreichster Kommentar

Gibt es diesbezüglich Fortschritte? Ihr zwingt uns, eine Ressource zu vernichten, bei der der Kunde aufgefordert wird, seine Passwörter zurückzusetzen (vorausgesetzt, wir haben überhaupt Sicherungsdaten zum Importieren), oder für mich richte ich einen Lebenszyklus ignore_changes * ein und hoffe, dass sich endlich jemand zurechtfindet um dies zu beheben, bevor ich eine weitere Änderung benötige.

Die Tatsache, dass dies seit 9 Monaten draußen sitzt, lässt mich ernsthaft darüber nachdenken, ob ich Terraform kritische Infrastruktur anvertrauen sollte.

Alle 44 Kommentare

Ich bin mir nicht sicher, wie das Löschen benutzerdefinierter Attribute funktioniert, da AWS das Löschen benutzerdefinierter Attribute oder das Aktualisieren benutzerdefinierter Attribute nicht zu unterstützen scheint.

Wie vermutet, kann man benutzerdefinierte Attribute, die einmal als Teil des user_pool erstellt wurden, nicht aktualisieren oder löschen. Das aktuelle Verhalten ist also meiner Meinung nach der einzige Ausweg 🤔 Weitere Details in der AWS- Dokumentation

Richtig, sobald die Attribute hinzugefügt wurden, können sie nicht mehr entfernt werden. Sie können jedoch neue Attribute hinzufügen.

Gibt es eine Problemumgehung, um neue Attribute über Terraform hinzuzufügen, ohne den gesamten Benutzerpool neu erstellen zu müssen? Es scheint schwierig zu sein, in Zukunft ein neues Attribut hinzuzufügen, wenn die Anwendung live ist.

Bearbeiten: Sieht so aus, als hätte das Anhängen der Version an 1.12 dies für uns behoben.

In der Zwischenzeit können Sie dies außerhalb von Terraform (Webkonsole, CLI usw.) tun und anschließend einfach Ihre Terraform-Konfiguration synchronisieren.

Noch ein bisschen recherchieren. Ich habe das Problem gefunden. Wenn das Schemaattribut (in meinem Fall String) das string_attribute_constraints , wird jedes Mal eine neue Ressource erzwungen.

Folgendes generiert jedes Mal eine neue Ressource:

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

Dies gilt zwar nicht:

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

    string_attribute_constraints {
      min_length = 6
      max_length = 32
    }
  }

Höchstwahrscheinlich ist es ein anderer Fehler.

@leonfs Ich denke, wir brauchen hier eine Customizediff-Funktion. die thwbrules auswertet, wann der Pool neu erstellt werden muss und wann er geändert werden sollte. @bflad Können Sie bitte bestätigen, was getan werden muss, und ich kann das abholen.

@Puneeth-n Ja - scheint so zu sein. Im Moment gibt es ein ForceNew: true im Schema-Set, aber das ist bei benutzerdefinierten Attributen eindeutig nicht der Fall.

Ich habe (siehe oben) auf ein anderes Problem verwiesen, auf das ich gestoßen bin, nachdem ich dem Benutzerpool einen Identitätsanbieter (Google) hinzugefügt hatte.

Sieht so aus, als ob AWS nach dem Hinzufügen eines Anbieters ein benutzerdefiniertes Attribut namens identities hinzufügt, wodurch die Schemaeinstellungen geändert werden und ein ganz neuer Pool neu erstellt werden muss. Sie sehen, dass ich eine kurzfristige Lösung dafür bereitgestellt habe, die jedoch nur funktioniert, wenn Sie im Voraus wissen (Ressourcenerstellung), dass Sie Identitätsanbieter verwenden werden.

Sieht so aus, als würde Terraform eine Zerstörung und Erstellung eines Benutzerpools erzwingen, auch wenn sich in der .tf-Datei nichts geändert hat.

$ 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 bewerben

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-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.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 Das Problem, mit dem Sie konfrontiert sind, ist ein anderes. Allerdings sollte terraform IMHO in der Lage sein, solche Fehler abzufangen.

In Ihrer Konfiguration ist ein Fehler aufgetreten. Für oid Sie attribute_data_type = "String" aber number_attribute_constraints Die korrigierte Konfiguration ist unten:

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 , Danke, dass Sie das Problem in meiner Konfiguration erkannt haben. Ich habe es gemäß Ihrem Vorschlag geändert und jetzt aktualisiert terraform nur die geänderten Attribute.

Mir ist aufgefallen, dass das E-Mail-Überprüfungsflag nicht mehr gesetzt wird, nachdem ich eine einfache Änderung (z.

$ terraform bewerben

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-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.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.

Ich frage mich, ob dies auch auf einen Fehler in der Konfigurationsdatei oder einen Bug zurückzuführen ist.

Dies scheint immer noch ein Problem zu sein und wird eines Tages jemandem viel Kummer bereiten, wenn tf den Benutzerpool verlässt und alle seine Benutzer verlieren ...

Wenn Sie dies dem Schema hinzufügen, wird der Benutzerpool zerstört, obwohl er in der Konsole/Cli ohne Zerstörung erstellt werden konnte.

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

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

Ja. Ich habe prevent_destroy sowohl auf pool als auch auf client

Das Problem beim Wiederherstellen der Ressource tritt immer noch auf, wenn ich versuche, neue benutzerdefinierte Attribute hinzuzufügen.

Terraform-Version
Terraform v0.11.8
anbieter.aws v1.36.0

Vor dem Hinzufügen eines neuen benutzerdefinierten Attributs

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
      }
    }
  ]
}

Neues benutzerdefiniertes Attribut hinzufügen

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

Debug-Ausgabe

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.

Zu Ihrer Information: Ich habe ein benutzerdefiniertes Attribut ohne string_attribute_constraints , dann hatte ich denselben Fehler.

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

Nachdem ich leere string_attribute_constraints hinzugefügt habe, konnte ich diesen Fehler vermeiden!

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

    string_attribute_constraints {}
  }

Ich schätze die Problemumgehung aller sehr!

Abhilfe funktioniert bei mir nicht.

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
    }
  }

Planen:

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)

Versionen:

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

Dies ist ein großes Problem für jeden, der neue Anwendungen entwickelt und benutzerdefinierte Attribute hinzufügen oder damit experimentieren muss. Aus diesem Grund wurde unser Pool mehr als 10 Mal zerstört.

Gibt es diesbezüglich Fortschritte? Ihr zwingt uns, eine Ressource zu vernichten, bei der der Kunde aufgefordert wird, seine Passwörter zurückzusetzen (vorausgesetzt, wir haben überhaupt Sicherungsdaten zum Importieren), oder für mich richte ich einen Lebenszyklus ignore_changes * ein und hoffe, dass sich endlich jemand zurechtfindet um dies zu beheben, bevor ich eine weitere Änderung benötige.

Die Tatsache, dass dies seit 9 Monaten draußen sitzt, lässt mich ernsthaft darüber nachdenken, ob ich Terraform kritische Infrastruktur anvertrauen sollte.

Der Workaround funktioniert bei mir auch nicht. Es erstellt den Pool immer neu, auch wenn keine Änderungen an den Vorlagen vorgenommen wurden.

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

immer noch ein problem

Terraform v0.11.11
+ provider.aws v1.57.0

Und weiterhin...

Terraform v0.11.11
+ provider.aws v1.59.0

Ich bin auch davon betroffen, keiner der Workarounds hat bei mir funktioniert.

Terraform v0.11.11
+ provider.aws v1.60.0

Die Tatsache, dass dies seit 9 Monaten draußen sitzt, lässt mich ernsthaft darüber nachdenken, ob ich Terraform kritische Infrastruktur anvertrauen sollte.

Ich stelle mir die gleiche Frage. Es gibt viele kritische Fehler, die länger als ein Jahr nicht behandelt wurden, einige - seit mehr als zwei Jahren. Für viele dieser Bugs gibt es fertige PR, die auch über ein Jahr ungelandet herumhängen.

Außerdem habe ich vor kurzem einen Fehlerbericht für eine ernsthafte, aber in Jsonencode enthaltene Funktion ausgefüllt - sie haben sich geweigert, ihn zu reparieren. Die Antwort war - es ist in Version 12 behoben, die zu einem unbekannten Zeitpunkt in der Zukunft veröffentlicht wird und wir uns nicht um Version 11 kümmern.

Übrigens ist das Problem aus diesem Thema nicht das einzige, das der Cognito-Benutzerpool hat. Callback_urls muss genau so bestellt werden, wie AWS dies tut, sonst versucht terraform ständig, die Reihenfolge zu ändern.

@voroniys Mein

Immer noch ein Thema.

Ich habe dies untersucht und einen Weg gefunden, dies zu "beheben".

Eine bessere Möglichkeit, benutzerdefinierte Attribute zu verwalten, besteht darin, ein benutzerdefiniertes Attribut zu einer separaten Ressource zu machen, zB aws_cognito_user_pool_schema_custom_attribute .

In Terraform wird eine Ressource durch ein Schema zusammen mit Create-, Read-, Update- und Delete-Funktions-Callbacks definiert. Core Terraform berechnet die Differenz zwischen dem aktuellen Status und dem, was Sie in Ihrem Terraform-Code definiert haben. Wir wollen uns so gut wie möglich darauf verlassen, dass TF das Richtige tut.

Wenn Sie das Schemaattribut als separate Ressource entfernen, hat man eine genauere Kontrolle über die Differenzberechnung: Durch das Hinzufügen einer neuen benutzerdefinierten Schemaattributressource ruft Terraform die Create-Funktion der separaten Ressource auf, anstatt die Zerstören/Erstellen-Sequenz der Schwimmbad. In der Create-Funktion der Schemaattributressource können wir den AWS Cognito AddCustomAttributes API-Aufruf aufrufen.

Eine Änderung der Eigenschaften des Schema-Attributs könnte auch granularer gehandhabt werden, aber das ist zu testen.

Wenn Sie (versehentlich) Ihre benutzerdefinierten Schemaattributressource aus Ihrem Terraform-Code löschen, würde TF die Löschfunktion der Attributressource aufrufen. Wir könnten einen Fehler anzeigen, der anzeigt, dass ein Löschen nicht unterstützt wird und Ihr TF-Code wiederhergestellt werden muss.

Bemerkungen?

@bflad , wissen Sie, wer bei der Gestaltung der Änderungen helfen könnte?

Danke @ringods für deine Arbeit und deinen Vorschlag. Dies könnte der richtige Weg sein, um dieses Problem anzugehen!

Das Problem wird weiterhin validiert, während die aktuellsten Versionen verwendet werden:

Terraform v0.12.3
+ provider.aws v2.18.0 

Kurze Zusammenfassung:

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

Fügen Sie dann ein beliebiges Attribut hinzu:

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

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

Anstatt nur das inkrementelle Update durchzuführen, wie es sollte, zerstören Terraform und fügen die Ressource dann erneut hinzu:

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

Wir müssen keine neue Funktion in unserer Produktionsumgebung bereitstellen, wir benötigen ein neues benutzerdefiniertes Attribut. Wenn wir es über cli hinzufügen, wird die gesamte Terraform-Konfiguration durcheinander gebracht, die auch viele andere Ressourcen enthält.

Der Vorschlag von
Hier ist der erste Entwurf meines Codes. Ich konnte es erfolgreich testen, indem ich auf lokal erstellte terraform-provider-aws zeigte. Ich schreibe jetzt die Akzeptanztests. Anregungen/Kommentare zur PR sind willkommen!

Wir haben Cognito Attribute hinzugefügt, ohne unseren Benutzerpool wie folgt zu verlieren:

  1. Verwenden Sie die CLI, um Attribute zum vorhandenen Schema hinzuzufügen: aws cognito-idp --region ... add-custom-attributes --user-pool-id ... --custom-attributes Name=...,AttributeDataType=Boolean,DeveloperOnlyAttribute=false, Mutable=true,Required=false
  2. Entfernen Sie den aktuellen Status von Cognito, um die aktualisierte Ressource zu importieren. terraform state rm aws_cognito_user_pool.main
  3. Aktualisierte Ressource importieren. terraform import aws_cognito_user_pool.main ...

In unserem Fall stimmten jetzt unsere Ressourcen-, Status- und main.tf-Datei überein. Ich schlage vor, es zuerst mit einer Dev-Umgebung zu versuchen, hoffe, es hilft.

Bitte beheben Sie dies! Es ist lächerlich, den Status manuell verwalten zu müssen, was die Arbeit von ePoromaa umgeht.

Gibt es diesbezüglich noch Fortschritte? Wir warten gespannt auf eine Lösung, die keine manuellen Manipulationen am Terraform-Zustand erfordert. :-)

ping auch. Den Staat manuell zu verwalten ist... lächerlich

Leute, irgendwelche Updates? Wir haben jetzt 2020...

Ja, immer noch ein Thema...

Ich hoffe, dies hilft allen anderen, einfacher als die obige Lösung und möglicherweise weniger chaotisch, als mit dem Terraform-Zustand und den Importen herumzuspielen.

Ähnlich wie bei ePoromaa müssen Sie aws cli cmd manuell ausführen, um dem Cognito-Benutzerpool ein benutzerdefiniertes Attribut hinzuzufügen.
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}"
Weitere Informationen zu verfügbaren Attributen finden Sie unter: https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/add-custom-attributes.html

Nachdem Sie das benutzerdefinierte Attribut über die AWS-Cli hinzugefügt haben, müssen Sie nun den Schemablock dafür in Ihrem Terraform-Cognito-Benutzerpoolcode hinzufügen. Beispielsweise

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

Sobald der Schemablock zu terraform hinzugefügt wurde, übernimmt terraform keine Änderungen. Würde dies auch in prod für sicher halten.

Terraform v0.12.26

  • anbieter.aws v2.56.0

Habe das Problem immer noch...

Hallo zusammen, gibt es hier Updates?

Bitte beheben Sie dieses Problem!

Dies ist immer noch ein Problem mit

Terraform v0.12.28
+ provider.aws v2.67.0

Bitte Adresse.

Problemumgehung, um die Zerstörung des Benutzerpools zu verhindern:
1) Fügen Sie ein benutzerdefiniertes Attribut über die Konsole oder die CLI hinzu.
2) Fügen Sie dem Attribut, das Sie gerade erstellt haben, einen Schemablock zur Terraform-Vorlage
3) Führen Sie die Terraform-Aktualisierung aus. Es sollte die Statusdatei aktualisieren, um das Schema widerzuspiegeln.
4) Führen Sie den Terraform-Plan aus, um sicherzustellen, dass der Benutzerpool nicht mehr zerstört wird.

Hallo zusammen, auch wir haben mit diesem Problem zu kämpfen. Irgendwelche Updates? Danke!

Irgendjemand von HashiCorp da draußen? Hallo....

Auch vor diesem Hintergrund:

Terraform v0.12.29

Terraform v0.13.3

  • Anbieter Registry.terraform.io/hashicorp/aws v2.70.0

Stehe immer noch vor dem Problem

Hallo zusammen! :wave: Ich wollte Sie nur auf unsere öffentliche Roadmap für dieses Quartal (Nov.-Jan.) hinweisen, in der dieser Artikel erwähnt wurde.

Aufgrund des großen Gemeinschaftsinteresses an der Lösung dieses Problems werden wir in Kürze die Zusammenführung bestehender Beiträge prüfen.

Wir freuen uns über alle bisherigen Beiträge und Rückmeldungen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen