Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Terraform에서 plan을 실행할 때 대상을 한정하기

Terraformplan, apply를 할 때 결과도 보장할 수 있고 시간도 단축할 수 있는 Terraform의 plan 결과를 저장해서 사용하기에 대해서 올렸는데 이 글에서도 설명했듯이 관리하는 리소스가 많아지면 plan을 할 때 많은 시간이 걸리는 것은 어쩔 수 없다. -out 옵션을 사용하면 apply의 시간을 꽤 줄일 수 있지만 plan 시간은 줄일 수 없다.

terraform plan -target=path

똑같이 Route53에 레코드를 하나 추가해 보자.

resource "aws_route53_record" "demo_sideeffect_kr" {
  zone_id = "${aws_route53_zone.sideeffect_kr.zone_id}"
  name = "demo.sideeffect.kr"
  type = "CNAME"
  ttl = "5"
  records = ["example.com"]
}

내용은 크게 중요치 않고 aws_route53_recorddemo_sideeffect_kr라는 이름의 리소스를 추가한 것이다. 이 내용을 추가하고 terraform plan을 실행하면 이 폴더에 포함된 tfstate에서 관리하는 리소스를 모두 검사한다. 로그가 길어서 여기에는 다시 남기지 않겠는데 이전 글에서 plan을 한 결과를 보면 된다.

내 개인 terraform에서는 관리하는 리소스가 많지 않아서 그리 오래 걸리지 않지만, 회사에서는 plan을 하면 10분 가까이 걸리는 것도 있다.

이때 -target=resource 옵션을 사용하면 해당 리소스와 의존관계에 있는 리소스만 검사를 하게 된다. 여기서 Route53에 레코드를 추가한 것처럼 이 tfstate에서 S3나 CloudWatch 등도 관리하고 있을 수 있지만 여기서 추가한 부분이 명확하므로 굳이 다른 부분까지 plan을 해서 비교를 해볼 필요가 없다.

$ terraform plan -target=aws_route53_record.demo_sideeffect_kr
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

aws_route53_zone.sideeffect_kr: Refreshing state... (ID: Z12CBQ5AHVFFYA)
The Terraform execution plan has been generated and is shown below.
Resources are shown in alphabetical order for quick scanning. Green resources
will be created (or destroyed and then created if an existing resource
exists), yellow resources are being changed in-place, and red resources
will be destroyed. Cyan entries are data sources to be read.

Note: You didn't specify an "-out" parameter to save this plan, so when
"apply" is called, Terraform can't guarantee this is what will execute.

+ aws_route53_record.demo_sideeffect_kr
    fqdn:               "<computed>"
    name:               "demo.sideeffect.kr"
    records.#:          "1"
    records.3313064457: "blog.outsider.ne.kr"
    ttl:                "5"
    type:               "CNAME"
    zone_id:            "Z12CBQ5AHVFFYA"


Plan: 1 to add, 0 to change, 0 to destroy.

위처럼 -target 옵션으로 리소스를 한정해 주면 지정한 리소스만 상태를 검사한 뒤에 plan 결과를 나오는 것을 볼 수 있고 시간도 당연히 줄어든다. 물론 -target 옵션은 여러 번 사용해서 다수의 대상을 지정하는 것도 가능하다.

2017/09/10 22:27 2017/09/10 22:27