---
# System prepended metadata

title: Terratag

---

# 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" （Ｏ）
-tags="flag=vm1, author=henrylee" （Ｘ 不會報錯但沒辦法寫入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

