Прежде всего, вам необходимо настроить учетную запись службы в своем проекте GCP, чтобы Terraform Cloud могла управлять ресурсами за вас. Просто сделайте следующее:
- Войдите в консоль GCP и переключитесь на нужный проект.
- Перейдите в раздел IAM и администратор → Учетные записи служб.
- Нажмите кнопку Создать учетную запись службы.
- Укажите понятное имя для своей учетной записи службы и нажмите Создать и продолжить.
- Укажите роль для своей учетной записи службы. В тестовых целях вы можете использовать роль
Owner
с максимальными разрешениями. Однако в производственной среде я настоятельно рекомендую создать отдельную роль для вашей учетной записи службы с минимально возможными разрешениями.
- Затем нажмите Готово, чтобы окончательно создать учетную запись службы.
- Теперь выберите вновь созданную учетную запись из списка и перейдите на вкладку КЛЮЧИ.
- Нажмите кнопку ДОБАВИТЬ КЛЮЧ и выберите вариант Создать новый ключ.
- Выберите формат JSON и нажмите СОЗДАТЬ.
- Загрузите файл ключа на свой компьютер и откройте его в своем любимом текстовом редакторе.
- Предоставленный ключ находится в многострочном формате JSON, однако, чтобы иметь возможность использовать его в конфигурации Terraform, он должен быть уменьшен. Вы можете использовать любой минификатор JSON, которому вы можете доверять. В противном случае вы можете использовать функцию поиска и замены вашего текстового редактора, чтобы удалить все многострочные символы. В итоге вы должны получить документ JSON в виде одной строки текста, скопируйте его.
Теперь вам нужно будет указать ключ JSON в конфигурации Terraform. Самый простой способ сделать это - поместить его прямо в конфигурацию вашего поставщика Google в свойстве credentials
. Однако хранить такие конфиденциальные данные в коде - это ОЧЕНЬ ПЛОХО. Вместо этого мы бы сделали что-нибудь другое:
- Добавьте следующее объявление переменной в файл конфигурации Terraform:
variable "gcp_credentials" {
type = string
sensitive = true
description = "Google Cloud service account credentials"
}
Это сообщит Terraform, что эта входная переменная действительно существует и может использоваться для настройки стека.
Затем перейдите в консоль Terraform Cloud и переключитесь на желаемое рабочее пространство. Перейдите на вкладку Переменные.
Теперь нажмите кнопку Добавить переменную и укажите следующие данные:
- Key:
gcp_credentials
- Значение:
INSERT YOUR SINGLE-LINE JSON HERE
- Описание:
Google Cloud service account credentials
- Установите флажок Конфиденциально.
Нажмите кнопку Сохранить переменную.
Наконец, обновите конфигурацию вашего провайдера, чтобы она выглядела так:
provider "google" {
project = "my-project-id"
credentials = var.gcp_credentials
region = "europe-west3"
zone = "europe-west3-a"
}
Используя этот подход, ваш секретный ключ JSON будет надежно храниться в Terraform Cloud без возможности для кого-либо прочитать его напрямую (благодаря чувствительной опции), а ключ будет предоставлен поставщику Google во время выполнения с помощью ввода Terraform. Переменная.
Однако имейте в виду, что это небезопасный способ хранения секретов, и есть ситуация, когда содержимое переменной может быть прочитано стороной, имеющей возможность обновлять конфигурацию и читать файлы журнала.
Я также рекомендовал бы переместить другую информацию, такую как регион / зона и идентификатор проекта, из файла конфигурации. Это сделает ваш стек более пригодным для повторного использования и вашу конфигурацию чище (за счет удаления дублирования).
Вот последний пример:
#===========#
# VARIABLES #
#===========#
variable "gcp_project_id" {
type = string
description = "Google Cloud project ID"
}
variable "gcp_credentials" {
type = string
sensitive = true
description = "Google Cloud service account credentials"
}
variable "gcp_region" {
type = string
description = "Google Cloud region"
}
variable "gcp_zone" {
type = string
description = "Google Cloud zone"
}
#===========#
# PROVIDERS #
#===========#
provider "google" {
project = var.gcp_project_id
credentials = var.gcp_credentials
region = var.gcp_region
zone = var.gcp_zone
}
#===========#
# RESOURCES #
#===========#
resource "google_storage_bucket" "my-bucket" {
name = "my-bucket"
location = var.gcp_region
force_destroy = true
uniform_bucket_level_access = true
}
person
Slava Fomin II
schedule
07.07.2021