Respuestas:
Realmente no. Sin embargo, la forma estándar de solucionar esto es usar, por ejemplo:
terraform apply -target=aws_security_group.my_sg
pero eso solo aplicará un grupo de seguridad a la vez, por lo que será tedioso si tiene muchos de ellos. Sin embargo, puede apuntar a múltiples recursos en un solo comando:
terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg
Sin embargo, hay potencialmente un par de soluciones alternativas:
El -target
parámetro respeta las dependencias.
Esto significa que si tuviera que, por ejemplo. -target=aws_instance.my_server
y esa instancia tenía, por ejemplo, cinco grupos de seguridad unidos mediante interpolación, los cambios a esos grupos de seguridad deberían incluirse en el plan (no lo he probado exhaustivamente, pero creo que así es como funciona).
Sin embargo, eso es un poco desordenado, ya que probablemente no quieras tocar una instancia. Una alternativa más segura podría ser usar algo como a null_resource
para proporcionar un objetivo para los grupos de seguridad, pero nuevamente no lo he intentado (¿aunque podría haber otro recurso 'seguro' en el que podría confiar?).
Crea un módulo.
Puede apuntar a un módulo tal como puede apuntar a un recurso simple:
terraform apply -target=module.my_security_groups
Dentro de este módulo, puede definir todos sus grupos de seguridad, tal como lo haría fuera del módulo. Además de poder apuntarlo directamente, esto también le facilita la reutilización del mismo conjunto de grupos de seguridad para otra infraestructura, si alguna vez lo necesita.
No parece que sea posible. Aquí está el código para cargar archivos de configuración y carga todos los archivos * .tf del directorio actual (o uno especificado) y no hay nada allí para limitar la configuración a un solo archivo.
Se prefiere usar el módulo terraform, pero si realmente tiene que ejecutar terraform apply contra un solo archivo, hice este script bash para generar el comando terraform apply contra todos los objetivos y módulos en un archivo:
#!/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"
No soy realmente un experto en bash, pero fue probado para funcionar en Mac.
EDITAR: El comando sed asume que los recursos y los módulos están formateados de acuerdo con terraform fmt
lo siguiente:
resource "aws_eip" "my_public_ip" {
}
resource "aws_instance" "my_server" {
}
module "my_module" {
}