Рубрики
Uncategorized

Инфраструктура KickStarting для приложений Django с террафом

При создании приложений Django для использования резцов Cookie As CookieTutter у вас будет … Теги с Джанго, Террафом, DevOps, RDS.

При создании приложений Django или использование Costenectiters в качестве кулинарного кулинария Django у вас по умолчанию ряд зависимостей, которые будут необходимы для создания ведра S3, баз данных Postgres и домену MailGun. Кроме того, вы, скорее всего, хотите добавить базовый мониторинг, DNS-сервис, консоль поиска Google, Google Analytics и т. Д.

Мы пройдем все эти услуги и настроив все ресурсы, декларивно (инфраструктуру как код) с террафом. Это будет легко повторять для любого нового приложения Django, которое необходимо развернуть. Каждый сервис будет использовать бесплатный план, вся эта настройка стоит 0 $ для запуска ежемесячно.

DNS с CloudFlare

CloudFlare предоставляет CDN, DNS и различные другие услуги бесплатно. CloudFlare — это мой сервис To-Go при необходимости DNS-сервисов. Добавление записи CloudFlare с террафом по коду довольно просто. Добавьте дополнительные ключи API для провайдера в качестве переменных среды:

export CLOUDFLARE_EMAIL="example@gmail.com"
export CLOUDFLARE_TOKEN="my-api-token"

Или вы можете определить их как переменные в провайдере, но я бы избегаю его не толкать конфиденциальные секреты в Git.

Теперь вы можете добавить провайдер:

provider "cloudflare" {}

И наконец добавьте ресурс Recreflare Record, чтобы мы могли получить доступ к вашему приложению по доменному имени:

resource "cloudflare_record" "hodovi_cc" {
  domain  = "hodovi.cc"
  name    = "hodovi.cc"
  value   = "your-ip"
  type    = "A"
  ttl     = 1
  proxied = true
}

CloudFlare теперь будет служить DNS и CDN, кэшируя ваш статический контент. По умолчанию я рекомендую по умолчанию добавить два правила по умолчанию, гибкие SSL (если вы не настроили полный SSL с помощью NetSensrypt) и автоматическим перенаправлением с HTTP в HTTPS, обеспечивающие, чтобы любое соединение всегда использует HTTPS. Оба этого могут быть легко настроены с террафом.

Гибкий SSL

Требуемый ресурс террафора:

resource "cloudflare_page_rule" "hodovi_cc_flexible_ssl" {
  zone   = "hodovi_cc"
  target = "https://hodovi_cc/*"
  status = "active"

  actions {
    ssl = flexible
  }
}

Всегда используйте HTTPS.

Требуемый ресурс террафора:

resource "cloudflare_page_rule" "hodovi_cc_always_use_https" {
  zone   = hodovi_cc
  target = "http://hodovi_cc/*"
  status = "active"

  actions {
    always_use_https = true
  }
}

CloudFlare позволяет только 3 правила при использовании свободного плана. По умолчанию вы можете установить, что весь ваш сайт имеет гибкий SSL (возможен только через пользовательский интерфейс не через террафору), а затем вам не нужно гибкое правило SSL, которое дает вам пространство для 2 дополнительных правил.

Postgres db.

Для базы данных Postgres мы будем использовать AWS Database Service RDS. AWS предлагает до 750 часов бесплатных экземпляров T2.micro с 20 ГБ хранилищ в месяц. Если вы запускаете один экземпляр, то 750 часов достаточно на целый месяц безотказной работы. Экземпляр T2.Micro должен быть в порядке для приложений Django, которые не являются данными тяжелыми. Эта установка также включает в себя ежедневные резервные копии. Обратите внимание, что эта настройка немного сложнее, требующая VPC для экземпляра RDS. Мы используем Модуль террафора для экземпляра RDS. Чтобы понять параметры, которые вам придется посмотреть в модуль, так как тема слишком велика, чтобы прикрыть в этом посте.

Примечание. Эта настройка создает базу данных в публичной подсети и делает база данных общедоступной доступностью. Я запускаю свои приложения Django в кластере GKE, поэтому они не делятся VPCS, и база данных должна быть общедоступна. Эта настройка также не имеет отработки, это один экземпляр в одном AZ. Хотя, если вы хотите добавить экземпляры в несколько зон доступности, которые должны быть достижены с этой настройкой.

module "rds_vpc" {
  source = "terraform-aws-modules/vpc/aws"

  name = "rds"
  cidr = "10.0.0.0/16"

  azs             = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]

  enable_dns_hostnames = true

  tags = {
    Terraform   = "true"
    Environment = "${var.environment}"
  }
}

resource "aws_security_group" "rds" {
  name        = "allow_rds"
  description = "Allow RDS inbound traffic"
  vpc_id      = "${module.rds_vpc.vpc_id}"

  ingress {
    from_port = 5432
    to_port   = 5432
    protocol  = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name      = "Allow access to the RDS instance"
    Terraform = true
  }
}

module "hodovi_rds" {
  source  = "terraform-aws-modules/rds/aws"
  version = "~> 2.0"

