Amazon web services 如何使用Terraform部署和重新部署应用程序?

Amazon web services 如何使用Terraform部署和重新部署应用程序?,amazon-web-services,jenkins,aws-code-deploy,terraform,aws-opsworks,Amazon Web Services,Jenkins,Aws Code Deploy,Terraform,Aws Opsworks,我正在研究Terraform以及如何使用它来设置AWS环境。到目前为止,我已经有了用3个公共子网、3个私有子网、一个Internet网关和3个Nat网关建立VPC的脚本。然而,我对如何在私有子网中部署和重新部署应用程序感到困惑 在我的场景中,我们使用Spring Boot构建微服务。我们的想法是转移到一种状态,在这种状态下,我们可以将弹性负载平衡器连接到公共子网,并在私有子网中的自动缩放组中承载我们的应用程序。然而,我找不到任何关于Terraform的好教程,这些教程向您展示了如何以一种可以从J

我正在研究Terraform以及如何使用它来设置AWS环境。到目前为止,我已经有了用3个公共子网、3个私有子网、一个Internet网关和3个Nat网关建立VPC的脚本。然而,我对如何在私有子网中部署和重新部署应用程序感到困惑

在我的场景中,我们使用Spring Boot构建微服务。我们的想法是转移到一种状态,在这种状态下,我们可以将弹性负载平衡器连接到公共子网,并在私有子网中的自动缩放组中承载我们的应用程序。然而,我找不到任何关于Terraform的好教程,这些教程向您展示了如何以一种可以从Jenkins重新部署应用程序的方式来实现这一点


到目前为止,我已经阅读了有关Opsworks和代码部署的内容,因此我是否需要使用Terraform来设置这些资源,然后触发部署脚本,将人工制品发送到S3,然后重新部署?

对于部署/重新部署,您可以使用Hashicorp的另一个解决方案:。它使用与Terraform相同的语言来编程可以在集群上运行的任务。任务可以是任何东西,例如:重新部署我的所有web应用实例。

我正在使用Terraform/Chef的CodeDeploy。我使用的设置如下所示:

resource "aws_iam_instance_profile" "code_deploy" {
    name = "CodeDeploy"
    roles = ["${var.codedeploy_instance_role}"]
}
iam_instance_profile = "${aws_iam_instance_profile.code_deploy.id}"
tags {
   CD = "${var.tag_cd}"
}
1) 提前手动设置CodeDeploy IAM角色

2) 提前设置CodeDeploy应用程序/组

3) 使用Terraform设置实例配置文件,如下所示:

resource "aws_iam_instance_profile" "code_deploy" {
    name = "CodeDeploy"
    roles = ["${var.codedeploy_instance_role}"]
}
iam_instance_profile = "${aws_iam_instance_profile.code_deploy.id}"
tags {
   CD = "${var.tag_cd}"
}
4) 创建实例时,请使用实例配置文件和正确的标记(与CodeDeploy应用程序匹配),如下所示:

resource "aws_iam_instance_profile" "code_deploy" {
    name = "CodeDeploy"
    roles = ["${var.codedeploy_instance_role}"]
}
iam_instance_profile = "${aws_iam_instance_profile.code_deploy.id}"
tags {
   CD = "${var.tag_cd}"
}
5) 使用Chef(或任何您的provisioner)在实例上设置CodeDeploy


然后,您可以像正常情况一样使用CodeDeploy。

添加此选项,以便在有人需要更多信息时,可能会发现此选项很有用

基于Peter的解决方案,我正在从Terraform设置CodeDeploy IAM角色和CodeDeploy应用程序/组。以下是我所拥有的:

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"]
  }

}
资源“aws\u iam\u角色”“代码部署\u角色\u名称”{
name=“codedeploy\u角色\u名称”

假设_role_policy=有很多不同(正确)的方法来实现这一点,您可能应该进一步调查,然后提出更具体的问题。但请记住,通常情况下,terraform用于环境/服务器配置部分(您已经这样做了),但在应用程序部署方面不太常见。我点击这里是想看看是否有新的想法,但afaik@DusanBajic是对的,它不是配置管理。或者,Hashicorp也使用Concur,可以触发自定义脚本来部署应用程序-例如,从Github克隆。我目前正在采用这种方法,只是试图获得云配置g服务器安装程序将配置拉入我的私有实例,然后引导它们,将让你知道它是如何运行的。好的,是的。顺便说一句,如果你想要我的AWS CD厨师食谱,我很乐意与你分享。这没什么了不起的,只是一个厨师版本,如果亚马逊的安装说明。是的,当然,你可以在GitHub上发布:)我们目前使用Jenkins,但它会是很高兴拥有它,如果我们需要它的话