Provisioning DigitalOcean Droplet с помощью Terraform

Быстрые ссылки
- Установка Terraform
- Создание API‑токена в DigitalOcean
- Начало работы
- Создание файла ресурса Droplet
- Наполнение конфигурации Droplet
- Развёртывание Droplet
- Резюме и лучшие практики
Введение
DigitalOcean — удобный провайдер облачных виртуальных машин. Для быстрых сред разработки или лёгких продакшен‑сервисов Droplet часто доступны менее чем за минуту. Вместо ручной работы в веб‑интерфейсе удобно автоматизировать развёртывание с помощью Terraform — инструмента «infrastructure as code», который управляет ресурсами через провайдеры (в нашем случае provider “digitalocean”).
Цель этой статьи: пошагово показать создание Droplet через Terraform, дать примеры, рекомендации по безопасности и отладке.
Предварительные требования
- Аккаунт DigitalOcean
- Установленный Terraform (см. раздел ниже)
- Базовые знания командной строки (Linux/macOS/Windows PowerShell)
- Рекомендуется Git для версионирования конфигурации
Установка Terraform
Terraform доступен для Windows, Linux и macOS. Самый простой способ — скачать исполняемый файл и положить его в системный PATH.
Официальная страница загрузок:
https://www.terraform.io/downloads.html
После скачивания проверьте версию:
terraform versionЕсли вы используете пакетный менеджер (Homebrew, Chocolatey, apt), установка через него часто удобнее — команда отличается в зависимости от платформы.
Создание API‑токена в DigitalOcean
Terraform должен иметь доступ к API DigitalOcean. Для этого создайте персональный токен (API Key) с правами записи. Рекомендуем создавать отдельный токен специально для Terraform — это упрощает отзыв доступа при необходимости.
Шаги:
- Войдите в панель управления DigitalOcean.
- Откройте раздел API.
- Нажмите “Generate New Token” или аналогичную кнопку.
- Задайте имя токена и выставьте права Read + Write.
- Скопируйте токен — показать его позже нельзя.

Важно: храните токен в защищённом месте и не коммитите его в репозиторий.
Начало работы с Terraform и структура файлов
Создайте каталог для проекта и инициализируйте структуру:
mkdir digitalocean-terraform
cd digitalocean-terraformСоздайте файл digitalocean.tfvars для токена — это хорошая практика, чтобы не хранить секреты прямо в .tf файлах. Затем добавьте digitalocean.tfvars в .gitignore.
touch digitalocean.tfvarsПример содержимого digitalocean.tfvars:
api_token = "your_digitalocean_api_token_here"Пример .gitignore (минимум):
# Terraform
*.tfstate
*.tfstate.*
*.tfvars
.terraform/Обратите внимание: файл с переменными (.tfvars) по умолчанию не шифруется — для командной работы рассмотрите секретное хранилище (Vault, HashiCorp Vault, SOPS, Terraform Cloud variables).
Базовая конфигурация провайдера
Создайте файл digitalocean.tf и пропишите переменную и провайдера.
variable "api_token" {
description = "DigitalOcean API token for Terraform"
type = string
default = ""
}
provider "digitalocean" {
token = var.api_token
}Инициализируйте проект и скачайте провайдеры:
terraform initВ процессе вы увидите сообщение о загрузке провайдера и создании папки .terraform.

Конфигурирование Droplet
Ниже — пример простого Droplet с параметрами, которые дают минимальную стоимость и базовую гибкость:
- Образ: ubuntu-18-04-x64 (пример, можно брать более свежие образы)
- Регион: nyc1 (поменяйте на нужный)
- Размер: s-1vcpu-1gb (минимальный тариф на момент написания)
Пример ресурса в digitalocean.tf:
resource "digitalocean_droplet" "web" {
image = "ubuntu-18-04-x64"
name = "test-web-vm"
region = "nyc1"
size = "s-1vcpu-1gb"
monitoring = true
ipv6 = true
private_networking = true
}Пояснения к опциям:
- monitoring: включает сбор метрик (CPU, память) в консоли DigitalOcean.
- ipv6: делает Droplet доступным по IPv6.
- private_networking: даёт приватный IP (10.x.x.x) для внутренней связи между Droplet в одном VPC.
user_data и cloud-init
Для автоматической настройки VM при первом старте используйте user_data (cloud-init). Лучше хранить сложные скрипты в отдельном YAML‑файле и подключать через функцию file().
Пример inline cloud-config:
resource "digitalocean_droplet" "web" {
image = "ubuntu-18-04-x64"
name = "test-web-vm"
region = "nyc1"
size = "s-1vcpu-1gb"
monitoring = true
ipv6 = true
private_networking = true
user_data = "#cloud-config\npackage_update: true\npackage_upgrade: true\npackages:\n - nginx\nruncmd:\n - [ systemctl, enable, --now, nginx ]\n"
}Или хранить cloud-init в user-data.yml и подключать:
user_data = file("user-data.yml")Пример простого user-data.yml:
#cloud-config
package_update: true
package_upgrade: true
packages:
- htop
- nginx
runcmd:
- [ systemctl, enable, --now, nginx ]Использование файла удобнее для длинных сценариев и читабельности.
Планирование и применение изменений
Перед применением полезно посмотреть план:
terraform plan -var-file="digitalocean.tfvars"Чтобы создать ресурсы:
terraform apply -var-file="digitalocean.tfvars"Подтвердите ввод при появлении запроса или добавьте -auto-approve для непрерывных сценариев.

