Как развертывать и повторно развертывать приложения с помощью Terraform?

Я изучаю Terraform и его использование для настройки среды AWS. Пока у меня есть сценарии для настройки VPC с 3 общедоступными подсетями, 3 частными подсетями, интернет-шлюзом и 3 шлюзами Nat. Однако я не понимаю, как можно было бы развернуть и повторно развернуть приложения в частных подсетях?

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

До сих пор я читал об Opsworks и Code Deploy, поэтому нужно ли мне использовать Terraform для настройки этих ресурсов, а затем запускать сценарии развертывания для отправки артефактов на S3, которые затем повторно развертываются?

3 ответа

Для развертывания / повторного развертывания вы можете использовать другое решение от Hashicorp: Nomad. Он использует тот же язык, что и Terraform, для программирования задач, которые вы можете запускать в кластере. Задачи могут быть чем угодно, например: повторно развернуть все экземпляры моего веб-приложения.

Я использую CodeDeploy с Terraform/Chef. Настройка, которую я использую, выглядит примерно так:

1) Вручную настройте роли CodeDeploy IAM заранее.

2) Настройте приложение / группу CodeDeploy заранее.

3) Настройте профиль экземпляра с помощью Terraform, например:

resource "aws_iam_instance_profile" "code_deploy" {
    name = "CodeDeploy"
    roles = ["${var.codedeploy_instance_role}"]
}

4) Используйте профиль экземпляра и правильные теги (которые соответствуют вашему приложению CodeDeploy) при создании экземпляра, например так:

iam_instance_profile = "${aws_iam_instance_profile.code_deploy.id}"
tags {
   CD = "${var.tag_cd}"
}

5) Используйте Chef (или каков ваш поставщик) для настройки CodeDeploy на экземпляре.

Тогда вы можете использовать CodeDeploy как обычно.

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

Основываясь на решении от Питера, я также устанавливаю роли CodeDeploy IAM и приложение / группу CodeDeploy от Terraform. Вот что у меня есть:

resource "aws_iam_role" "codedeploy_role_name" {
  name = "codedeploy_role_name"

  assume_role_policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": [
            "codedeploy.amazonaws.com",
            "ec2.amazonaws.com"
          ]
        },
        "Action": "sts:AssumeRole"
      }
    ]
}
EOF
}

resource "aws_codedeploy_app" "analytics_app" {
  name = "analytics_app"
}

resource "aws_codedeploy_deployment_config" "analytics_deployment_config" {
  deployment_config_name = "analytics_deployment_config"

  minimum_healthy_hosts {
    type  = "HOST_COUNT"
    value = 2
  }
}

resource "aws_codedeploy_deployment_group" "analytics_group" {
  app_name              = "${aws_codedeploy_app.analytics_app.name}"
  deployment_group_name = "analytics_group"
  service_role_arn      = "${aws_iam_role.codedeploy_role_name.arn}"
  deployment_config_name = "analytics_deployment_config"

  ec2_tag_filter {
    key   = "CodeDeploy"
    type  = "KEY_AND_VALUE"
    value = "analytics"
  }

  auto_rollback_configuration {
    enabled = true
    events  = ["DEPLOYMENT_FAILURE"]
  }

}
Другие вопросы по тегам