
Я начинаю новый проект по терраформированию, следуя официальному руководству:
Мне удалось запустить его. (Я запускаю его как часть задачи сборки Google Cloud, запускаемой при фиксации)
Однако если я изменю что-то в ресурсе (например, заменю значение по умолчанию «gke_num_nodes» с 2 на 1), то при terraform apply
повторном запуске я получу следующее:
Plan: 4 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ kubernetes_cluster_host = (known after apply)
+ kubernetes_cluster_name = "workspace-auto-gke"
+ project_id = "workspace-auto"
+ region = "europe-west4"
google_compute_network.vpc: Creating...
╷
│ Error: Error creating Network: googleapi: Error 409: The resource 'projects/workspace-auto/global/networks/workspace-auto-vpc' already exists, alreadyExists
│
│ with google_compute_network.vpc,
│ on vpc.tf line 15, in resource "google_compute_network" "vpc":
│ 15: resource "google_compute_network" "vpc" {
│
╵
Есть ли способ сделать так, чтобы не приходилось пытаться воссоздать существующие нетронутые ресурсы?
Мой cloudbuild.json
вариант следующий:
{
"steps": [
{
"name": "hashicorp/terraform",
"entrypoint": "/bin/sh",
"args": [
"./cloudbuild/prepare-terraform.sh"
]
}
],
"logsBucket": "gs://my-bucket/logdir",
"serviceAccount": "projects/my-proj/serviceAccounts/[email protected]"
}
с prepare-terraform.sh
простотой
terraform init
terraform plan
terraform apply -auto-approve
решение1
Если вы используете Terraform для создания ресурсов, сделайте следующее:НЕТизменять их вне Terraform.
Если вы измените что-либо вручную, Terraform попытается вернуть это обратно в то состояние, в котором это объявлено в HCL и в котором Terraform это сохранил.
Это называетсядекларативный. Вы пытаетесь сделать Terraform динамичным, что изначально исключает возможность его использования.
решение2
Состояние terraform должно храниться там, где оно доступно всем сборкам. Например, в облачном контейнере Google, как показано здесь:https://www.terraform.io/docs/language/settings/backends/gcs.html