Рубрики
Uncategorized

Автоматизация автоматизации путем автоматического создания Google Cloud Projects с помощью Terraform

Этот пост предназначен для тех, кто уже использует Terraform и Google Cloud, но еще не использовал Terrafor … Tagged с DevOps, Tuperial, Googlecloud, производительность.

Автоматизация с Terraform (серия 3 частей)

Этот пост предназначен для тех, кто уже использует Terraform и Google Cloud, но еще не использовал Terraform для управления целыми проектами или средами. Но это может послужить вдохновением для тех, кто еще не использует инфраструктуру как код

Прежде чем мы перейдем к тому, о чем на самом деле представлен этот пост в блоге, позвольте мне поговорить о Terraform:

Для тех из вас, кто по -прежнему настраивает свои виртуальные машины и облачные ресурсы вручную, скорее всего, вы столкнулись с ситуациями, когда вы не помните, как вы устанавливаете, или вы столкнулись с необходимостью выполнять тот же набор повторяющихся задач.

К счастью, есть гораздо лучший способ, известный как инфраструктура как код, где вместо того, чтобы делать вещи с помощью ручной работы, используя панель управления веб-базой или интерфейс командной строки, вы записываете, какую инфраструктуру вы хотите, используя декларативный язык, и имеете Программа автоматически подходит для вас. Преимущество здесь много:

  1. Ваша конфигурация находится в коде, и его легче просмотреть, чем переключать сотни различных экранов конфигурации на веб-интерфейсе.
  2. Поскольку ваша конфигурация находится в коде, ее можно легко проверить в управлении версией, дифференцированной и сотрудничеством.
  3. Программа, применяющая вашу конфигурацию, проверит то, что вы описали в коде, и что настроено в облаке, и внесет изменения, необходимые для того, чтобы сделать два соответствия. Так что вам не нужно помнить, если вы уже что -то сделали — вы просто убедитесь, что код правильно описывает то, что нужно, и примените его.

Одна такая программа (или действительно целая экосистема), чтобы сделать это Terraform , который может управлять AWS, Google Cloud, Azure и гораздо большим. Например, синтаксис выглядит примерно так:

resource "google_compute_instance" "api" {
  name         = "api"
  machine_type = "e2-small"
  zone         = "us-central1-a"
  tags         = [google_compute_firewall.api.name]

  metadata = {
    ssh-keys = "terraform:${file(var.infra_pub)}"
  }

  boot_disk {
    initialize_params {
      image = "ubuntu-docker-certbot"
    }
  }

  network_interface {
    network = google_compute_network.default.name

    access_config {
      // Ephemeral IP
    }
  }
}


resource "google_dns_record_set" "api" {
  name = "api.${google_dns_managed_zone.platform.dns_name}"
  type = "A"
  ttl  = 300
  managed_zone = google_dns_managed_zone.platform.name
  rrdatas = [google_compute_instance.api.network_interface.0.access_config.0.nat_ip]
}

Этот маленький кусок кода приведет к небольшому экземпляру Google Compute под названием API Чтобы появиться, с настройкой брандмауэра, SSH -ключ добавлен для последующих (автоматизированных) развертываний через CI/CD и различные другие сетевые конфигурации. Важно отметить, что в то же время он добавляет публичный IP -адрес виртуальной машины в записи DNS, чтобы к нему можно было получить доступ к API.Whateveryourdomainis.com . Не нужно делать ничего из этого вручную.

Это всего лишь небольшой фрагмент автоматизации и удобства. Terraform — это здорово, и если вы все еще управляете своей инфраструктурой общественного облака вручную, попробуйте.

Однако … этот пост на самом деле не о том, как использовать Terraform. Вместо этого он учитывает определенную сложность: настройка проектов Google для использования Terraform делает несколько шагов, как мы можем автоматизировать автоматизацию?

Я собираюсь поговорить конкретно о том, чтобы сделать это в Google Cloud.

