AWS云计算架构--从点击管理控制台到只用一条Terraform命令就能完成应用部署的方法
从亚马逊网络服务开始,更多的是运气而不是头脑。无数的服务和设置选项让我们疯狂。在几周内,我们应该解决让一个完全可执行和加密的应用程序在线并在AWS云中运行的挑战。AWS的服务和附属的设置选项是无限的。问题是,我们尝试并改变了很多设置,到最后我们已经不知道自己设置了什么。最终拯救我们的解决方案是Terraform。参加我们的旅程,了解如何使用Terraform来实现几乎所有的云计算解决方案,而且是漂亮的、可复制的。
我们的目标
我们的目标是建立一个应用程序,通过浏览器访问,用https加密,独立运行,并通过登录来保护。第一步是确定必要的服务和定义范围。我们决定将Elastic Beanstalk 作为中心服务。在ELB的帮助下,我们从服务到服务。我们很快就有了一个巨大的结构,包括EC2实例、负载平衡器、用户池、S3存储、托管区域、目标和安全组。更多关于这些服务和基础设施的内容将在文章中介绍。我们围绕使用AWS管理控制台,直到我们的应用程序运行。我们通过设置学到了很多东西,但从现在开始,我们将在Terraform的帮助下在AWS中实现每一个进一步的任务或实施。

要建立的基础设施看起来是这样的。整个应用程序被托管在一个虚拟私有云(VPC)中。从左边开始,来自企业网络的用户可以通过Route 53和环境前面的用户池来认证自己。一个lambda函数检查访问并释放用户,被授权的用户进入托管区,LoadBalancer将他引导到运行的应用程序,托管在EC2实例上。应用程序内创建的数据被存储在DynamoDB中。在那里运行的应用程序是使用代码流水线过程建立和部署的。源代码被推送到管道的CodeCommit部分,并存储在S3桶中。这就是功能结构,细节将在后面介绍。
什么是Terraform?
Terraform是一个开源的基础设施即代码的软件工具,由HashiCorp创建。它使用户能够使用称为哈希科普配置语言(HCL)的高级配置语言,或可选的JSON来定义和配置数据中心基础设施。
Terraform由许多资源组成,反映了AWS的服务。而资源又有所需的输入大小,在部署和构建后也会返回信息。这些属性可以用来从几个资源中建立模块,这些模块可以变成一个完整的AWS结构。然后Terraform变得非常强大,你可以用一个命令部署或终止整个系统。模块化看起来像下面的代码片段,在这种情况下,有一个main.tf文件,在这个文件中,两个模块被调用,其中main.tf包括要部署的各个资源。
Development─────├── main.tf
除了关于提供者的信息外,开发层面的main.tf还包括每个模块的相关输入值(这里全部定义为变量)。变量也将在这一层的variables.tf中定义,并由用户填入数值,然后子模块只包括这些。在父级层面上,不仅要确定子模块的输入变量,还必须指定 repo 的网址(模块的存储位置)。
# Module invoking in the Development main.tf
module “vpc” { source =“git:https://repository.git"
在模块vpc中,所有相关的资源都包含在main.tf中,这对部署是必要的。变量文件定义了要使用的变量,这些变量在父模块中已经被声明了数值。这个子模块中的一个资源例子是为VPC创建一个端点,以便它能与附加的AWS服务进行通信。在这种情况下,与ec2实例。
resource "aws_vpc_endpoint" "ec2" {
导入功能的力量
通过Terraform,可以导入已经在管理控制台中配置好的AWS服务,并从现在开始用Terraform管理它们。在准备过程中,必须创建一个main.tf文件,在其中调用要导入的资源。在准备过程中,必须创建一个_"main.tf "_文件,在其中调用要导入的资源的状态。该命令目前一次只能导入一个资源。该命令的结构总是相同的,可以从存储主文件的目录中启动。文件中写明了哪种资源要使用哪种具体的标识符。主文件必须包含关于提供者、区域和要使用的配置文件的所有信息。然后,下面的命令将配置保存在同一文件夹的tf.state文件中。
$ terraform import <terraform ressource name>.import specific Import identifier
这个功能在开始时对我们帮助很大。这是我们能够在云端对最初建立和可执行的基础设施进行反向工程的唯一方法。
模块化的怪物
有了这些导入文件和对terraform模块结构的基本了解,我们就能解决整体的模块化问题。我们以这样的方式进行,即我们总是对一个功能子区域进行梯形化,然后将旧的服务上线,用新部署的服务测试整个应用程序。各个模块可以相互依赖,最重要的是,可以依赖它们的输出,为此,了解部署顺序和使用 "依赖 "命令很重要。这个功能可以在资源中调用,从而确保,例如,通知资源只在整个代码管道部署后执行。
module “Notification” {
如果每一个函数都是可执行的,整个构建都被理解了,我们就可以开始模块化了。目标很明确,变量也应该只在一个文件中为每个部署进行调整。上面已经描述的云结构在terraform结构中看起来是这样的。
Application─────├── main.tf
部署过程将被分为两步。前两个模块(vpc和s3)是提前创建的。背景是s3中的terraform-state桶,它包含部署的terraform数据和虚拟私有云所需的端点。通过_"terraform apply "命令和刚才提到的模块,账户已经准备好进行应用设置。在我们的例子中,总共有57个资源被部署到AWS账户。如果不再需要该应用程序,可以像创建时一样用"terraform destroy "_快速删除。
双重资源库战术
各个功能模块都存储在源码库中。这些也包含一个 "例子 "文件夹。这个文件夹包含一个_main.tf_ 和_output.tf_文件。 _main.tf_在s3中存储了terraform的状态。最重要的是,模块被调用时,调用的第一行指定了这个资源库的绝对路径。此外,所有相关的变量都被传递。
Source-Repo:
Deploy-Repo:
在应用程序的 repo 中,有一个_main.tf_ ,它从源 repo 中调用所有需要的模块。因此,所有应用程序特定的信息,如变量、证书和环境变量都存储在一个单独的 repo 中。此外,这种划分还提供了进一步单独部署的可能性。
总结
通过terraform,可以非常有效地建立云基础设施,最重要的是,可以反复进行。设置可以以最好的方式调整,在管理控制台中,你经常遇到的问题是,你不再知道当前的设置是什么。因此,Terraform部署在开发的同时为你开发的云基础设施提供了自动文档。对我们来说,在控制台中的点击已经过时了。我们可以向大家强烈推荐这个程序。Terraform很有趣,提高了效率,并使你始终处于云服务的顶端。