Вопрос или проблема
У меня есть такая конфигурация в моем модуле Terraform, названном cluster:
resource "aws_vpc_security_group_ingress_rule" "eks_cluster_https" {
for_each = toset(var.cidr_blocks)
description = "Разрешить доступ к кластеру"
security_group_id = aws_security_group.eks-cluster.id
cidr_ipv4 = each.key
from_port = 443
ip_protocol = "tcp"
to_port = 443
}
В файле переменных два CIDR блока заданы так (я придумал их по соображениям безопасности):
cidr_blocks = ["15.0.0.0/8", "120.61.0.0/16"]
Эти две правила группы безопасности уже существуют в учетной записи AWS. Я хочу импортировать их в Terraform. Я использую эту команду для импорта первого:
terraform import 'cluster.aws_vpc_security_group_ingress_rule.eks_cluster_https["15.0.0.0/8"]' sgr-0bdc5cc08c70f13c3
Но когда я запускаю эту команду, я получаю следующую ошибку:
│ Ошибка: Неверный адрес
│
│ на <import-address> строка 1:
│ 1: cluster.aws_vpc_security_group_ingress_rule.eks_cluster_https["15.0.0.0/8"]
│
│ Неожиданные дополнительные операторы после адреса.
Я не могу понять, что не так. Я пробовал множество вариантов одинарных и двойных кавычек и экранирование кавычек. Что не так с этой командой?
Ответ или решение
Ошибка "Unexpected extra operators after address" в Terraform при использовании команды terraform import
может возникнуть из-за неправильного синтаксиса указания адреса ресурса. В приведенном вами примере вы пытаетесь импортировать правило входящего трафика для группы безопасности кластера EKS, но формат команды импорта некорректен.
Подробный разбор проблемы
Согласно вашему коду, ресурс aws_vpc_security_group_ingress_rule
использует for_each
, что создает множество экземпляров этого ресурса на основе заданных CIDR блоков. Однако, в Terraform, когда вы работаете с множественными ресурсами через for_each
, синтаксис импорта немного отличается от обычного.
Вы правильно указали идентификатор правила группы безопасности в AWS (sgr-0bdc5cc08c70f13c3
), но неправильно сформировали путь к ресурсам. В этой ситуации не будет работать обращение к ресурсу с указанием ключа.
Как правильно импортировать ресурс?
Для успешного импорта конкретного экземпляра ресурса с использованием for_each
, вам нужно указать его индекс, как это сделано в следующем примере:
-
Правильный синтаксис:
terraform import 'module.cluster.aws_vpc_security_group_ingress_rule.eks_cluster_https["15.0.0.0/8"]' sgr-0bdc5cc08c70f13c3
Обратите внимание на использование правильного пути к ресурсу, который включает название модуля (
module.cluster
), а также правильные кавычки. -
Убедитесь, что CIDR блок присутствует в
cidr_blocks
:Убедитесь, чтоCIDR блок, который вы пытаетесь импортировать, на самом деле присутствует в переменной
cidr_blocks
. Terraform должен знать, что этот CIDR блок существует, иначе он не сможет создать корректный атрибут для импортирования. -
Проверка текущих ресурсов:
Перед импортом рекомендуется запустить команду
terraform plan
, чтобы убедиться, что инфраструктура сведена к актуальному состоянию и все ресурсы правильно определены.
Заключение
Ошибка "Unexpected extra operators after address" в Terraform при попытке импорта ресурса часто связана с неправильным синтаксисом пути к ресурсу. Убедитесь, что выделяете название модуля и правильно указываете ключи в выражении for_each
. Следуя приведенным выше рекомендациям, вы сможете успешно импортировать существующие ресурсы в вашу Terraform конфигурацию.
Если ошибка продолжает возникать, стоит пересмотреть конфигурацию и проверить корректность идентификаторов ресурсов в AWS.