Видите ли, для того, чтобы Terraform делать свое дело, вам нужно сделать несколько вещей с вашим Google Cloud Project:

  1. Создайте учетную запись и учетные данные, чтобы у нее были разрешения, чтобы сделать то, что вам нужно для
  2. При желании создайте ведро, чтобы хранить свой файл состояния. Это необходимо для сотрудничества
  3. Включите различные API, которые необходимо включить (вы должны делать это в любом случае, когда вручную делая вещи, веб -консоль просто перенаправляет вас на страницу, которая позволяет вам включить API)

К сожалению, Terraform не может автоматизировать это, потому что до тех пор, пока вы не сделаете это, он не может получить доступ к вашей учетной записи или сохранить свою государство. Итак, вы должны сделать часть этого вручную.

Хотя это не является длительным процессом, когда организация становится немного более сложной, вы захотите начать использовать несколько проектов, чтобы сохранить ресурсы изолированными — развитие, постановка, производство, возможно, другие. Теперь вы должны повторить этот процесс несколько раз или, что еще хуже, в любое время, когда вы хотите изменить настройку на всех из них одновременно, вы должны повторить себя.

Разве не было бы здорово также автоматизировать установку вашей автоматизации?

Как оказалось, вы можете. Terraform может создавать целые облачные проекты Google. Поэтому, работая в рамках проекта родителей или администратора, Terraform может, в свою очередь, породить все другие проекты, которые вы хотите, и для каждого из них создает необходимые учетные записи, ведра и обеспечение API для рабочей области Terraform, специфичного для проекта остальные.

Делая это таким образом, вы можете стандартизировать свою автоматизацию. И есть гораздо лучший контроль за безопасностью и разрешениями. У вас даже может быть производственная среда, в которой ни у одного человека нет разрешения на доступ, если хотите (предположительно, хотя файлы журналов идут куда-нибудь), с изменениями инфраструктуры обрабатываются исключительно путем совершения инфраструктуры как файлов кода, и обработанные изменения кода обрабатываются CI/CD.

Однако вам нужно один раз настроить Terraform, но я думаю, что это приемлемо, это, вероятно, единственная установка Terraform, которая будет придерживаться вас как «мастер -контроль» на протяжении всей жизни компании. Для меня я поместил здесь все критические задачи, к которым должны иметь доступ только владельцы и очень доверенные лица компании, такие как конфигурация корневых DNS (которая содержит MX и SPF/DMARC/DKIM для электронной почты компании) и секреты хранения (например, хранилище). Вещи, которые вы не хотите, чтобы кто -то случайно (или намеренно) испортился и забрал компанию в автономном режиме.

Процесс выглядит следующим образом:

1. Настройка организации

Прежде чем что -либо начнется, нам нужно создать облачную организацию Google, которую вы можете сделать только с учетной записью G Suite или Cloud Identity. Есть некоторая информация для этого здесь

Как только вы это сделаете, вы сможете получить доступ к учетной записи организации в рамках Google Cloud Console и IAM, который специфичен для организации. Это выглядит примерно так:

Обратите внимание, как варианты боковой панели «Счетные учетные записи», «ярлыки» и «Прокси-прокси-сервер с личности». Это потому, что это смотрит на организацию, а не на проект GCP.

Как только у вас есть организация, обратите внимание на идентификатор организации (это длинное число).

2. Установка счетного счета

Проекты, созданные Terraform, должны быть привязаны к счетам выставления счетов, поэтому нам нужен тот, к которому он имеет доступ. Было бы полезно объединить это в рамках той же организации, чтобы вы могли импортировать существующий счет в организацию через «Identity & Organization», есть кнопка, которую вы можете использовать для запроса проектов и счетов с выставлением счетов от своих владельцев, чтобы перенести их в централизованное управление.

