Гид по технологиям

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

• 6 min read • DevOps • Обновлено 16 Nov 2025
Terraform: создать Droplet в DigitalOcean
Terraform: создать Droplet в DigitalOcean

Иллюстрация: DigitalOcean и 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 — это упрощает отзыв доступа при необходимости.

Шаги:

  1. Войдите в панель управления DigitalOcean.
  2. Откройте раздел API.
  3. Нажмите “Generate New Token” или аналогичную кнопку.
  4. Задайте имя токена и выставьте права Read + Write.
  5. Скопируйте токен — показать его позже нельзя.

Генерация нового персонального токена доступа в DigitalOcean

Важно: храните токен в защищённом месте и не коммитите его в репозиторий.

Начало работы с 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.

Вывод команды terraform init при установке провайдера DigitalOcean

Конфигурирование 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 для непрерывных сценариев.

Развёртывание Droplet через Terraform — пример вывода

Управление состоянием (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)

  1. Запустите terraform plan -var-file="digitalocean.tfvars" — посмотрите расхождения.
  2. Если появляется ошибка доступа — пересоздайте токен и обновите digitalocean.tfvars.
  3. При ошибках провайдера — выполните terraform init -upgrade.
  4. Для возвращения в исходное состояние используйте 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 для автоматического развёртывания.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро