Как развертывать и повторно развертывать приложения с помощью 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"]
}
}