Или вы можете создать новый. После того, как вы сделаете это и получите рабочий счет для выставления счетов, обратите внимание на идентификатор счетов счетов (это длинная шестнадцатеричная строка с Dashes).

3. Вручную создайте свой административный проект

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

Также отметьте этот идентификатор проекта, вам понадобится позже

4. Создайте учетную запись обслуживания для Terraform

В IAM для административного проекта перейдите в учетные записи услуг и «Создайте учетную запись обслуживания». Эта учетная запись услуг вы предоставите разрешения, чтобы позволить ему создавать проекты в организации.

После создания перейдите в его параметры и выберите «Добавить ключ» и «Создайте новый ключ» и выберите тип JSON. Сохраните это где -нибудь на своем диске. Этот ключ очень важен, так как он предоставляет доступ ко всем разрешениям, которые вы предоставляете этой учетной записи службы.

Добавьте разрешения на этот счет услуги внутри IAM. Эта учетная запись обслуживания нуждается только в ограниченных разрешениях в этом проекте, вы можете предоставить ему разрешения «редактора», если вы ленивы и принять риски разрешений на переоборудование, в противном случае предоставят только разрешения, необходимые для достижения своей цели (если вы Только использование этого проекта для администратора, тогда он не нуждается в многих других разрешениях, помимо доступа к ведро государства).

5. Создайте ведро для хранения государства Terraform

Terraform должен где -то хранить свое государство. Он может хранить его локально, но если вы потеряете свой компьютер или эти файлы, то вы теряете состояние терраформ, что может быть потенциально неловким. Хранение государства в ведре немного лучше, а также позволяет вам легче сотрудничать в Terraform.

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

Поскольку это ведро не используется, выберите региональный тип, с единообразными правилами доступа. Если вы сохраняете свои разрешения, подстриженные, на данный момент вы можете назначить учетную запись Service Terraform, чтобы получить доступ к этому ведру. Если вместо этого вы дали разрешения на учетную запись Service «Редактор», то он будет иметь доступ к этому ведру по умолчанию.

6. Добавить учетную запись услуги Terraform в организацию IAM

В организации IAM теперь вы можете добавить учетную запись Service Terraform, созданную ранее.

И предоставьте его «пользователю биллинговой учетной записи» (поскольку он должен назначить проекты на биллинговую учетную запись) и «создатель проекта» (поскольку он, конечно, должен создавать проекты). Как только учетная запись сервиса создает проект, он автоматически становится «владельцем» в этом проекте, поэтому вам не нужно назначать больше разрешений на перекрестную организацию, чем это. Но помните: это ответственность за безопасность, потому что это означает, что у этой учетной записи услуги есть разрешения на подавление этих проектов. Если это сделало их, это может разобрать их.

