Управление облаком Mail.ru с помощью Terraform

Michael Cherepnev
3 min readJul 28, 2020

--

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

--

--