Respostas:
Na verdade não. A maneira padrão de contornar isso é usar, por exemplo:
terraform apply -target=aws_security_group.my_sg
mas isso só aplicará um grupo de segurança de cada vez; portanto, será tedioso se você tiver muitos deles. No entanto, você pode direcionar vários recursos em um comando:
terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg
No entanto, há potencialmente algumas soluções alternativas:
O -target
parâmetro respeita dependências.
Isso significa se você deveria, por exemplo. -target=aws_instance.my_server
e essa instância teve, digamos, cinco grupos de segurança anexados a ele por meio de interpolação, as alterações nesses grupos de segurança devem ser incluídas no plano (não testei isso completamente, mas acredito que é assim que funciona).
Isso é um pouco confuso, pois você provavelmente não quer tocar em uma instância. Uma alternativa mais segura pode estar usando algo como a null_resource
para fornecer um alvo para os grupos de segurança, mas novamente eu não tentei isso (pode haver outro recurso 'seguro' em que você possa confiar?).
Crie um módulo.
Você pode direcionar um módulo da mesma forma que um recurso simples:
terraform apply -target=module.my_security_groups
Dentro deste módulo, você pode definir todos os seus grupos de segurança - como faria fora do módulo. Além de poder direcioná-lo diretamente, isso também facilita a reutilização do mesmo conjunto de grupos de segurança para outra infraestrutura, se você precisar.
Não parece possível. Aqui está o código para carregar arquivos de configuração e ele carrega todos os arquivos * .tf do diretório atual (ou um especificado) e não há nada para limitar a configuração a um único arquivo.
É preferível usar o módulo terraform, mas se você realmente precisar executar o terraform aplicar-se a um único arquivo, criei este script bash para gerar o comando terraform apply contra todos os destinos e módulos em um arquivo:
#!/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"
Eu não sou realmente especialista em bash, mas foi testado para funcionar no Mac.
EDIT: O comando sed pressupõe que os recursos e módulos estejam formatados de acordo com terraform fmt
:
resource "aws_eip" "my_public_ip" {
}
resource "aws_instance" "my_server" {
}
module "my_module" {
}