Вы, вероятно, также хотите добавить себя или группы администраторов в качестве зрителя проекта, чтобы, по крайней мере, по умолчанию получите видимость в проектах, созданных Terraform (в противном случае вы найдете интересную ситуацию, где Terraform создает проект, но ни у кого нет доступа к этому.

7. Включить некоторые API

Вам нужно будет включить некоторые API, которые Terraform нуждается в доступе. Если вы не включите их, вы просто получите сообщение об ошибке, в котором говорится, чтобы вы включили их по ссылке. Чтобы сэкономить время, это те, которые вам, вероятно, понадобится для включения:

Могут быть несколько других, которые я забыл, или если они отличаются в моей среде. Вы увидите ошибку со ссылкой, чтобы включить их. Они также могут быть включены через CLI, но как использовать, который выходит за рамки этого поста.

Надеемся, что это последнее ручное редактирование учетных записей Google Cloud, которое вам когда -либо понадобится, остальные можно обработать с помощью автоматизации

8. Настройка вашей среды

Убедитесь, что у вас есть Terraform установлен и создайте новый репозиторий, где вы храните свой IAC. Убедитесь, что вы захватили эти учетные данные.

9. Написание вашего кода IAC

vars.tf

Мне нравится сохранять даже мой модульный модул Terraform, поэтому у меня есть один файл, который содержит все переменные, которые делают этот проект. Теоретически, если я запустим другую компанию, я могу повторно использовать код Terraform, но изменить переменные в этом vars.tf

variable "project" {
  description = "The name of the admin project"
  type = string
  default = ""
}

variable "region" {
  description = "Region where most things are being created"
  type = string
  default = "us-central1"
}

variable "zone" {
  description = "Zone where resources are created"
  type = string
  default = "us-central1-a"
}

variable "org_id" {
  description = "Organization ID under which all projects are created"
  type = string
  default = ""
}

variable "billing_id" {
  description = "Billing account ID to attach projects to"
  type = string
  default = ""
}

Замените значения здесь различными идентификаторами и именами, созданными в предыдущих шагах.

main.tf

Здесь я обычно держу все определения поставщика и бэкэнд. Файл содержит это:

terraform {
  backend "gcs" {
    credentials = ""
    bucket  = ""
    prefix  = "terraform/tfstate"
  }
}

provider "google" {
  credentials = ""
  project     = var.project
  region      = var.region
  zone        = var.zone
}

Замените значения здесь на местоположение идентификатора учетных данных и созданное вами имя ведра

Только с этими двумя файлами вы готовы инициализировать и попробовать Terraform. Вы можете запустить Terraform Init а затем План терраформ или даже терраформ применить (На данный момент нечего применить).

Если вы хотите, на данный момент вы можете делать такие вещи, как создание виртуальных машин, настройка записей DNS и т. Д. и т. Д. для вашей учетной записи администратора. Но мы действительно после того, как мы создаем совершенно новый проект Google, в комплекте со своими собственными учетными данными Terraform, готовыми для другого рабочего пространства Terraform, чтобы продвинуться дальше. Это последний шаг

10. Создать модуль создания проекта Google

Я собираюсь поместить это в свой собственный модуль Terraform, чтобы я мог повторно использовать ту же настройку для всех моих проектов. Они будут жить в папке под названием модули Это находится на один уровень выше терраформы Рабочее пространство

../modules/project/vars.tf

Вот переменные, которые понадобятся этому модулю. Обратите внимание, я не предоставляю значения по умолчанию, так как я ожидаю, что они будут поставляются, когда модуль загружен позже

variable "project_name" {
  description = "Pick a Human-readable name of the project"
  type = string
}

variable "project_id" {
  description = "Pick a Project ID"
  type = string
}

variable "billing_id" {
  description = "Billing ID to attach project to"
  type = string
}

variable "org_id" {
  description = "Organization ID to attach project to"
  type = string
}

variable "region" {
  description = "Pick a region most things go into"
  type = string
}

variable "bucket_name" {
  description = "Pick a name for the terraform state storage bucket"
  type = string
}

../modules/project/main.tf

Вот деловой конец всего этого поста

resource "google_project" "project" {
  name = var.project_name
  project_id = var.project_id
  billing_account = var.billing_id
  org_id = var.org_id
}

resource "google_project_service" "project" {
  project = google_project.project.project_id

  for_each = toset([
    "compute.googleapis.com",
    "cloudresourcemanager.googleapis.com",
    "iam.googleapis.com",
    "dns.googleapis.com",
  ])

  service = each.key

  disable_on_destroy = false
}

resource "google_service_account" "project_terraform" {
  # service account for project-specific terraform
  project = google_project.project.project_id
  account_id = "terraform"
  display_name = "${var.project_name} Terraform"
  description = "Terraform service account for ${var.project_name}"
}

resource "google_storage_bucket" "project_terraform" {
  # terraform state storage bucket
  project = google_project.project.project_id
  name = var.bucket_name
  location = var.region

  uniform_bucket_level_access = true
}

resource "google_storage_bucket_iam_member" "project_terraform" {
  bucket = google_storage_bucket.project_terraform.name
  role = "roles/storage.admin"
  member = "serviceAccount:${google_service_account.project_terraform.email}"
}

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

Примечание: это не полный модуль. Вам по -прежнему нужно будет создать ключ учетной записи услуги и хранить его где -то, а также предоставить этой новой учетной записи услуги соответствующие разрешения внутри этого проекта. Я не собираюсь прикрывать это здесь, но вы можете начинать с:

resource "google_service_account_key" "project_terraform" {
  service_account_id = google_service_account.project_terraform.name
}

Внимание: это создаст ключ учетной записи услуги и хранит его в государственном хранилище этого проекта Terraform. Это может или не может быть желательным. Это, безусловно, удобно — тогда вы можете просто осмотреть это значение вручную, используя Terraform Show , или с дополнительными этапами, выводите это состояние, используя вывод Вход, чтобы отобразить его на экране, local_file Чтобы сохранить файл где -то локально, или других поставщиков, чтобы отправить эти учетные данные в какое -то хранилище в секретах. Есть некоторые соображения безопасности, которые выходят за рамки этого поста. Если вы серьезно создаете это для своего бизнеса, пожалуйста, прочитайте о Последствия для безопасности хранения секретов в штате Терраформ.

project_dev.tf

С определенными файлами модуля мы теперь можем использовать этот модуль для создания среды разработки:

module "dev" {
  source = "../modules/project"

  billing_id = var.billing_id
  org_id = var.org_id
  region = var.region

  project_name = "Development"
  project_id = ""
  bucket_name = ""
}

project_prod.tf

Зачем останавливаться в одном проекте? Давайте сделаем еще один из одного и того же модуля!

module "prod" {
  source = "../modules/project"

  billing_id = var.billing_id
  org_id = var.org_id
  region = var.region

  project_name = "Production"
  project_id = ""
  bucket_name = ""
}

Как только эти файлы встают, вы можете просто Terraform Init (Необходимы в качестве новых модулей) и терраформ применить Анкет За исключением любых ошибок и необходимости внедрить любые API и оставшуюся проблему создания и загрузки этой услуги. Detrentients.json Я касался выше, Terraform должен быстро настроить ваши новые проекты со всеми битами, необходимыми для дальнейшей автоматизации!

Следующие шаги

Ваши следующие шаги: Создайте свое рабочее пространство Terraform для этих сред. Например, вы можете поддерживать еще один репозиторий IAC (другой для вашего администратора, который не нужно затрагиваться снова, если не требуются новые проекты, или настройки должны быть изменены), и в этом репозитории есть отдельное девчонка и Prod ответвляться. Вы можете настроить CI (или просто запустить его вручную) так, чтобы запуск терраформ применить В филиале Dev нацелены на проект DEV, когда работают терраформ применить В филиале Prod нацелены на проект Prod.

Делая это таким образом, позволяет вам управлять экспериментальной инфраструктурой развития, используя IAC из филиала Dev, и, когда вы готовы к производству с этой инфраструктурой, объедините изменения IAC от филиала Dev в филиал Prod и применить его оттуда.

Другие вещи, которые вы, возможно, захотите сделать:

  • Создайте общий VPC в вашем административном проекте, который позволяет ресурсам из других проектов общаться друг с другом
  • Настройте корневые DNS в проекте вашего администратора
  • Установите записи MX DKIM/DMARC/SPF в административном проекте
  • Установите DNS и сети, чтобы у вас было prod.yourdomain.com и dev.yourdomain.com
  • Установите другие ваши проекты, которые обрабатывают резервные копии или веб -сайт компании, или среда исследования/песочницы, или для постановки средств

Фотография обложки от Ant Rozetsky на Неспособный

Автоматизация с Terraform (серия 3 частей)

Оригинал: «https://dev.to/meseta/automating-your-automation-creating-google-cloud-projects-automatically-48lj»