Terraform: инфраструктура на уровне кода | страница 65



Если вы используете Terraform в связке с AWS, лучшим выбором в качестве удаленного хранилища будет S3, управляемый сервис хранения файлов от Amazon. Этому есть несколько причин.

• Это управляемый сервис, поэтому для его использования не нужно развертывать и обслуживать дополнительную инфраструктуру.

• Он рассчитан на 99,999999999%-ную устойчивость и 99,99%-ную доступность. Это означает, что вам не стоит сильно волноваться о потере данных и перебоях в работе34.

• Он поддерживает шифрование, что снижает риск хранения чувствительных данных в файлах состояния. Хотя это лишь частичное решение, так как любой член вашей команды с доступом к бакету S3 сможет просматривать эти файлы в открытом виде, но так данные будут шифроваться при сохранении (Amazon S3 поддерживает шифрование на серверной стороне с помощью AES-256) и передаче (Terraform использует SSL для чтения и записи данных в Amazon S3).

• Он поддерживает блокирование с помощью DynamoDB (подробнее об этом  —чуть позже).

• Он поддерживает управление версиями, поэтому вы сможете хранить каждую ревизию своего состояния и в случае возникновения проблем откатываться на более старую версию.

• Он недорогой, поэтому большинство сценариев применения Terraform легко вписываются в бесплатный тарифный план35.

Чтобы включить удаленное хранение состояния в Amazon S3, для начала нужно подготовить бакет S3. Создайте файл main.tf в новой папке (это не должна быть папка, в которой вы храните конфигурацию из главы 2) и вверху укажите AWS в качестве провайдера:

provider "aws" {

  region = "us-east-2"

}

Затем создайте бакет S3, используя ресурс aws_s3_bucket:

resource "aws_s3_bucket" "terraform_state" {

  bucket = "terraform-up-and-running-state"

  # Предотвращаем случайное удаление этого бакета S3

  lifecycle {

    prevent_destroy = true

  }

  # Включаем управление версиями, чтобы вы могли просматривать

  # всю историю ваших файлов состояния

  versioning {

    enabled = true

  }

  # Включаем шифрование по умолчанию на стороне сервера

  server_side_encryption_configuration {

    rule {

      apply_server_side_encryption_by_default {

        sse_algorithm = "AES256"

      }

    }

  }

}

Этот код устанавливает четыре аргумента.

•bucket. Это имя бакета S3. Имейте в виду, что имена бакетов должны быть уникальными на глобальном уровне среди всех клиентов AWS. Поэтому вместо "terraform-up-and-running-state" вы должны подобрать свое собственное ­название (так как бакет с этим именем я уже создал36). Запомните его и обратите внимание на то, какой регион AWS вы используете: чуть позже вам понадобятся оба эти фрагмента информации.