Odpowiedzi:
Nie całkiem. Standardowym sposobem obejścia tego jest jednak użycie np .:
terraform apply -target=aws_security_group.my_sg
ale będzie to dotyczyło tylko jednej grupy zabezpieczeń naraz, więc stanie się nudne, jeśli będzie ich dużo. Możesz jednak celować w wiele zasobów za pomocą jednego polecenia:
terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg
Istnieje jednak potencjalnie kilka obejść:
-target
Parametr szanuje zależności.
Oznacza to, że gdybyś np. -target=aws_instance.my_server
i w tym przypadku, powiedzmy, pięć grup bezpieczeństwa dołączonych do niego przez interpolację, zmiany w tych grupach zabezpieczeń powinny zostać uwzględnione w planie (nie testowałem tego dokładnie, ale wierzę, że tak to działa).
Jest to trochę bałagan, ponieważ prawdopodobnie nie chcesz dotknąć instancji. Bezpieczniejszą alternatywą może być użycie czegoś w rodzaju a, null_resource
aby zapewnić cel grupom bezpieczeństwa, ale znowu nie próbowałem tego (może być jednak inny „bezpieczny” zasób, na którym można polegać?).
Utwórz moduł.
Możesz kierować na moduł tak samo, jak na zwykły zasób:
terraform apply -target=module.my_security_groups
Wewnątrz tego modułu można zdefiniować wszystkie grupy zabezpieczeń - tak samo, jak na zewnątrz modułu. Oprócz możliwości bezpośredniego ukierunkowania, ułatwia to ponowne użycie tego samego zestawu grup zabezpieczeń dla innej infrastruktury, jeśli zajdzie taka potrzeba.
Preferowany jest moduł terraform, ale jeśli naprawdę musisz uruchomić program Terraform Apply na pojedynczym pliku, stworzyłem ten skrypt bash, aby wygenerować polecenie Apply Terraform dla wszystkich obiektów docelowych i modułów w jednym pliku:
#!/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"
Nie jestem ekspertem od bash, ale został przetestowany do pracy na Macu.
EDYCJA: Komenda sed zakłada, że zasoby i moduły są ładnie sformatowane zgodnie z terraform fmt
:
resource "aws_eip" "my_public_ip" {
}
resource "aws_instance" "my_server" {
}
module "my_module" {
}