Ответ
На последнем проекте мы использовали гибридный подход к хранению, разделяя данные по назначению и требованиям к доступности:
1. State-файлы инфраструктуры (Terraform): Хранились в AWS S3 с включённым versioning и шифрованием SSE-KMS. Для предотвращения конфликтов использовалась блокировка через DynamoDB.
# backend.tf
terraform {
backend "s3" {
bucket = "company-infra-state-prod"
key = "network/terraform.tfstate"
region = "eu-central-1"
dynamodb_table = "terraform-state-locks"
encrypt = true
kms_key_id = "alias/terraform-state-key"
}
}
2. Артефакты приложений:
- Docker образы: AWS ECR (частные репозитории) с lifecycle-правилами для удаления старых тегов.
- Бинарные сборки (Java .jar, Go binaries): Artifactory (self-hosted) с retention policy в 30 дней для snapshot-версий.
3. Конфигурация и секреты:
- Динамическая конфигурация: HashiCorp Consul для service discovery и конфигов, обновляемых без перезапуска.
- Секреты (пароли, токены): HashiCorp Vault с динамическим получением creds для БД через lease mechanism.
- Параметры окружения: AWS Systems Manager Parameter Store для строк конфигурации, доступных через IAM-роли EC2.
4. Логи и метрики:
- Centralized Logging: Amazon OpenSearch (ранее Elasticsearch) с ingestion через Fluent Bit.
- Метрики: Prometheus (self-hosted на k8s) с долгосрочным хранением в Thanos на S3.
Такое разделение позволило нам соблюдать принцип Immutable Infrastructure и обеспечило надёжный rollback через версионирование state-файлов и артефактов.