Ошибка Terraform: импортирование EC2 Key Pair (XXXX): InvalidKeyPair.Duplicate: Пара ключей уже существует.

Вопрос или проблема

Я новичок в Terraform. Я пытаюсь добавить дополнительную группу узлов в существующий стек Terraform, который уже был развернут в регионе AWS кем-то другим в моей организации. Я прошел через установку и отредактировал файл terraform.tf, чтобы включить мою дополнительную группу узлов. Когда я пытаюсь применить изменения, я сталкиваюсь с ошибкой:-

│ Ошибка: импорт пары ключей EC2 (XXXXX): InvalidKeyPair.Duplicate: Пара ключей уже существует
│ код состояния: 400, ID запроса: XXXXXX-XXXX-XXXXX-XXXX-XXXXXX

│ в модуле networks.aws_key_pair.user,
│ на строке 1 файла modules\networks\ec2.tf в ресурсе “aws_key_pair” “user”:
│ 1: ресурс “aws_key_pair” “user” {

Вещи, которые я проверил/попробовал:-

Что пары ключей AWS XXXXX находятся в моей консоли, и дубликатов нет.

Пробовал команду “terraform import” с именем | ID из консоли, но это приводит к сериям вопросов, например, по регионам, зонам доступности, которые уже указаны в моем скрипте.

Жестко прописал имя ключа и открытый ключ (rsa…) в файле modules\networks\ec2.tf.

Все еще не получил результата, поэтому буду благодарен за любые предложения.

Как упоминается в ошибке, “Пара ключей уже существует”. Однако Terraform не знает о её существовании и пытается её создать.

Вот что можно сделать в этой ситуации:

  • Убедитесь, что у вас есть правильное состояние Terraform. Если Terraform использовался для правильного развертывания этого ресурса, он должен быть в состоянии. Возможно, конфигурации состояния неправильные, используется какое-то другое состояние по ошибке, или у вас нет файла состояния.

  • Если его нет в состоянии, состояние было потеряно по какой-либо причине, или импорт ресурса в новое состояние проще, вы можете импортировать его в состояние. Документация упоминает, что пара ключей может быть просто импортирована по своему key_name. Например, если имя ключа XXXXX, как в вопросе, то его можно импортировать с помощью:

    $ terraform import aws_key_pair.user XXXXX
    

Регион не нужно указывать в команде импорта, так как он указан в конфигурации провайдера AWS или в учетных данных. Однако будет хорошей идеей ещё раз проверить их, чтобы случайно не развернуть в неправильном окружении!

Ответ или решение

Ошибка, с которой вы столкнулись в Terraform, связана с попыткой создать EC2 Key Pair, который уже существует в вашем аккаунте AWS. Это частая проблема, возникающая, когда идентификатор созданного ранее ресурса не согласуется с состоянием Terraform. Ваша задача — синхронизировать текущее состояние ресурсов в AWS с состоянием в Terraform, чтобы избежать подобных конфликтов в будущем. Рассмотрим теорию, примеры и практическое применение этого подхода.

Теория

Terraform управляет инфраструктурой через состояние (state), которое представляет собой файл с информацией о всех ресурсах, созданных с его помощью. Если ресурс уже существует в AWS, но не зафиксирован в файле состояния, Terraform может попытаться создать его заново, что и вызывает ошибку InvalidKeyPair.Duplicate.

Основные причины проблемы:

  1. Потеря файла состояния: Если состояние было случайно удалено или повреждено, Terraform не может знать о существующих ресурсах.
  2. Использование неправильного состояния: Возможно, что используется файл состояния от другого окружения или проекта.
  3. Отсутствие импорта ресурса: Ресурс не импортирован в состояние Terraform, что может происходить, если он был создан вручную или другим способом вне Terraform.

Пример

Предположим, что у вас в AWS уже существует ключ EC2 с именем my-keypair. При попытке создать такой же ключ через Terraform, вы столкнетесь с ошибкой дублирования. Ошибка будет выглядеть как:

Error: importing EC2 Key Pair (my-keypair): InvalidKeyPair.Duplicate: The keypair already exists
  status code: 400, request id: XXXXXX-XXXX-XXXXX-XXXX-XXXXXX

Применение

Для решения этой проблемы выполните следующие шаги:

  1. Проверьте корректность файла состояния:

    • Убедитесь, что вы работаете с правильной конфигурацией состояния. Для этого проверьте настройки бекенда, где хранится ваше состояние, и убедитесь, что оно совпадает с проектом, который вы разворачиваете.
    • Если бекенд не настроен, например, для работы с удаленным хранилищем в AWS S3, рассмотрите возможность его настройки, чтобы избежать подобных проблем в будущем.
  2. Импорт ресурса:

    • Используйте команду terraform import, чтобы добавить существующий ресурс в файл состояния. Это позволит Terraform учитывать ресурсы, созданные в AWS ранее.

    • Для импорта вашего ключа выполните команду:

      terraform import aws_key_pair.user my-keypair
    • Убедитесь, что имя my-keypair соответствует имени ключа в AWS, и проверьте правильность переключателей и параметров конфигурации AWS provider в вашем проекте Terraform.

  3. Проверка конфигурации AWS:

    • Убедитесь, что ваши учётные данные AWS и регион указаны правильно. Это предотвратит случайное развертывание ресурсов в неверных регионах.
  4. Обновление state:

    • После импорта и корректировки состояния выполните команду terraform plan, чтобы убедиться, что теперь Terraform согласован со всеми существующими ресурсами.
    • Убедитесь, что в выводе плана нет предстоящих изменений, связанных с вашими ключами, чтобы избежать незапланированных изменений или ошибок.
  5. Документация и комментирование:

    • Обеспечьте, чтобы ваше состояние и код Terraform были хорошо задокументированы. Это облегчит поддержку и развертывание в будущем.

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

Оцените материал
Добавить комментарий

Капча загружается...