# Terratag
Terratag 是個 CLI 工具,可簡化 resource tag 的方式,對於 Terraform 社群來說,他們希望**集中化**來標註 resource 而不是分別寫在每個resource內,以更方便的追蹤和管理。
:::info
補充一下,在 aws & azure ,我們會說標註是 tags 。但 gcp 因為已經有一個名為 network tag 用於連接網路防火牆的配置,故 gcp 中標註稱為 labels
以下文章統稱 tags
:::
# 功能測試:
### Terratag 可以統一把要部署的 resources **全部**一次性都加上 tags
不是每個 resource 都能被標註,但 Terratag 可以自動分辨,把可以標注的資源,加上標注。
:::danger
使用 -tags 時,如果是使用 a comma seperated list of key=value.各個kvp間不要留空白,會讀不到。
-tags="flag=vm1,author=henrylee" (O)
-tags="flag=vm1, author=henrylee" (X 不會報錯但沒辦法寫入tag)
:::
### Terratag 能不能針對 .tf內的resource進行標注?
可以使用 -filter=<resource-type> 來只讓需要的 resource 加上 tags
``` shell
terratag -verbose=true -tags="flag=vm1,author=henrylee" -filter=google_compute_instance
```
:::danger
目前看起來只能針對resource-type 來 filter tag , 無法精細到 resource-name
:::
### Terratag 針對整個 .tf 檔, 使用 Terratag 會不會override? 還是可以繼續加上去?
配合-skipTerratagFiles;-rename 等等參數測試,Terratag 可以重複呼叫,tag部分也會保留原始資料,並持續擴展下去。
#### -skipTerratagFiles
``` shell
terratag -verbose=true -tags="flag=vm1,author=henrylee" -filter=google_compute_instance
terratag -tags="author=sting,id=ps145" -filter=google_compute_instance -skipTerratagFiles=false
terratag -tags="author=paul" -filter=google_compute_instance -skipTerratagFiles=false
```
會產生main.tf.bak 和 main.terratag.tf.bak,而且.tf內容內有兩個local變數,local部分會用 terraform 的內置函數merge起來。 若 tag 的 key 值一樣,則會覆蓋成新的。
``` shell
terratag -verbose=true -tags="flag=vm1,author=henrylee"
terratag -verbose=true -tags="author=sting,id=ps145" -skipTerratagFiles=false
terratag -verbose=true -tags="author=paul" -skipTerratagFiles=false
```
#### -rename
``` shell
terratag -verbose=true -rename=false -tags="flag=vm1,author=henrylee" -filter=google_compute_instance
terratag -verbose=true -rename=false -tags="author=sting,id=ps145" -filter=google_compute_instance
```
如果是使用-rename,執行多次terratag,只會保存最新和前一次的狀態。
# step
```shell
terraform init
terratag -tags="flag=vm1,author=henrylee" -filter=google_compute_instance
terratag -skipTerratagFiles=false -tags="flag=flag1,author=henrylee" -filter=google_storage_bucket
terratag -skipTerratagFiles=false -tags="env=test" -filter="^google_storage_bucket$|^google_compute_instance$"
terratag -skipTerratagFiles=false -tags="flag=flag2" -filter=google_compute_instance
terratag -skipTerratagFiles=false -tags="reject=reject-flag" -skip=google_compute_instance
```
---
# Reference
28min 開始
https://www.youtube.com/watch?v=dMo11PzhVQI
https://www.youtube.com/watch?v=DNp6ZaaGG8w
https://github.com/env0/terratag
build structure / Resources / 解釋 resource-type & resource-name
https://learn.hashicorp.com/tutorials/terraform/aws-build?in=terraform/aws-get-started
---
其他
https://godleon.github.io/blog/DevOps/terraform-develop-production-grade-modules/
https://github.com/terraform-google-modules/terraform-google-bootstrap