Управление облаком Mail.ru с помощью Terraform
Terraform является удобным средством для управление облачными ресурсами. Ниже приведу пример настройки проекта для управления ресурсами в облаке Mail.Ru Cloud Solutions (далее MCS)
Openstack CLI
Облако MCS построено на основе Openstack, поэтому для управления им необходимо установить Openstack CLI, используя инструкцию для вашей операционной системы, например:
$ pip install python-openstackclient
Далее нужно скачать OpenStack RC file v3 из личного кабинета вашего проекта (например, my-openrc.sh)
Активируем профиль и вводим пароль от учетной записи MCS:
$ source ./my-openrc.sh
После чего можем проверить работу Openstack CLI:
$ openstack flavor list
Terraform
Установите terraform используя инструкцию для вашей операционной, для MacOS, например, нужно выполнить команду:
$ brew install terraform
Скачайте файл провайдера из настроек своего проекта MCS.
При работе с terraform может возникать ошибка:
Error: Error creating OpenStack compute client: You must provide exactly one of DomainID or DomainName to authenticate by Username
Чтобы избавиться от этой ошибки в настройках провайдера вместо
user_domain_name = “users”
нужно записать
user_domain_id = “users”
Установка и настройка AWS CLI для работы с MCS Cloud Storage
Установите AWS CLI используя инструкцию для вашей операционной, для MacOS, например, нужно выполнить команду:
$ brew install awscli
Создайте аккаунт в Cloud Storage своего проекта MCS и скопируйте отуда Access Key ID, Secret Key
Создайте файл с настройками авторизации для AWS CLI ~/.aws/credentials
, куда впишите скопированные значения:
[mcs]
aws_access_key_id = …
aws_secret_access_key = …
Проверьте работу AWS CLI с MCS Cloud Storage:
$ export AWS_PROFILE=mcs
$ aws s3 ls — endpoint-url https://hb.bizmrg.com/
Хранение состояния terraform в MCS Cloud Storage
Хорошей практикой в работе с terraform является хранени состояния во внешнем хранилище, работая с MSC логичным вариантов выглядит использование S3 совместимого Cloud Storage.
Для этого в terraform проекте необходимо добавить:
# Store Terraform state in S3
terraform {
backend "s3" {
bucket = "terraform-state"
region = "us-east-1" # any valid AWS region
key = "dev/my-project.tfstate"
endpoint = "https://hb.bizmrg.com/"
profile = "mcs" # profile in ~/.aws/credentials
skip_credentials_validation = true # https://github.com/hashicorp/terraform/issues/19733
}
}
Важным параметром является skip_credentials_validation = true
, если его не добавить, то terraform будет обращаться за авторизацией в AWS и выдавать ошибку:
Error: error using credentials to get account ID: error calling sts:GetCallerIdentity: InvalidClientTokenId: The security token included in the request is invalid.
status code: 403, request id: 69c7b3ef-6f3d-4db8-be89-fd3e2cbf181d
Хранение чувствительных данных в проекте terraform
Вы навреняка будете использовать систему контроля версий для хранения кода terraform, но хранить логины-пароли там не стоит.
Рассмотрим настройку проекта с использовнием версионирования кода в git.
Создайте в проекте файл .gitignore для исключения из git следующих путей:
Создайте файл terraform.tfvars в корне проекта, где храните все логины-пароли и прочую чувствительную информацию, например:
Создайте файл variables.tf в корне проекта, где заводите все переменные с теми же именами, но без значений:
В файле main.tf удобно хранить настройки провайдера и бэкенда, где как раз нужно использовать секретные переменные:
Выполните terraform init
для инициальзации проекта. В бакете terraform-state
MCS Cloud Storage будет создан файл dev/my-project.tfstate
Пример создания виртуальной машины
Для примера создайте файл compute.tf:
Посмотрите на план выполнения (terraform plan
) и запустите выполнение (terraform apply
). В консоль будет напечатать IP адрес новой виртуальной машины.
P.S.
Не забывайте форматировать код перед сохранением в git:
terraform fmt