Провайдер Terraform

Status200 Terraform Provider

Terraform Provider для управления ресурсами Status200 через Infrastructure as Code (IaC): мониторинг, инциденты, status pages и остальные возможности платформы.

Содержание

Установка {#installation}

Terraform Registry (рекомендуется)

Terraform Registry.

terraform {
  required_providers {
    status200 = {
      source  = "status200/status200"
      version = "~> 7.0"
    }
  }
  required_version = ">= 1.0"
}

Self-hosted: pin версии

⚠️ Версия provider = версия установки Status200.

terraform {
  required_providers {
    status200 = {
      source  = "status200/status200"
      version = "= 7.0.123"
    }
  }
  required_version = ">= 1.0"
}

Где взять версию Status200

  1. Dashboard: SettingsAbout
  2. API: GET /api/status
  3. Docker: тег образа
  4. Helm: версия chart
terraform {
  required_providers {
    status200 = {
      source  = "status200/status200"
      version = "= 7.0.123"
    }
  }
}

Настройка provider {#provider-configuration}

Базовая конфигурация

provider "status200" {
  status200_url = "https://your-status200-instance.com"
  api_key       = var.status200_api_key
}

Переменные окружения

export S200_URL="https://your-status200-instance.com"
export S200_API_KEY="your-api-key-here"
provider "status200" {
}

Параметры

АргументПеременная окруженияОписаниеОбязательно
status200_urlS200_URLURL Status200Да
api_keyS200_API_KEYAPI keyДа

Быстрый старт {#quick-start}

1. API key

SettingsAPI KeysCreate API Key → имя, permissions → скопировать ключ.

2. main.tf

terraform {
  required_providers {
    status200 = {
      source  = "status200/status200"
      version = "~> 7.0"
    }
  }
}

provider "status200" {
  status200_url = "https://status200.ru"
  api_key       = var.status200_api_key
}

# Проект создаётся вручную в dashboard
variable "project_id" {
  description = "Status200 project ID"
  type        = string
}

resource "status200_monitor" "website" {
  name        = "Website Monitor"
  description = "Monitor for website uptime"
  data        = jsonencode({
    url = "https://example.com"
    interval = "5m"
    timeout = "30s"
  })
}

resource "status200_team" "platform" {
  name        = "Platform Team"
  description = "Platform engineering team"
}

3. init и apply

terraform init
terraform plan
terraform apply

Совместимость версий {#version-compatibility}

Облако

terraform {
  required_providers {
    status200 = {
      source  = "status200/status200"
      version = "~> 7.0"
    }
  }
}

Self-hosted

Status200ProviderКонфиг
7.0.x7.0.xversion = "~> 7.0.0"
7.1.x7.1.xversion = "~> 7.1.0"
7.2.x7.2.xversion = "~> 7.2.0"

Пример для 7.0.123:

terraform {
  required_providers {
    status200 = {
      source  = "status200/status200"
      version = "= 7.0.123"
    }
  }
}

Ресурсы {#available-resources}

Ядро

  • status200_team — команды

Мониторинг

  • status200_monitor — мониторы
  • status200_probe — пробы

On-call

  • status200_on_call_duty_policy — расписания on-call

Status pages

  • status200_status_page — страницы статуса

Service catalog

  • status200_service_catalog
  • status200_service
  • status200_service_dependency

Data sources

В текущей схеме provider отдельные datasources могут отсутствовать — смотрите актуальную документацию в Registry.

Примеры {#examples}

Мониторинг end-to-end

variable "status200_api_key" {
  description = "Status200 API Key"
  type        = string
  sensitive   = true
}

variable "project_id" {
  description = "Status200 project ID (создать проект в dashboard)"
  type        = string
}

variable "status200_url" {
  description = "Status200 URL"
  type        = string
  default     = "https://status200.ru"
}

terraform {
  required_providers {
    status200 = {
      source  = "status200/status200"
      version = "~> 7.0"
    }
  }
}

provider "status200" {
  status200_url = var.status200_url
  api_key       = var.status200_api_key
}

resource "status200_team" "platform" {
  name        = "Platform Team"
  description = "Platform engineering team"
}

resource "status200_monitor" "api" {
  name        = "API Health Check"
  description = "Monitor for API health endpoint"
  data        = jsonencode({
    url = "https://api.mycompany.com/health"
    method = "GET"
    interval = "1m"
    timeout = "30s"
  })
}

resource "status200_monitor" "database" {
  name       = "Database Connection"
  project_id = status200_project.production.id
  
  monitor_type = "port"
  hostname     = "db.mycompany.com"
  port         = 5432
  interval     = "2m"
  
  tags = {
    service     = "database"
    environment = "production"
    criticality = "critical"
  }
}

resource "status200_on_call_policy" "platform_oncall" {
  name       = "Platform On-Call"
  project_id = status200_project.production.id
  team_id    = status200_team.platform.id
  
  schedules {
    name      = "Business Hours"
    timezone  = "America/New_York"
    
    layers {
      name = "Primary"
      users = ["user1@mycompany.com", "user2@mycompany.com"]
      rotation_type = "weekly"
      start_time = "09:00"
      end_time = "17:00"
      days = ["monday", "tuesday", "wednesday", "thursday", "friday"]
    }
  }
}

resource "status200_alert_policy" "critical_alerts" {
  name       = "Critical System Alerts"
  project_id = status200_project.production.id
  
  conditions {
    monitor_id = status200_monitor.api.id
    threshold  = "down"
  }
  
  conditions {
    monitor_id = status200_monitor.database.id
    threshold  = "down"
  }
  
  actions {
    type = "webhook"
    url  = "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK"
  }
  
  actions {
    type           = "oncall_escalation"
    oncall_policy_id = status200_on_call_policy.platform_oncall.id
  }
}

resource "status200_status_page" "public" {
  name       = "MyCompany Status"
  project_id = status200_project.production.id
  
  domain = "status.mycompany.com"
  
  components {
    name       = "API"
    monitor_id = status200_monitor.api.id
  }
  
  components {
    name       = "Database"
    monitor_id = status200_monitor.database.id
  }
}

Self-hosted

terraform {
  required_providers {
    status200 = {
      source  = "status200/status200"
      version = "= 7.0.123"
    }
  }
  required_version = ">= 1.0"
}

provider "status200" {
  status200_url = "https://status200.mycompany.com"
  api_key       = var.status200_api_key
}

Практики {#best-practices}

1. Версии

Облако: ~> и changelog перед major.

Self-hosted: точный pin; обновлять provider вместе с апгрейдом Status200; сначала staging.

2. State

terraform {
  backend "s3" {
    bucket = "my-terraform-state"
    key    = "status200/terraform.tfstate"
    region = "us-west-2"
  }
}

3. Окружения

terraform workspace new production
terraform workspace new staging
mkdir -p environments/{staging,production}

4. Переменные

variable "environment" {
  description = "Environment name"
  type        = string
}

variable "monitors" {
  description = "List of monitors to create"
  type = list(object({
    name = string
    url  = string
    type = string
  }))
}

5. Именование

resource "status200_monitor" "website_production" {
  name = "${var.environment}-website-monitor"
}

resource "status200_alert_policy" "critical_production" {
  name = "${var.environment}-critical-alerts"
}

Миграция {#migration-guide}

С ручной настройки

  1. Аудит ресурсов в dashboard
  2. Terraform-конфиг под существующее
  3. terraform import
  4. Сверка plan
  5. Постепенный apply
terraform import status200_monitor.website monitor-id-here
terraform import status200_project.main project-id-here

Апгрейд версий

  1. Backup state
  2. Совместимость provider
  3. Обновить версию в terraform блоке
  4. Staging
  5. Production
terraform state pull > backup.tfstate
terraform init -upgrade
terraform plan
terraform apply

Поддержка и ссылки

Устранение неполадок

Version mismatch (self-hosted)

Error: API version incompatible

Совпадение версий provider и Status200.

Authentication

Error: Invalid API key

Ключ и permissions.

Resource not found

Проверить ID и существование ресурса.

Debug

export TF_LOG=DEBUG
terraform apply

Проверка

terraform version
terraform providers
terraform validate