Управление состоянием (state)
Terraform создаёт файл terraform.tfstate, который отражает известное состояние инфраструктуры. Несколько важных практик:
- Не храните локально state при совместной работе — используйте дистанционное хранилище (Terraform Cloud, S3/Spaces с блокировкой, Google Cloud Storage).
.tfstateсодержит идентификаторы ресурсов; не удаляйте файл вручную, иначе Terraform попытается пересоздать ресурсы.- Используйте версии и политики доступа для state.
Удаление ресурсов
Чтобы удалить созданные ресурсы:
terraform destroy -var-file="digitalocean.tfvars"Проверка и критерии приёмки
Критерии приёмки для базового Droplet:
- Droplet создан и в состоянии “active” в DigitalOcean.
- SSH доступ возможен (если добавлен публичный ключ) или HTTP отвечает, если установлен nginx.
- Терраформ считает ресурсы как созданные (terraform state показывает ресурс).
.tfstateсохранён в безопасном месте (remote backend) или защищён локально.
Практики безопасности и конфиденциальности
- Никогда не коммитьте
*.tfvarsс токенами в Git. - Разделяйте токены: один токен для Terraform, другой для ручных операций.
- Ограничивайте права токена, если провайдер позволяет.
- Рассмотрите хранение секретов в безопасном хранилище (Vault, AWS Secrets Manager, GitHub Secrets и др.).
Отладка: распространённые ошибки и решения
- Ошибка аутентификации: проверьте значение
api_tokenи формат.tfvars. - Ошибка провайдера при
terraform init: удалите.terraformи повторитеterraform initили проверьте сетевой доступ. - Дублирование ресурсов: если вы удаляли
.tfstate, Terraform посчитает ресурсы отсутствующими — не удаляйте state вручную.
Рекомендации и расширения
- Используйте
ssh_keysв ресурсе для автоматического добавления публичного SSH‑ключа. Пример:
resource "digitalocean_ssh_key" "me" {
name = "my-key"
public_key = file("~/.ssh/id_rsa.pub")
}
resource "digitalocean_droplet" "web" {
# ...
ssh_keys = [digitalocean_ssh_key.me.fingerprint]
}- Для production систем разделяйте конфигурации по окружениям (dev/stage/prod) и используйте модульную структуру Terraform.
- Подумайте о бэкапе: делайте снимки (snapshots) и автоматизируйте их через отдельные ресурсы/скрипты.
Роли и чек‑листы
DevOps инженер:
- Создать отдельный API‑токен для Terraform.
- Настроить remote backend для state.
- [ ] Добавить
*.tfvarsв.gitignore. - Написать cloud‑init для установки необходимых пакетов.
Разработчик:
- [ ] Проверить, что среда разворачивается по
terraform apply. - Прогнать smoke‑тесты (HTTP/SSH).
Тестировщик:
- Подтвердить сетевую связность в нужных регионах.
- Проверить метрики мониторинга (если включены).
Быстрая методика при проблемах (runbook)
- Запустите
terraform plan -var-file="digitalocean.tfvars"— посмотрите расхождения. - Если появляется ошибка доступа — пересоздайте токен и обновите
digitalocean.tfvars. - При ошибках провайдера — выполните
terraform init -upgrade. - Для возвращения в исходное состояние используйте
terraform destroy.
Мини‑шпаргалка команд
- terraform init — инициализация проекта
- terraform plan -var-file=”digitalocean.tfvars” — просмотр плана
- terraform apply -var-file=”digitalocean.tfvars” — применение
- terraform destroy -var-file=”digitalocean.tfvars” — удаление
Решение: Когда Terraform не подходит
- Если вам нужно быстро протестировать UI‑набор настроек вручную — GUI может быть быстрее.
- Для единичных ad-hoc задач без повторного использования инфраструктуры может быть избыточным вводить IaC.
Диаграмма принятия решения (Mermaid)
flowchart TD
A[Нужна VM для теста или dev?] -->|Да| B{Использовать Terraform?}
B --> |Да| C[Создать конфигурацию и tfvars]
B --> |Нет| D[Создать через UI в DigitalOcean]
C --> E{Нужен совместный доступ?}
E --> |Да| F[Настроить remote backend для state]
E --> |Нет| G[Хранить локальный state]Краткий глоссарий
- Droplet — виртуальная машина в DigitalOcean.
- Provider — модуль Terraform для работы с конкретным API.
- State — файл, где Terraform хранит текущее состояние инфраструктуры.
Локальные замечания и совместная работа
- Для командной работы используйте отдельные рабочие пространства (workspaces) или отдельные бекенды.
- Внимательно документируйте имена ресурсов и шаблоны cloud‑init.
Резюме
- Terraform упрощает повторяемое и версионируемое развёртывание Droplet в DigitalOcean.
- Храните токены и state безопасно; используйте
.gitignoreи remote backend. - Cloud‑init через
user_dataдаёт гибкую автоматическую настройку инстанса.
Если нужно, могу подготовить готовый модуль Terraform с переменными для нескольких сред (dev/stage/prod) и пример CI/CD pipeline для автоматического развёртывания.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента