Настройте аутентификацию Google Cloud Platform (GCP) для Terraform Cloud

Как настроить Terraform Cloud для аутентификации с помощью Google Cloud Platform (GCP)?

Сейчас моя конфигурация выглядит так:

provider "google" {
  project = "my-project-id"
  region = "europe-west3"
  zone = "europe-west3-a"
}

resource "google_storage_bucket" "my-bucket" {
  name = "my-bucket"
  location = "EUROPE-WEST3"
  force_destroy = true
  uniform_bucket_level_access = true
}

И это вызывает у меня ошибку:

Ошибка: попытка загрузить учетные данные приложения по умолчанию, поскольку ни credentials, ни access_token не были установлены в блоке поставщика. Учетные данные не загружены. Чтобы использовать свои учетные данные gcloud, запустите gcloud auth application-default login. Исходная ошибка: Google: не удалось найти учетные данные по умолчанию. См. https://developers.google.com/accounts/docs/application-default-credentials для получения дополнительной информации.


person Slava Fomin II    schedule 07.07.2021    source источник


Ответы (1)


Прежде всего, вам необходимо настроить учетную запись службы в своем проекте GCP, чтобы Terraform Cloud могла управлять ресурсами за вас. Просто сделайте следующее:

  1. Войдите в консоль GCP и переключитесь на нужный проект.
  2. Перейдите в раздел IAM и администратор → Учетные записи служб.
  3. Нажмите кнопку Создать учетную запись службы.
  4. Укажите понятное имя для своей учетной записи службы и нажмите Создать и продолжить.
  5. Укажите роль для своей учетной записи службы. В тестовых целях вы можете использовать роль Owner с максимальными разрешениями. Однако в производственной среде я настоятельно рекомендую создать отдельную роль для вашей учетной записи службы с минимально возможными разрешениями.
  6. Затем нажмите Готово, чтобы окончательно создать учетную запись службы.
  7. Теперь выберите вновь созданную учетную запись из списка и перейдите на вкладку КЛЮЧИ.
  8. Нажмите кнопку ДОБАВИТЬ КЛЮЧ и выберите вариант Создать новый ключ.
  9. Выберите формат JSON и нажмите СОЗДАТЬ.
  10. Загрузите файл ключа на свой компьютер и откройте его в своем любимом текстовом редакторе.
  11. Предоставленный ключ находится в многострочном формате JSON, однако, чтобы иметь возможность использовать его в конфигурации Terraform, он должен быть уменьшен. Вы можете использовать любой минификатор JSON, которому вы можете доверять. В противном случае вы можете использовать функцию поиска и замены вашего текстового редактора, чтобы удалить все многострочные символы. В итоге вы должны получить документ JSON в виде одной строки текста, скопируйте его.

Теперь вам нужно будет указать ключ JSON в конфигурации Terraform. Самый простой способ сделать это - поместить его прямо в конфигурацию вашего поставщика Google в свойстве credentials. Однако хранить такие конфиденциальные данные в коде - это ОЧЕНЬ ПЛОХО. Вместо этого мы бы сделали что-нибудь другое:

  1. Добавьте следующее объявление переменной в файл конфигурации Terraform:
variable "gcp_credentials" {
  type = string
  sensitive = true
  description = "Google Cloud service account credentials"
}

Это сообщит Terraform, что эта входная переменная действительно существует и может использоваться для настройки стека.

  1. Затем перейдите в консоль Terraform Cloud и переключитесь на желаемое рабочее пространство. Перейдите на вкладку Переменные.

  2. Теперь нажмите кнопку Добавить переменную и укажите следующие данные:

    • Key: gcp_credentials
    • Значение: INSERT YOUR SINGLE-LINE JSON HERE
    • Описание: Google Cloud service account credentials
    • Установите флажок Конфиденциально.
  3. Нажмите кнопку Сохранить переменную.

Наконец, обновите конфигурацию вашего провайдера, чтобы она выглядела так:

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