如何使用 Terraform 部署和重新部署应用程序?
Posted
技术标签:
【中文标题】如何使用 Terraform 部署和重新部署应用程序?【英文标题】:How to deploy and redeploy applications with Terraform? 【发布时间】:2016-09-14 19:21:58 【问题描述】:我正在研究 Terraform 以及如何使用它来设置 AWS 环境。到目前为止,我有用于设置具有 3 个公共子网、3 个私有子网、一个 Internet 网关和 3 个 Nat 网关的 VPC 的脚本。但是,我对如何在私有子网中部署和重新部署应用程序感到困惑?
在我的场景中,我们使用 Spring Boot 构建微服务。我们的想法是转移到一个状态,我们可以将弹性负载均衡器连接到公共子网,并将我们的应用程序托管在私有子网中的自动缩放组中。但是,我找不到任何关于 Terraform 的好的教程来向您展示如何以可以从 Jenkins 重新部署应用程序的方式执行此操作。
到目前为止,我已经阅读了有关 Opsworks 和 Code Deploy 的信息,所以我是否需要使用 Terraform 来设置这些资源,然后触发部署脚本将人工制品发送到 S3,然后重新部署?
【问题讨论】:
有很多不同的(和正确的)方法可以实现这一目标,您可能应该进一步调查,然后提出更具体的问题。但请记住,通常,terraform 用于环境/服务器配置部分(您已经做过),但不经常用于应用程序部署。 我点击这里看看是否有新的想法,但是 afaik @DusanBajic 是对的,它是 IaC 而不是配置管理。 【参考方案1】:对于部署/重新部署,您可以使用 Hashicorp 的另一个解决方案:Nomad。它使用与 Terraform 相同的语言来编写可以在集群上运行的任务。任务可以是任何东西,例如:重新部署我所有的网络应用实例。
【讨论】:
或 Consul,也是 Hashicorp 的,可用于触发自定义脚本来部署应用程序 - 例如,来自 Github 的克隆。【参考方案2】:我正在将 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。
【讨论】:
我这是我目前正在采用的方法,只是尝试设置云配置服务器以将配置拉入我的私有实例,然后引导它们,让您知道它是如何进行的。 好的,是的。顺便说一句,如果你想要我的 AWS CD 厨师食谱,我很乐意分享。没什么了不起的,如果亚马逊的安装说明,它只是一个厨师版本。 是的,你可以将它发布在 GitHub 上 :) 我们目前使用 Jenkins,但如果我们需要它会很高兴【参考方案3】:添加这个以便万一有人在寻找更多信息,可能会发现这很有用。
基于 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"]
【讨论】:
以上是关于如何使用 Terraform 部署和重新部署应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用一个 terraform 脚本和不同的变量值管理多个不同环境的部署
如何获取使用 Terraform 部署的功能应用程序中的“功能网址”?