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 вы используете: чуть позже вам понадобятся оба эти фрагмента информации.