У меня есть базовое понимание, но у меня всего 2 дня опыта терраформирования, отсюда и моя проблема.
У меня есть контейнер grafana с постоянными данными.
Terraform работает в другом контейнере и выполняется при развертывании. Следовательно, каждый раз, когда я хочу выполнить развертывание на существующем томе графаны, я сталкиваюсь с ошибками терраформирования «уже существует» или «управляется кем-то другим».
Я хотел бы «заменить» или «перезаписать» любой существующий, независимо от любых изменений, сделанных между ними, но -replace="<existing.resource>" не решает проблему «существующего ресурса».
Уничтожить не получается, так как я ничего не импортировал, мне еще предстоит попробовать импортировать в скелетный ресурс, уничтожить и применить, и я не хотел бы этого делать.
Что мне не хватает? Соответствует ли мой подход декларативному подходу terraform? Как я могу «напомнить» терраформу о существующих ресурсах без особых условий?
Проблема видимо в непонимании.
main.tf создает источник данных и предупреждение. Дашборды созданы с помощью графоннета, они не актуальны.
terraform {
required_providers {
grafana = {
source = "grafana/grafana"
version = "1.30.0"
}
}
}
provider "grafana" {
url = ...
auth = ...
}
resource "grafana_data_source" "influxdb" {
uid = "datasource_influxdb"
type = "influxdb"
name = "influxdb"
url = "..."
json_data_encoded = jsonencode({
defaultBucket = "..."
httpMode = "POST"
organization = "..."
timeout = 5
tlsAuth = false
tlsAuthWithCACert = false
version = "Flux"
tlsSkipVerify = true
})
secure_json_data_encoded = jsonencode({
token = "..."
})
}
resource "grafana_folder" "rule_folder" {
title = "Alerts"
uid = "rule_folder_uid"
}
resource "grafana_rule_group" "my_alert_rule" {
name = "My Rule Group"
folder_uid = grafana_folder.rule_folder.uid
interval_seconds = 240
org_id = 1
rule {
name = "Alerted CPU"
for = "2m"
condition = "B"
no_data_state = "NoData"
exec_err_state = "Alerting"
annotations = {
__dashboardUid__ = "..."
__panelId__ = 3
}
...
}
}
Entrypoint.sh применяет terraform, используя официальный образ terraform (в котором, как ни странно, отсутствует фактическая установка terraform):
#!/bin/bash
wget https://releases.hashicorp.com/terraform/1.3.4/terraform_1.3.4_linux_amd64.zip
unzip terraform_1.3.4_linux_amd64.zip
mv terraform /usr/bin/terraform
terraform init
terraform apply -auto-approve
terraform apply -auto-approve -replace = "grafana_data_source.influxdb" #problem: terraform does not control this resource
tail -f /dev/null
Лог-канал выглядит следующим образом:
Plan: 3 to add, 0 to change, 0 to destroy.
grafana_folder.rule_folder: Creating...
grafana_data_source.influxdb: Creating...
│ Error: status: 409, body: {"message":"data source with the same name already exists","traceID":""}
│ with grafana_data_source.influxdb,
│ on main.tf line 15, in resource "grafana_data_source" "influxdb":
│ 15: resource "grafana_data_source" "influxdb" {
│ Error: status: 412, body: {"message":"the folder has been changed by someone else","status":"version-mismatch"}
│ with grafana_folder.rule_folder,
│ on main.tf line 36, in resource "grafana_folder" "rule_folder":
│ 36: resource "grafana_folder" "rule_folder" {
Я добавил код для команд main.tf и bash.
Значит, проблема в уже существующем ресурсе? Если он был создан вне terraform, вы можете импортировать его в свой файл состояния.
Я мог понять; недостающая ссылка понимала идентификатор нужного ресурса: Это было полезно: stackoverflow.com/questions/65678433/…
Ответом было добавление явного импорта. Остерегайтесь публиковать правильный идентификатор: terraform импортирует существующий ресурс AWS в модуль
В моем случае
terraform import grafana_data_source.influxdb datasource_influxdb
terraform import grafana_folder.rule_folder rule_folder_uid
Было бы здорово увидеть какой-нибудь код, поэтому, пожалуйста, добавьте его к вопросу.