  identifier                = "hodovidb"
  parameter_group_name      = "default.postgres11"
  create_db_parameter_group = false
  create_db_option_group    = false

  subnet_ids = "${module.rds_vpc.public_subnets}"

  engine            = "postgres"
  engine_version    = "11.4"
  instance_class    = "db.t2.micro"
  allocated_storage = 20

  name     = "hodovidb"
  username = "postgres"
  password = "${var.hodovi_rds_password}" # Set in terraform secret vars
  port     = "5432"

  vpc_security_group_ids = ["${aws_security_group.rds.id}"]

  maintenance_window = "Mon:00:00-Mon:03:00"
  backup_window      = "03:00-06:00"

  # Publicly accessible
  publicly_accessible = true

  tags = {
    Owner       = "hodovi"
    Environment = "${var.environment}"
    Terraform   = true
  }

  # Database Deletion Protection
  deletion_protection = true
}

Django Storages S3 Ведро

Обычный способ обрабатывать статические и медиафайлы — хранить их в ведре S3. CookieCutter Django предлагает как ведра S3 и решение Google Cloud. Поскольку я не так знаком с решением GCP, я пройду через настройку ведра S3.

Давайте сначала просто добавьте провайдер AWS Terraform.

provider "aws" {
  region  = "your-aws-region"
}

Добавьте свои учетные данные API.

export AWS_ACCESS_KEY_ID="my-access-key"
export AWS_SECRET_ACCESS_KEY="my-secret-key"

IAM пользователь

Сначала мы создадим пользователь IAM, который будет использоваться для доступа к статическим файлам. Мы назовем это Deployer, так как я использую свои учетные данные для доступа к AWS API и храните статические файлы в ведро S3.

resource "aws_iam_user" "deployer" {
  name = "Deployer"

  tags = {
    description = "Deploy and access AWS resources"
  }
}

AWS IAM Политический документ

Настройка политического документа IAM, который дает полный доступ к пользователю, определенному выше. Мы также дадим доступ к чтению к статическим файлам для всех.

data "aws_iam_policy_document" "hodovi_cc" {
  statement {
    sid = "PublicReadForGetBucketObjects"

    actions = [
      "s3:GetObject",
    ]

    resources = [
      "arn:aws:s3:::hodovi.cc/*",
    ]

    principals {
      type        = "AWS"
      identifiers = ["*"]
    }
  }

  statement {
    actions = [
      "s3:*",
    ]

    resources = [
      "arn:aws:s3:::hodovi.cc",
      "arn:aws:s3:::hodovi.cc/*",
    ]

    principals {
      type        = "AWS"
      identifiers = [aws_iam_user.deployer.arn]
    }
  }
}

S3 Bucket

Создайте ведро S3 и обратитесь к создаваемой ранее политике. Прикрепите любые теги, которые вы хотели бы.

resource "aws_s3_bucket" "hodovi_cc" {
  bucket = "hodovi.cc"
  policy = "${data.aws_iam_policy_document.hodovi_cc.json}"

  tags = {
    Name        = "hodovi.cc"
    Environment = "${var.environment}"
  }
}

Рост

Если вы используете E.g Wagtail И нуждается в пересеченном происхождении доступ к вашему ведрю S3, просто добавьте раздел CORS_RULE.

resource "aws_s3_bucket" "hodovi_cc" {
  bucket = "hodovi.cc"
  policy = "${data.aws_iam_policy_document.hodovi_cc.json}"

  tags = {
    Name        = "hodovi.cc"
    Environment = "${var.environment}"
  }
  cors_rule {
    allowed_headers = ["Authorization"]
    allowed_methods = ["GET"]
    allowed_origins = ["https://hodovi.cc"]
    max_age_seconds = 3000
  }
}

Mailgun.

Cookiecutter Django использует Anymail с электронной почтой MailGun, и это простой способ добавить функцию «Свяжитесь со мной» в ваше приложение. Это бесплатно до 10000 писем в месяц Отказ Я создал Модуль террафора Это легко устанавливает это для вас.

Сначала нам придется добавить поставщика Mailgun. Скачать . Поставщик Terraform MailGunv3 Binary .

Затем обновите свой ~/.terraformrc, чтобы обратиться к бинарному двоину:

providers {
  mailgunv3 = "/home/example/downloads/terraform-provider-mailgunv3"
}

Добавьте провайдер к вашему Provider.tf. Вы можете добавить свой ключ API здесь Но я использую переменные ENV, чтобы избежать добавления чувствительных ключей в Git. Экспортируйте свой ключ API:

export MAILGUN_API_KEY='my-api-key'

Если вы из Европы вы можете использовать MailGuns EU API, если не просто не добавляйте поля Base_URL.

provider "mailgunv3" {
  base_url = "https://api.eu.mailgun.net/v3"
}

Теперь вы можете использовать модуль, который я создал.

module "hodovi_cc_mailgun_cloudflare" {
  source = "github.com/adinhodovic/terraform-mailgun-cloudflare"

  smtp_password   = var.hodovi_mailgun_password # Set in tf secret vars
  cloudflare_zone = "hodovi.cc"
  mailgun_domain  = "mg.hodovi.cc"
  spam_action     = "tag"
}

