如果您计划管理和使用Amazon Web Services(AWS),使用Terraform AWS provider是必不可少的。它允许您与AWS支持的许多资源进行交互,例如Amazon S3、Elastic Beanstalk、Lambda等等。
在这份终极指南中,您将逐步学习关于AWS provider以及如何使用Terraform与该provider管理您的Amazon基础架构的几乎所有需要了解的内容。
让我们开始吧!
先决条件
如果您想跟着本教程进行,请确保您已经准备好以下内容:
- 一个Amazon Web服务(AWS)帐户。
- 一个在您本地机器上设置了访问密钥ID和密钥的IAM用户。
- Terraform v0.14.9 – 本教程的演示是在Ubuntu 18.04.5 LTS上进行的,但其他安装了Terraform的操作系统也可以使用。
- A code editor – Even though you can use any text editor to work with Terraform configuration files, you should have one that understands the HCL Terraform language. Try out Visual Studio (VS) Code.
Terraform AWS Provider是什么?
Terraform 依赖于插件与云提供商(如AWS、Google Cloud Platform(GCP)和Oracle)进行交互。其中最广泛使用的提供商之一是AWS提供商。该提供商与AWS支持的许多资源进行交互,如Amazon S3、Elastic Beanstalk、Lambda等等。
Terraform 使用带有正确凭据的AWS提供商与Amazon连接,以管理或部署/更新数十个AWS服务。
AWS提供商在Terraform配置文件中声明,并包含各种参数,如版本、终端URL或云区域等。
声明AWS提供商
当您需要引用提供者的名称时,必须定义一个本地名称。本地名称是分配给required_providers
块内的提供者名称。在需要提供者时分配本地名称,每个模块必须是唯一的。
在声明required_providers
时,还需要在Terraform 0.13及更高版本中声明source
参数。source
参数设置了Terraform可以下载插件的源地址。
源地址由三个部分组成,如下:
- 主机名 – 分发提供者的Terraform注册表的主机名。默认主机名为registry.terraform.io。
- 命名空间 – 指定注册表内的组织命名空间。
- 类型 – 类型是您为提供者管理的平台或系统提供的简短名称,它必须是唯一的。
下面,您可以看到源参数声明语法,源地址的三个部分由斜杠(/
)分隔。
现在,下面的Terraform配置声明了所需提供程序的名称(aws
),以及源地址、AWS提供程序版本,并配置了提供程序的区域(us-east-2
)。
使用硬编码凭据对AWS账户进行认证
现在您已经基本了解了如何声明AWS提供程序,让我们来看看如何对AWS账户进行认证。
你可以通过几种不同的方法对AWS提供程序进行身份验证,比如声明环境变量并将凭据存储在命名配置文件中。但是,最快速的身份验证AWS账户的方法是在AWS提供程序中硬编码凭据。
尽管不推荐使用硬编码的凭据,因为它们容易泄漏,你仍然可以在Terraform配置中声明硬编码的凭据以快速测试任何AWS资源。但是请继续阅读,稍后你将学到通过声明环境变量来更好地对AWS账户进行身份验证的方法。
下面的配置声明了一个本地名称(aws
)以及提供程序区域(us-east-2
),如下所示。你可以看到AWS提供程序块还声明了访问密钥和秘密密钥以进行AWS账户的身份验证。
通过声明环境变量保护凭据
你刚刚学到了使用Terraform硬编码静态凭据来验证AWS云服务是可能的。但是,硬编码是不安全的,只建议在测试环境中部署时快速测试代码时使用。
有没有其他保护凭据的方式?是的,可以将它们声明为环境变量,你可以声明的数量没有限制。环境变量是在 Terraform 配置文件之外设置其值的变量,由名称/值对组成。
运行下面一系列的export
命令来导出每个环境变量。导出环境变量使它们在整个程序中或直到 Terraform 执行时可用。
在命名配置文件中存储多个凭据
无论是硬编码还是将凭据声明为环境变量,都可以逐个对 AWS 账户进行身份验证。但如果需要存储多个凭据并在需要时使用它们怎么办?将凭据存储在命名配置文件中是理想的选择。
下面的代码创建一个命名配置文件(Myprofile
),其中包含访问密钥和秘密密钥。
命名配置文件的默认位置在 Linux 和 macOS 上是 $HOME/.aws/credentials/Myprofile,或在 Windows 上是 %USERPROFILE%\.aws\credentials\Myprofile。请将 Myprofile 替换为命名配置文件的实际名称。
一旦在~/.aws/credentials中创建了命名配置文件,您就可以在Terraform配置中使用profile
属性引用该配置文件。在下面的示例中,您正在引用名为Myprofile
的命名配置文件。
声明在AWS提供程序中的Assume Role
您刚刚学习了通过在运行Terraform之前声明硬编码凭据来配置AWS提供程序。但也许,您想在运行时声明凭据。如果是这样,AssumeRoleAPI就是您所需要的。AssumeRole提供临时凭证,包含访问密钥ID、秘密访问密钥和安全令牌。这些凭证允许您连接到AWS。
下面的代码声明了名为aws
的provider
和一个包含角色名称和会话名称的assume_role
。要配置AssumeRole访问权限,必须定义一个指定其授予的特权以及可以假定该角色的实体的IAM角色。
声明多个 AWS 提供者
到目前为止,您已经学会了如何在 Terraform 中声明和配置与单个区域一起使用的 AWS 提供者。但是,如果您需要在多个云区域中管理基础结构或 AWS 服务,您将需要声明关键字 alias
。
别名允许为同一提供者定义多个配置,并在每个资源或模块基础上选择使用哪个或支持多个区域。
下面的代码声明了名为 aws
的默认 AWS 提供者,region
设置为 us-east-2
。然后声明了另一个具有相同名称的 AWS 提供者,但具有声明的 alias
名称为 west
,并将 region
设置为 us-west-2
。
声明一个alias
允许您默认在us-east-2
地区创建资源,或者根据要求选择aws.west
提供程序在us-west-2
地区创建资源。
自定义AWS提供程序的端点配置
自定义端点配置在连接到非默认的AWS服务端点(如AWS Snowball)或进行本地测试时非常方便。
配置 Terraform AWS Provider 以使用定制的端点。通过在提供程序块内声明 endpoints
配置块来实现,如下所示。
以下配置允许您访问本地端口 4572
上的 AWS S3 服务,就像您实际上正在访问 AWS 帐户上的 AWS S3 服务一样。类似地,该配置允许您在本地访问端口 4569
上的 dynamodb
。DynamoDB 是一个提供快速性能和无缝可扩展性的 NoSQL 数据库服务。
检查 Terraform AWS Provider 允许的 定制端点 列表。
添加标签
之前,您了解了如何使用配置(例如区域、源位置等)声明 AWS 提供程序。但为了更好地管理您的资源,您需要在提供程序级别添加 标签。
标签是由用户定义的键和值组成的标签。 在AWS帐户中需要检查计费、所有权、自动化、访问控制等情况时,标签非常方便。
与其逐个向所有资源添加标签,不如学习如何在提供程序级别向所有资源添加标签,这将有助于节省大量代码和时间。
下面的代码配置了一个具有在default_tags
内定义的标签的AWS提供程序。 在提供程序内添加标签的好处是,当您使用此提供程序创建任何资源时,指定的标签将自动添加。
忽略标签
在提供程序级别启用标签有助于在整个环境中应用标签。 但有时,您需要忽略标签,例如,如果您不希望向EC2实例添加默认标签,而是希望应用于AWS帐户中的其余资源。 让我们看一下!
下面的代码配置了一个具有在提供程序内定义的ignore_tags的AWS提供程序。 使用忽略标签的好处是,当您不希望向某些资源添加默认标签并希望应用于其余资源时。
在下面的代码中,当您使用aws
提供商创建任何资源时,所有资源都将忽略LastScanned
和kubernetes.io
标签。
创建AWS S3存储桶
到目前为止,您已经全面了解了如何声明和配置AWS提供商。但仅仅声明AWS提供商并没有任何作用,直到您管理AWS资源,例如配置AWS S3存储桶或删除Ec2实例等。因此,让我们学习如何创建AWS S3存储桶!
1. 创建一个名为~/terraform-s3-demo的文件夹,然后将工作目录更改为该文件夹(cd
)。~/terraform-s3-demo文件夹将包含您的配置文件和Terraform将创建的所有相关文件。
2. 在您喜爱的代码编辑器中复制并粘贴以下配置,并将其保存为main.tf,保存在~/terraform-s3-demo目录中。
main.tf文件创建了一些必要的资源:
- 提供程序要求:提供程序要求包括本地名称、来源位置和版本约束。
- 加密密钥: Amazon S3加密密钥有助于S3存储桶,使存储在存储桶中的所有新对象都被加密。加密密钥是使用Terraform中的
aws_kms_key
创建的。 - 配置AWS提供程序: 声明提供程序名称(
aws
)以及区域us-east-2
。 - 存储桶: 此Terraform模块创建一个名为
terraformdemobucket
的存储桶。Terraform无法销毁此存储桶,因为它包含一个标志force_destroy
。
版本控制: Amazon S3中的版本控制意味着在同一个存储桶中保留对象的多个版本
3. 现在,运行以下命令以导航至~\\terraform-s3-demo
目录并初始化 Terraform。Terraform 初始化插件和提供程序,这些是与资源配合使用所需的。
Terraform 通常使用三个命令按顺序执行terraform init、terraform plan和terraform apply。
创建 AWS EC2 实例和 IAM 用户
在上一节中,您学习了如何使用 AWS 提供程序的 Terraform 创建单个对象(AWS S3 存储桶)。但实际上,您可以使用 Terraform 和 AWS 提供程序创建多个相同类型的对象。
1. 创建名为~/terraform-ec2-iam-demo的文件夹,然后进入其中
2. 打开你喜欢的代码编辑器,复制/粘贴下面的配置,然后将文件保存为main.tf在~/terraform-ec2-iam-demo目录中。
下面的代码创建了两个EC2实例ec21a
和ec21a
,分别使用t2.micro
和t2.medium
实例类型,然后创建了具有四个不同名称的IAM用户。代码中声明的ami
是Amazon Machine Image (AMI),它提供启动实例所需的信息,例如操作系统的类型,要安装的软件等。
你可以使用Amazon EC2控制台查找Linux AMIs。
3. 接下来,创建另一个文件,复制/粘贴下面的代码,并将文件保存为 vars.tf 在 ~/terraform-ec2-iam-demo 目录中。
下面的代码声明了所有变量,在 main.tf 文件中被引用。运行 Terraform 代码后,变量 tag_ec2
的值将分配给在 main.tf 文件中定义的两个 EC2 实例,分别为 ec21a
和 ec21b
。
4. 在 ~/terraform-ec2-iam-demo 目录中创建另一个 Terraform 配置文件名为 output.tf,然后将下面的代码复制/粘贴到 output.tf 文件中。
成功执行 terraform apply 命令后,您应该能够在命令输出的末尾看到 ${aws_instance.my-machine.*.id}
和 ${aws_iam_user.accounts.*.name}
的值。
下面的代码告诉 Terraform 引用在 main.tf 配置文件中定义的 aws_instance
和 aws_iam_user
资源。
5. 在~/terraform-ec2-iam-demo目录中创建一个额外的配置文件,命名为provider.tf,并将下面的代码粘贴到provider.tf文件中。下面的provider.tf定义了Terraform AWS provider,以便Terraform知道如何与您之前定义的所有AWS资源进行交互。
6. 现在,通过运行tree
命令,验证~/terraform-ec2-iam-demo文件夹中包含所有所需的文件。

7. 按顺序运行以下命令以初始化Terraform并创建AWS EC2实例和IAM用户。

最后,转到AWS管理控制台,然后切换到AWS EC2服务和IAM控制台。
在接下来的屏幕截图中,您可以验证EC2实例和IAM用户是否存在。


结论
通过这个终极指南,您现在具备了使用AWS Provider的知识,从声明到在Terraform中执行AWS Provider。您还学会了AWS Provider如何安全地声明凭据。
现在您想要使用AWS Provider和Terraform管理哪个AWS服务?