Terraform : 하나의 tf 파일 만 적용


17

securitygroup.tf파일에 보안 그룹이 있습니다.

같은 디렉토리에는 다른 많은 자원 설명 (rds, ec2 등)이 있습니다.

내 용도 terraform apply --auto-approve 로만 수행 할 수있는 방법이 securitygroups.tf있습니까?

답변:


19

실제로는 아닙니다. 이 문제를 해결하는 표준 방법은 다음과 같습니다.

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
    

    이 모듈 내에서 모듈 외부에있는 것처럼 모든 보안 그룹을 정의 할 수 있습니다. 직접 대상을 지정할 수있을뿐만 아니라 필요한 경우 다른 인프라에 동일한 보안 그룹 집합을보다 쉽게 ​​재사용 할 수 있습니다.


2

코드를 모듈별로 정리하면 다음과 같이 모듈에만 테라 포름을 적용 할 수 있습니다.

# securitygroup.tf
module "securitygroup" {
  source = "git@github.com:user/securitygroup-terraform-module.git?ref=master"
}

$ tf apply -target=module.securitygroup

1

가능한 것처럼 보이지 않습니다. 다음은 구성 파일을로드 하는 코드 이며 현재 디렉토리 (또는 지정된 디렉토리)에서 모든 * .tf 파일을로드하며 구성을 단일 파일로 제한 할 것은 없습니다.


0

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" {
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.