Мониторинг сервера безотказной работы со статусом

Вы, скорее всего, захотите отслеживать время безотказной работы приложения, и есть Несколько поставщиков услуг для мониторинга времени безотказной работы. Для этой установки мы будем использовать Состояние клетки Из-за их свободного плана, который Должен работать нормально для вашего приложения Django.

Свободный план предоставляет проверки обновления каждые 5 минут, для более частой скорости проверки вам придется посмотреть платные функции.

Как обычно, добавьте провайдер к своим провайдерам .TF

provider "statuscake" {
  username = "my-user-name"
}

Экспортируйте свой ключ API:

export STATUSCAKE_APIKEY="my-api-key"

Добавьте свой статус тест на торт:

# Contact group 158719 = DevOps Team

resource "statuscake_test" "https_monitoring_hodovi_cc" {
  check_rate    = 300
  contact_group = ["my-contact-group-id"]
  test_type     = "HTTP"
  user_agent    = "Status Cake"
  trigger_rate  = "0"
  confirmations = "2"
  website_name  = "hodovi.cc"
  website_url   = "https://hodovi.cc"
}

Вам придется добавить Контактная группа вручную Как террафору не предоставляет ресурс. Тогда вам придется заменить контакт Идентификатор группы выше с тем, который вы создали.

Интеграция Slack Alerting.

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

Консоль поиска Google

Затем мы добавим свой домен в консоль поиска Google, которая поможет вам оптимизировать видимость сайтов и помочь мониторинг данных результатов поиска для вашего сайта. Перейти к Поисковая система Google и выберите, чтобы добавить свой домен. Вы получите код подтверждения сайта, который должен быть добавлен в виде записи TXT.

Я создал Модуль террафора который просто добавляет проверку сайта в качестве записи TXT к вашему поставщику DNS. Пример ниже использует CloudFlare в качестве службы DNS. Модуль поддерживает AWS Route53 также. Если вы не используете Terraporm, вы можете установить это вручную через ваш DNS-сервис.

Модуль использует Provider CloudFlare для добавления записи TXT

module "hodovi_cc_search_console" {
  source = "github.com/adinhodovic/terraform-txt-record"

  cloudflare_zones = [
    {
      "zone" : "hodovi.cc",
      "value" : "google-site-verification=my-site-verification"
    }
  ]
}

Гугл Аналитика

Мы будем использовать Django-Analytical, чтобы добавить отслеживание Google Analytics. Установите и добавьте Django-Analytical ваши требования и добавьте «Аналитический» к вашим установленным приложениям.

Примечание: это просто просто код Django.

Добавьте переменную

GOOGLE_ANALYTICS_PROPERTY_ID = env("GOOGLE_ANALYTICS_PROPERTY_ID")

на ваш конфиг. Теперь, когда вы развертываете добавьте идентификатор свойства в качестве переменной среды. Наконец, добавьте необходимые теги на ваш базовый шаблон:

{% load analytical %}





  {% analytical_head_top %}
  ... your content
  {% analytical_head_bottom %}



  {% analytical_body_top %}
  ... your content
  {% analytical_body_bottom %}



Секреты

Секрет Mailgun Secret и RDS не хранятся в коде, вы можете хранить их в файле Secret.tfvars.

hodovi_rds_password     = "my-password"
hodovi_mailgun_password = "my-password"

Сейчас когда используешь

terraform apply

Вы укажете файл Secret vars:

tfaa -var-file=secret.tfvars

TFAA является псевдоним для Terraform Apply Auto-Approv, взятый из Террафор-псевдоним Отказ

Выходы

Наконец, мы создадим файл выходов Terraform, чтобы собрать все конечные точки ресурсов, которые мы создали.

output "hodovi_rds_endpoint" {
  value = module.hodovi_rds.this_db_instance_endpoint
}

output "hodovi_s3_website_endpoint" {
  value = aws_s3_bucket.hodovi_cc.id
}

Резюме

К настоящему времени у вас должна быть инфраструктура в качестве кода для следующего:

  • CloudFlare.
    • CDN.
    • Днс
    • Гибкий SSL
    • Всегда HTTPS.
  • AWS S3 Ведро для статического хранения
  • AWS RDS База данных
  • WPTTION HELTERCHECK со статусцентом
    • Слабые оповещения
    • Оповещения по электронной почте
  • Домен mailgun.
  • Гугл Аналитика
  • Консоль поиска Google

Ежемесячная стоимость всех этих услуг должна быть 0 $, если вы не превышаете пороговые значения для каждой службы. Это основная настройка для всех услуг, очевидно, если ваша заявка имеет высокие требования, вам придется масштабировать услуги.

Мы могли бы настроить экземпляр EC2, который также бесплатный (самый низкий уровень до 750 часов в месяц), но я запускаю кластер Kubernetes, где развернуты все мои приложения. И я бы предположим, что эта часть выяснила уже с различными облачными поставщиками и различными настройками.

Оригинал: «https://dev.to/adinhodovic/kickstarting-infrastructure-for-django-applications-with-terraform-13f5»