terraform apply 명령
terraform apply 명령
terraform apply 명령은 Terraform 플랜에서 제안된 작업들을 실제로 수행하는 명령이에요. 플랜을 자동으로 생성해 승인을 받거나, 저장된 플랜 파일을 그대로 적용하는 두 가지 방식으로 동작해요.
출처: 문서
본문
Hands On: Apply Terraform Configuration 튜토리얼에서 Terraform이 구성을 적용하는 방법, apply 중 오류로부터 복구하는 방법, 이 명령의 일반적인 사용법을 배워 보세요.
사용법 (Usage)
사용법: terraform apply [options] [plan file]
자동 플랜 모드 (Automatic Plan Mode)
저장된 플랜 파일 없이 terraform apply를 실행하면 Terraform은 terraform plan을 실행한 것처럼 자동으로 새 실행 계획을 만들고, 그 플랜에 대한 승인을 요청한 다음 표시된 작업을 수행해요. 플래닝 모드와 플래닝 옵션을 모두 사용해 Terraform이 플랜을 만드는 방식을 사용자 지정할 수 있어요.
-auto-approve 옵션을 전달하면 승인을 요청하지 않고 Terraform이 플랜을 적용하도록 지시할 수 있어요.
경고: -auto-approve를 사용한다면 Terraform 워크플로 외부에서 누구도 인프라를 변경할 수 없도록 해 두는 것을 권장해요. 이렇게 하면 예측할 수 없는 변경과 구성 드리프트의 위험을 최소화할 수 있어요.
저장된 플랜 모드 (Saved Plan Mode)
저장된 플랜 파일을 terraform apply에 전달하면 Terraform은 확인을 요청하지 않고 저장된 플랜의 작업을 수행해요. 자동화에서 Terraform 실행처럼 2단계 워크플로가 필요할 때 이 방식을 사용하면 좋아요.
적용하기 전에 terraform show를 사용해 저장된 플랜 파일을 검사할 수 있어요.
저장된 플랜을 사용할 때는 추가적인 플래닝 모드나 옵션을 지정할 수 없어요. 이 옵션들은 Terraform이 어떤 작업을 수행할지 결정하는 데만 영향을 주며, 플랜 파일에는 그 결정의 최종 결과가 담겨 있기 때문이에요.
플랜 옵션 (Plan Options)
저장된 플랜 파일 없이 terraform apply는 terraform plan에서 사용할 수 있는 모든 플래닝 모드와 플래닝 옵션을 지원해요.
-destroy``-refresh-only-replace``-var``-var-file
Apply 옵션 (Apply Options)
다음 옵션들은 apply 명령이 apply 작업을 실행하고 보고하는 방식을 변경해요.
- -auto-approve - 적용 전 플랜에 대한 대화형 승인을 건너뛰어요. 이전에 저장된 플랜 파일을 전달하면 Terraform은 이 옵션을 무시해요. 플랜 파일을 전달하는 행위 자체를 승인으로 해석하기 때문이에요. 여기에는 리소스 삭제 같은 파괴적 작업도 포함된다는 점에 유의하세요. 자동화에서 이 옵션을 사용한다면, 먼저 플랜 작업을 수행하고 제안된 변경을 검토한 후 적용할 것을 권장해요.
- -compact-warnings - 경고가 적어도 하나의 오류와 함께 나타나 경고 텍스트가 오류의 유용한 맥락이 될 수 있는 경우가 아니라면, 요약 메시지만 포함하는 간결한 형태로 경고 메시지를 표시해요.
- -input=false - Terraform의 모든 대화형 프롬프트를 비활성화해요. 플랜에 대한 대화형 승인 프롬프트도 막으므로, Terraform은 보수적으로 플랜을 적용하지 않으려 한다고 가정해 작업이 실패하게 돼요. 비대화형 환경에서 Terraform을 실행하려면 자동화에서 Terraform 실행에서 몇 가지 다른 접근 방식을 참고하세요.
- -invoke=action.
. - 구성 파일의 프로바이더 action을 지정해서 호출해요. 자세한 내용은 action 호출을 참고하세요. - -json - 머신이 읽을 수 있는 JSON UI 출력을 활성화해요. 이는
-input=false를 암시하므로 계속하려면 구성에 할당되지 않은 변수 값이 없어야 해요. 이 플래그를 활성화하려면-auto-approve플래그를 활성화하거나 이전에 저장된 플랜을 지정해야 해요. - -lock=false - 작업 중에 상태 락을 보유하지 않아요. 다른 사람들이 같은 워크스페이스에 대해 동시에 명령을 실행할 수 있다면 위험해요.
- -lock-timeout=DURATION -
-lock=false로 락을 비활성화하지 않는 한, 오류를 반환하기 전에 일정 기간 동안 락 획득을 재시도하도록 Terraform에 지시해요. duration 문법은 숫자 뒤에 시간 단위 문자를 붙인 형태로, 3초는 "3s"처럼 표현해요. - -no-color - 출력에서 터미널 포맷 시퀀스를 비활성화해요. 출력이 터미널 포맷을 해석할 수 없는 시스템에서 렌더링되는 상황에서 Terraform을 실행한다면 이 옵션을 사용하세요.
- -parallelism=n - Terraform이 그래프를 탐색할 때 동시 작업 수를 제한해요. 기본값은 10이에요.
- -replace=resource - 업데이트나 no-op 작업 대신 Terraform이 교체할 계획인 리소스 인스턴스를 지정해요.
terraform plan의 모든 플래닝 모드와 플래닝 옵션 - Terraform이 플랜을 만드는 방식을 사용자 지정해요. 저장된 플랜 파일 없이terraform apply를 실행할 때만 사용할 수 있어요.
로컬 백엔드만 사용하는 구성의 경우 terraform apply도 레거시 옵션 -state, -state-out, and -backup을 받아들여요.
다른 구성 디렉터리 전달하기 (Passing a Different Configuration Directory)
Terraform v0.13 이하에서는 terraform apply의 플랜 파일 인자 자리에 디렉터리 경로도 받아들였으며, 이 경우 Terraform은 현재 작업 디렉터리 대신 해당 디렉터리를 루트 모듈로 사용했어요.
이 사용법은 Terraform v0.14에서 더 이상 사용되지 않고 v0.15에서 제거되었어요. 루트 모듈 디렉터리를 재정의하는 워크플로에 의존한다면, 모든 명령에서 동작하며 Terraform이 현재 작업 디렉터리에서 보통 읽거나 쓸 모든 파일을 지정된 디렉터리에서 일관되게 찾도록 하는 -chdir 글로벌 옵션을 대신 사용하세요.
이 레거시 패턴을 이전에 사용하면서 루트 모듈 디렉터리를 재정의해도 .terraform 하위 디렉터리를 현재 작업 디렉터리에 쓰는 데 의존했다면, TF_DATA_DIR 환경 변수를 사용해 .terraform 디렉터리를 현재 작업 디렉터리가 아닌 위치에 쓰도록 지시하세요.
apply 작업 중 오류 (Errors during an apply operation)
Terraform이나 Terraform 프로바이더가 apply 단계에서 오류를 만나면 다음 단계를 수행해요:
- 오류를 기록하고 콘솔에 보고해요.
- 리소스 변경 사항으로 상태 파일을 업데이트해요.
- 상태 파일의 락을 해제해요.
- apply 작업을 종료해요.
Terraform apply 작업이 실패한 후 인프라가 잘못된 상태일 수 있어요. Terraform은 부분적으로 완료된 apply를 자동으로 롤백하지 않아요. 오류를 해결한 후에는 원하는 상태로 인프라를 업데이트하기 위해 구성을 다시 적용해야 해요.
예제 (Examples)
다음 예제들은 일반적인 사용 사례에서 terraform apply 명령을 사용하는 방법을 보여 줘요.
입력 변수에 값 전달하기
다음 명령은 실행 시 env 입력 변수를 prod로 설정해요:
$ terraform apply -var='env=prod'
다음 명령은 my-vars.tfvars라는 로컬 파일로 입력 변수 값을 설정해요:
$ terraform apply -var-file='my-vars.tfvars'
action 호출하기
다음 명령은 test라는 이름의 aws_lambda_invoke action 구성을 대상으로 해요. 그 결과 Terraform은 해당 action을 호출하고 다른 모든 구성을 무시해요:
$ terraform apply -invoke='action.aws_lambda_invoke.test'
action 구성에서 for_each와 count 메타 인자를 사용할 수 있어요. 이 메타 인자들은 action을 여러 번 호출할 수 있어요. 자세한 내용은 action 블록 참조를 참고하세요.
다음 명령은 test라는 이름의 aws_lambda_invoke action 구성을 한 번 호출해요:
$ terraform apply -invoke='action.aws_lambda_invoke.test["first-member-of-a-set"]'