Ответы:
На самом деле, нет. Стандартный способ обойти это, хотя, например:
terraform apply -target=aws_security_group.my_sg
но за один раз будет применяться только одна группа безопасности, так что будет утомительно, если у вас их много. Однако вы можете настроить таргетинг на несколько ресурсов одной командой:
terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg
Тем не менее, есть потенциально несколько обходных путей:
-target
Параметр уважает зависимости.
Это означает, что если бы вы были, например. -target=aws_instance.my_server
и к этому экземпляру, скажем, пять групп безопасности, связанных с ним посредством интерполяции, изменения в этих группах безопасности должны быть включены в план (я не проверил это полностью, но я считаю, что так оно и работает).
Это немного грязно, так как вы, вероятно, не хотите трогать экземпляр. Более безопасной альтернативой может быть использование чего-то вроде a null_resource
для предоставления цели для групп безопасности, но опять же я не пробовал это (может быть, есть другой «безопасный» ресурс, на который вы могли бы положиться, хотя?).
Создать модуль.
Вы можете настроить таргетинг на модуль так же, как и на обычный ресурс:
terraform apply -target=module.my_security_groups
Внутри этого модуля вы можете определить все свои группы безопасности - так же, как и вне модуля. Помимо возможности непосредственного нацеливания, это также упрощает повторное использование одного и того же набора групп безопасности для другой инфраструктуры, если вам это когда-либо понадобится.
Использование модуля terraform предпочтительнее, но если вам действительно нужно запустить terraform apply для одного файла, я сделал этот скрипт bash для генерации команды terraform apply для всех целей и модулей в одном файле:
#!/usr/bin/env bash
if [[ -z "$@" ]]; then
echo "Missing file input arguments"
exit 1
fi
echo "terraform apply \\"
for FILE in "$@"
do
RESOURCE=$(sed -n 's/resource "\([^"]*\)" "\([^"]*\)".*/-target=\1.\2 \\/gp' $FILE)
MODULE=$(sed -n 's/module "\([^"]*\)".*/-target=module.\1 \\/gp' $FILE)
if [[ -z "$RESOURCE" ]] && [[ -z "$MODULE" ]]; then
echo "Cannot detect terraform resource and module in $FILE"
exit 1
fi
if [[ ! -z "$RESOURCE" ]]; then
echo -e $"$RESOURCE"
fi
if [[ ! -z "$MODULE" ]]; then
echo -e $"$MODULE"
fi
done
echo "-refresh=true"
Я не очень-то разбираюсь в bash, но его тестировали для работы на Mac.
РЕДАКТИРОВАТЬ: команда sed предполагает, что ресурсы и модули хорошо отформатированы в соответствии с terraform fmt
:
resource "aws_eip" "my_public_ip" {
}
resource "aws_instance" "my_server" {
}
module "my_module" {
}