답변:
실제로는 아닙니다. 이 문제를 해결하는 표준 방법은 다음과 같습니다.
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
이 인스턴스에는 보간을 통해 5 개의 보안 그룹이 연결되어 있으며 해당 보안 그룹에 대한 변경 사항 이 계획에 포함 되어야 합니다.
인스턴스를 건드리고 싶지 않기 때문에 약간 지저분합니다. 더 안전한 대안은 null_resource
보안 그룹에 대상을 제공하기 위해 a 와 같은 것을 사용하고 있지만 다시 시도하지 않았습니다 (하지만 신뢰할 수있는 또 다른 '안전한'자원이있을 수 있습니까?).
모듈을 작성하십시오.
당신은 타겟팅 할 수있는 모듈을 사용하면 일반 리소스를 타겟팅 할 수 있습니다처럼 :
terraform apply -target=module.my_security_groups
이 모듈 내에서 모듈 외부에있는 것처럼 모든 보안 그룹을 정의 할 수 있습니다. 직접 대상을 지정할 수있을뿐만 아니라 필요한 경우 다른 인프라에 동일한 보안 그룹 집합을보다 쉽게 재사용 할 수 있습니다.
terraform 모듈을 사용하는 것이 바람직하지만 실제로 단일 파일에 대해 terraform apply를 실행해야하는 경우 하나의 파일에서 모든 대상 및 모듈에 대해 terraform apply 명령을 생성하기 위해이 bash 스크립트를 작성했습니다.
#!/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"
나는 실제로 전문가를 강타하지는 않지만 Mac에서 작동하도록 테스트되었습니다.
편집 : sed 명령은 다음과 같이 리소스와 모듈이 잘 포맷 된 것으로 가정합니다 terraform fmt
.
resource "aws_eip" "my_public_ip" {
}
resource "aws_instance" "my_server" {
}
module "my_module" {
}