安装 Terraform 后,您就可以创建您的第一个基础设施了。
在本教程中,您将在 Amazon Web Services (AWS) 上配置 EC2 实例。EC2 实例是在 AWS 上运行的虚拟机,是许多基础设施项目的常见组件。
先决条件
要遵循本教程,您将需要:
已安装Terraform CLI (1.2.0+)。
已安装AWS CLI 。
允许您创建资源的AWS 账户和关联凭证。
要使用您的 IAM 凭证对 Terraform AWS 提供商进行身份验证,请设置AWS_ACCESS_KEY_ID环境变量。
export AWS_ACCESS_KEY_ID=
复制
现在,设置你的密钥。
export AWS_SECRET_ACCESS_KEY=
复制
提示
如果您无权访问 IAM 用户凭证,请使用AWS 提供商文档中描述的其他身份验证方法。
本教程将配置符合AWS 免费套餐资格的资源。如果您的帐户不符合免费套餐资源的资格,我们不对您可能产生的任何费用负责。
写入配置
用于描述 Terraform 中的基础设施的文件集称为 Terraform配置。您将编写第一个配置来定义单个 AWS EC2 实例。
每个 Terraform 配置必须位于其自己的工作目录中。为您的配置创建一个目录。
mkdir learn-terraform-aws-instance
复制
切换到目录。
cd learn-terraform-aws-instance
复制
创建一个文件来定义您的基础架构。
touch main.tf
复制
在文本编辑器中打开main.tf,粘贴下面的配置,然后保存文件。
提示
此配置中使用的 AMI ID 特定于该 us-west-2区域。如果您想使用其他区域,请参阅 故障排除部分以获取指导。
terraform {
required_providers {
aws = {
source = “hashicorp/aws”
version = “~> 4.16”
}
}
required_version = “>= 1.2.0”
}
provider “aws” {
region = “us-west-2”
}
resource “aws_instance” “app_server” {
ami = “ami-830c94e3”
instance_type = “t2.micro”
tags = {
Name = “ExampleAppServerInstance”
}
}
复制
这是可以使用 Terraform 进行部署的完整配置。以下部分更详细地回顾了此配置的每个块。
地形块
该terraform {}块包含 Terraform 设置,包括 Terraform 将用于配置您的基础设施的所需提供程序。对于每个提供程序,该 source属性定义可选的主机名、命名空间和提供程序类型。Terraform默认从Terraform 注册表安装提供程序。在此示例配置中,aws提供程序的源定义为hashicorp/aws,它是 的简写registry.terraform.io/hashicorp/aws。
您还可以为 required_providers块中定义的每个提供程序设置版本约束。该version属性是可选的,但我们建议使用它来限制提供程序版本,以便 Terraform 不会安装不适合您的配置的提供程序版本。如果您不指定提供程序版本,Terraform 将在初始化期间自动下载最新版本。
要了解更多信息,请参考提供商源文档。
供应商
该provider块配置指定的提供程序,在本例中为aws。提供者是 Terraform 用于创建和管理资源的插件。
您可以在 Terraform 配置中使用多个提供程序块来管理来自不同提供程序的资源。您甚至可以一起使用不同的提供商。例如,您可以将 AWS EC2 实例的 IP 地址从 DataDog 传递到监控资源。
资源
使用resource块来定义基础架构的组件。资源可以是物理或虚拟组件(例如 EC2 实例),也可以是逻辑资源(例如 Heroku 应用程序)。
资源块在块之前有两个字符串:资源类型和资源名称。在此示例中,资源类型为aws_instance,名称为app_server。类型的前缀映射到提供者的名称。在示例配置中,Terraformaws_instance通过 aws提供者管理资源。资源类型和资源名称一起形成资源的唯一 ID。例如,您的 EC2 实例的 ID 是 aws_instance.app_server。
资源块包含用于配置资源的参数。参数可以包括机器大小、磁盘映像名称或 VPC ID 等内容。我们的提供者参考 列出了每个资源的必需参数和可选参数。对于您的 EC2 实例,示例配置将 AMI ID 设置为 Ubuntu 映像,并将实例类型设置为t2.micro,这符合 AWS 的免费套餐资格。它还设置一个标签来为实例命名。
初始化目录
当您创建新配置 - 或从版本控制中查看现有配置 - 您需要使用terraform init.
初始化配置目录会下载并安装配置中定义的提供程序,在本例中为aws提供程序。
初始化目录。
terraform init
Initializing the backend…
Initializing provider plugins…
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run “terraform init” in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running “terraform plan” to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
复制
Terraform 下载aws提供程序并将其安装在当前工作目录的隐藏子目录中,名为.terraform. 该 terraform init命令打印出安装的提供程序的版本。Terraform 还创建一个名为 的锁定文件,.terraform.lock.hcl该文件指定所使用的确切提供程序版本,以便您可以控制何时更新用于项目的提供程序。
格式化并验证配置
我们建议在所有配置文件中使用一致的格式。该 terraform fmt命令会自动更新当前目录中的配置,以提高可读性和一致性。
格式化您的配置。Terraform 将打印出其修改的文件的名称(如果有)。在这种情况下,您的配置文件已正确格式化,因此 Terraform 将不会返回任何文件名。
terraform fmt
复制
您还可以使用该命令确保您的配置在语法上有效且内部一致terraform validate。
验证您的配置。上面提供的示例配置是有效的,因此 Terraform 将返回成功消息。
terraform validate
Success! The configuration is valid.
复制
创建基础设施
现在使用命令应用配置terraform apply。Terraform 将打印类似于如下所示的输出。我们截断了一些输出以节省空间。
terraform apply
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
Terraform will perform the following actions:
aws_instance.app_server will be created
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only ‘yes’ will be accepted to approve.
Enter a value:
复制
提示
如果您的配置无法应用,您可能已经自定义了您的区域或删除了默认 VPC。请参阅 本教程的故障排除部分以获取帮助。
在应用任何更改之前,Terraform 会打印出执行计划 ,该计划描述了 Terraform 将采取的操作,以便更改您的基础设施以匹配配置。
输出格式类似于Git等工具生成的diff格式。输出的+旁边有一个aws_instance.app_server,这意味着 Terraform 将创建此资源。在其下方,它显示将要设置的属性。当显示的值为 时(known after apply),表示资源创建后才知道该值。例如,AWS 在创建实例时将 Amazon 资源名称 (ARN) 分配给实例,因此arn在您应用更改并且 AWS 提供商从 AWS API 返回该值之前,Terraform 无法知道该属性的值。
Terraform 现在将暂停并等待您的批准,然后再继续。如果计划中的任何内容看起来不正确或危险,在 Terraform 修改您的基础设施之前可以安全地中止。
在这种情况下,该计划是可以接受的,因此请yes在确认提示中键入内容以继续。由于 Terraform 等待 EC2 实例变得可用,因此执行该计划将需要几分钟的时间。
Enter a value: yes
aws_instance.app_server: Creating…
aws_instance.app_server: Still creating… [10s elapsed]
aws_instance.app_server: Still creating… [20s elapsed]
aws_instance.app_server: Still creating… [30s elapsed]
aws_instance.app_server: Creation complete after 36s [id=i-01e03375ba238b384]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
您现在已经使用 Terraform 创建了基础设施!访问EC2 控制台 并找到您的新 EC2 实例。
笔记
根据aws提供商块,您的实例是在该 us-west-2区域创建的。确保您的 AWS 控制台设置为该区域。
检查状态
当您应用配置时,Terraform 将数据写入名为 terraform.tfstate. Terraform 在此文件中存储其管理的资源的 ID 和属性,以便将来可以更新或销毁这些资源。
Terraform 状态文件是 Terraform 跟踪其管理的资源的唯一方式,并且通常包含敏感信息,因此您必须安全地存储状态文件,并将访问权限限制为仅需要管理基础设施的受信任团队成员。在生产中,我们建议使用 Terraform Cloud 或 Terraform Enterprise远程存储您的状态。Terraform 还支持其他几个 可用于存储和管理状态的远程后端。
使用 检查当前状态terraform show。
terraform show
aws_instance.app_server:
resource “aws_instance” “app_server” {
ami = “ami-830c94e3”
arn = “arn:aws:ec2:us-west-2:561656980159:instance/i-01e03375ba238b384”
associate_public_ip_address = true
availability_zone = “us-west-2c”
cpu_core_count = 1
cpu_threads_per_core = 1
disable_api_termination = false
ebs_optimized = false
get_password_data = false
hibernation = false
id = “i-01e03375ba238b384”
instance_state = “running”
instance_type = “t2.micro”
ipv6_address_count = 0
ipv6_addresses = []
monitoring = false
primary_network_interface_id = “eni-068d850de6a4321b7”
private_dns = “ip-172-31-0-139.us-west-2.compute.internal”
private_ip = “172.31.0.139”
public_dns = “ec2-18-237-201-188.us-west-2.compute.amazonaws.com”
public_ip = “18.237.201.188”
secondary_private_ips = []
security_groups = [
“default”,
]
source_dest_check = true
subnet_id = “subnet-31855d6c”
tags = {
“Name” = “ExampleAppServerInstance”
}
tenancy = “default”
vpc_security_group_ids = [
“sg-0edc8a5a”,
]
credit_specification {
cpu_credits = "standard"
}
enclave_options {
enabled = false
}
metadata_options {
http_endpoint = "enabled"
http_put_response_hop_limit = 1
http_tokens = "optional"
}
root_block_device {
delete_on_termination = true
device_name = "/dev/sda1"
encrypted = false
iops = 0
tags = {}
throughput = 0
volume_id = "vol-031d56cc45ea4a245"
volume_size = 8
volume_type = "standard"
}
}
复制
当 Terraform 创建此 EC2 实例时,它还从 AWS 提供商收集资源的元数据并将元数据写入状态文件。在后面的教程中,您将修改配置以引用这些值来配置其他资源和输出值。
手动管理状态
Terraform 有一个内置命令,称为terraform state高级状态管理。使用list子命令列出项目状态中的资源。
terraform state list
aws_instance.app_server
复制
故障排除
如果terraform validate成功但您的申请仍然失败,则您可能遇到了以下常见错误之一。
如果您使用 以外的区域us-west-2,您还需要更改您的ami,因为 AMI ID 是特定于区域的。按照这些说明选择特定于您所在区域的 AMI ID ,并main.tf使用该 ID 进行修改。然后重新运行terraform apply。
如果您在正确区域的 AWS 账户中没有默认 VPC,请导航到 Web UI 中的 AWS VPC 控制面板,在您的区域中创建一个新 VPC,并将子网和安全组关联到该 VPC。然后将安全组 ID ( vpc_security_group_ids) 和子网 ID ( subnet_id) 参数添加到您的aws_instance资源,并将这些值替换为新安全组和子网中的值。
resource “aws_instance” “app_server” {
ami = “ami-830c94e3”
instance_type = “t2.micro”
请记住将这些行添加到您的配置中以供后续教程使用。有关更多信息,请查看 AWS 提供的有关使用 VPC 的文档。
下一步
现在您已经使用 Terraform 创建了第一个基础设施,请继续学习 下一个教程来修改您的基础设施。
在上一个教程中,您使用 Terraform 创建了第一个基础设施:AWS 上的单个 EC2 实例。在本教程中,您将修改该资源,并了解如何将更改应用到 Terraform 项目。
基础设施在不断发展,Terraform 可以帮助您管理这种变化。当您更改 Terraform 配置时,Terraform 会构建一个执行计划,该计划仅修改达到所需状态所需的内容。
在生产中使用 Terraform 时,我们建议您使用版本控制系统来管理配置文件,并将状态存储在远程后端(例如 Terraform Cloud 或 Terraform Enterprise)中。
先决条件
本教程假设您继续之前的教程。如果没有,请先按照以下步骤操作,然后再继续。
安装 Terraform CLI (1.2.0+) 和 AWS CLI(使用默认配置文件配置),如上一个教程中所述。
创建一个名为 的目录learn-terraform-aws-instance并将以下配置粘贴到名为 的文件中main.tf。
terraform {
required_providers {
aws = {
source = “hashicorp/aws”
version = “~> 4.16”
}
}
required_version = “>= 1.2.0”
}
provider “aws” {
region = “us-west-2”
}
resource “aws_instance” “app_server” {
ami = “ami-830c94e3”
instance_type = “t2.micro”
tags = {
Name = “ExampleAppServerInstance”
}
}
复制
初始化配置。
terraform init
复制
应用配置。使用 响应确认提示yes。
terraform apply
复制
成功应用配置后,您可以继续本教程的其余部分。
配置
现在更新ami您的实例的。通过将当前 AMI ID 替换为新的 AMI ID,更改aws_instance.app_server 提供程序块下的资源。main.tf
提示
下面的代码片段采用 diff 格式,为您提供有关需要更改配置的哪些部分的上下文。将显示为红色的内容替换为显示为绿色的内容,省略前导 +和-符号。
笔记
此配置中使用的新 AMI ID 特定于该 us-west-2区域。如果您在其他区域工作,请务必按照以下说明为该区域选择合适的 AMI 。
resource “aws_instance” “app_server” {
应用更改
更改配置后,terraform apply再次运行以查看 Terraform 如何将此更改应用到现有资源。
terraform apply
aws_instance.app_server: Refreshing state… [id=i-01e03375ba238b384]
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement
Terraform will perform the following actions:
aws_instance.app_server must be replaced
-/+ resource “aws_instance” “app_server” {
~ ami = “ami-830c94e3” -> “ami-08d70e59c07c61a3a” # forces replacement
~ arn = “arn:aws:ec2:us-west-2:561656980159:instance/i-01e03375ba238b384” -> (known after apply)
#…
Plan: 1 to add, 0 to change, 1 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only ‘yes’ will be accepted to approve.
Enter a value:
复制
该前缀-/+意味着 Terraform 将销毁并重新创建资源,而不是就地更新它。Terraform 可以就地更新某些属性(用前缀表示~),但更改 EC2 实例的 AMI 需要重新创建它。Terraform 会为您处理这些详细信息,执行计划会显示 Terraform 将执行的操作。
此外,执行计划显示 AMI 更改迫使 Terraform 替换实例。如有必要,您可以使用此信息调整更改以避免破坏性更新。
Terraform 再次提示您批准执行计划,然后再继续。回答yes执行计划的步骤。
Enter a value: yes
aws_instance.app_server: Destroying… [id=i-01e03375ba238b384]
aws_instance.app_server: Still destroying… [id=i-01e03375ba238b384, 10s elapsed]
aws_instance.app_server: Still destroying… [id=i-01e03375ba238b384, 20s elapsed]
aws_instance.app_server: Still destroying… [id=i-01e03375ba238b384, 30s elapsed]
aws_instance.app_server: Still destroying… [id=i-01e03375ba238b384, 40s elapsed]
aws_instance.app_server: Destruction complete after 42s
aws_instance.app_server: Creating…
aws_instance.app_server: Still creating… [10s elapsed]
aws_instance.app_server: Still creating… [20s elapsed]
aws_instance.app_server: Still creating… [30s elapsed]
aws_instance.app_server: Still creating… [40s elapsed]
aws_instance.app_server: Creation complete after 50s [id=i-0fd4a35969bd21710]
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
正如执行计划所示,Terraform 首先销毁现有实例,然后在其位置创建一个新实例。您可以terraform show 再次使用 Terraform 打印出与该实例关联的新值。
您现在已使用 Terraform 在 AWS 上创建并更新了 EC2 实例。在本教程中,您将使用 Terraform 来破坏此基础设施。
一旦您不再需要基础设施,您可能希望销毁它以减少安全风险和成本。例如,您可以从服务中删除生产环境,或者管理构建或测试系统等短期环境。除了构建和修改基础设施之外,Terraform 还可以销毁或重新创建其管理的基础设施。
破坏
该terraform destroy命令终止 Terraform 项目管理的资源。此命令与 的相反terraform apply,它终止 Terraform 状态中指定的所有资源。它不会破坏当前 Terraform 项目未管理的其他地方运行的资源。
销毁你创造的资源。
terraform destroy
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
Terraform will perform the following actions:
aws_instance.app_server will be destroyed
Plan: 0 to add, 0 to change, 1 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only ‘yes’ will be accepted to confirm.
Enter a value:
复制
该-前缀表示该实例将被销毁。与应用一样,Terraform 显示其执行计划并在进行任何更改之前等待批准。
回答yes执行该计划并摧毁基础设施。
Enter a value: yes
aws_instance.app_server: Destroying… [id=i-0fd4a35969bd21710]
aws_instance.app_server: Still destroying… [id=i-0fd4a35969bd21710, 10s elapsed]
aws_instance.app_server: Still destroying… [id=i-0fd4a35969bd21710, 20s elapsed]
aws_instance.app_server: Still destroying… [id=i-0fd4a35969bd21710, 30s elapsed]
aws_instance.app_server: Destruction complete after 31s
Destroy complete! Resources: 1 destroyed.
就像 一样apply,Terraform 决定销毁资源的顺序。在这种情况下,Terraform 识别出一个没有其他依赖项的实例,因此它销毁了该实例。在具有多个资源的更复杂的情况下,Terraform 将以适当的顺序销毁它们以尊重依赖性。
您现在已经有了足够的 Terraform 知识来创建有用的配置,但到目前为止的示例都使用了硬编码值。Terraform 配置可以包含变量,使您的配置更加动态和灵活。
先决条件
完成前面的教程后,您将learn-terraform-aws-instance在名为 的文件中拥有一个使用以下配置命名的目录main.tf。
terraform {
required_providers {
aws = {
source = “hashicorp/aws”
version = “~> 4.16”
}
}
required_version = “>= 1.2.0”
}
provider “aws” {
region = “us-west-2”
}
resource “aws_instance” “app_server” {
ami = “ami-08d70e59c07c61a3a”
instance_type = “t2.micro”
tags = {
Name = “ExampleAppServerInstance”
}
}
复制
确保您的配置与此匹配,并且您已terraform init 在该learn-terraform-aws-instance目录中运行。
使用变量设置实例名称
当前配置包括许多硬编码值。Terraform 变量允许您编写灵活且更易于重用的配置。
添加一个变量来定义实例名称。
创建一个新文件,variables.tf并使用定义新变量的块来调用 instance_name。
variable “instance_name” {
description = “Value of the Name tag for the EC2 instance”
type = string
default = “ExampleAppServerInstance”
}
复制
笔记
Terraform 加载当前目录中以 结尾的所有文件.tf,因此您可以根据自己的选择命名配置文件。
在 中main.tf,更新aws_instance资源块以使用新变量。除非您声明不同的值,否则变量instance_name块将默认为其默认值(“ExampleAppServerInstance”)。
resource “aws_instance” “app_server” {
ami = “ami-08d70e59c07c61a3a”
instance_type = “t2.micro”
tags = {
terraform apply
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
Terraform will perform the following actions:
aws_instance.app_server will be created
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only ‘yes’ will be accepted to approve.
Enter a value: yes
aws_instance.app_server: Creating…
aws_instance.app_server: Still creating… [10s elapsed]
aws_instance.app_server: Still creating… [20s elapsed]
aws_instance.app_server: Still creating… [30s elapsed]
aws_instance.app_server: Still creating… [40s elapsed]
aws_instance.app_server: Creation complete after 50s [id=i-0bf954919ed765de1]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
复制
现在再次应用配置,这次通过使用标志传入变量来覆盖默认实例名称-var。NameTerraform 将使用新名称更新实例的标签。使用 响应确认提示yes。
terraform apply -var “instance_name=YetAnotherName”
aws_instance.app_server: Refreshing state… [id=i-0bf954919ed765de1]
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
~ update in-place
Terraform will perform the following actions:
resource “aws_instance” “app_server” {
id = “i-0bf954919ed765de1”
(4 unchanged blocks hidden)
}
Plan: 0 to add, 1 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only ‘yes’ will be accepted to approve.
Enter a value: yes
aws_instance.app_server: Modifying… [id=i-0bf954919ed765de1]
aws_instance.app_server: Modifications complete after 7s [id=i-0bf954919ed765de1]
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
复制
通过命令行设置变量不会保存它们的值。Terraform 支持多种使用和设置变量的方法,因此您可以避免在执行命令时重复输入它们。要了解更多信息,请按照我们的深入教程使用变量自定义 Terraform 配置。
在上一教程中,您使用输入变量来参数化 Terraform 配置。在本教程中,您将使用输出值向 Terraform 用户提供有用的信息。
如果您尚未完成“定义输入变量” 教程,请在学习本教程之前先完成此教程。
初始配置
完成前面的教程后,您将拥有一个learn-terraform-aws-instance使用以下配置命名的目录。
terraform {
required_providers {
aws = {
source = “hashicorp/aws”
version = “~> 4.16”
}
}
required_version = “>= 1.2.0”
}
provider “aws” {
region = “us-west-2”
}
resource “aws_instance” “app_server” {
ami = “ami-08d70e59c07c61a3a”
instance_type = “t2.micro”
tags = {
Name = var.instance_name
}
}
variable “instance_name” {
description = “Value of the Name tag for the EC2 instance”
type = string
default = “ExampleAppServerInstance”
}
复制
确保您的配置与此匹配,并且您已在learn-terraform-aws-instance目录中初始化您的配置。
terraform init
复制
在继续本教程之前应用配置。使用 响应确认提示yes。
terraform apply
复制
输出 EC2 实例配置
outputs.tf在您的目录中创建一个名为的文件learn-terraform-aws-instance。
添加以下配置以outputs.tf定义 EC2 实例的 ID 和 IP 地址的输出。
output “instance_id” {
description = “ID of the EC2 instance”
value = aws_instance.app_server.id
}
output “instance_public_ip” {
description = “Public IP address of the EC2 instance”
value = aws_instance.app_server.public_ip
}
复制
检查输出值
您必须先应用此配置,然后才能使用这些输出值。立即应用您的配置。使用 响应确认提示yes。
terraform apply
aws_instance.app_server: Refreshing state… [id=i-0bf954919ed765de1]
Changes to Outputs:
You can apply this plan to save these new output values to the Terraform state,
without changing any real infrastructure.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only ‘yes’ will be accepted to approve.
Enter a value: yes
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
instance_id = “i-0bf954919ed765de1”
instance_public_ip = “54.186.202.254”
复制
当您应用配置时,Terraform 会将输出值打印到屏幕上。使用命令查询输出terraform output。
terraform output
instance_id = “i-0bf954919ed765de1”
instance_public_ip = “54.186.202.254”
复制
您可以使用 Terraform 输出将 Terraform 项目与基础设施的其他部分或其他 Terraform 项目连接。要了解更多信息,请按照我们的深入教程“从 Terraform 输出数据”。
破坏基础设施
提示
如果您打算继续学习后续教程,请跳过此销毁步骤。
摧毁你的基础设施。使用 响应确认提示yes。
terraform destroy
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
Terraform will perform the following actions:
aws_instance.app_server will be destroyed
Plan: 0 to add, 0 to change, 1 to destroy.
Changes to Outputs:
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only ‘yes’ will be accepted to confirm.
Enter a value: yes
aws_instance.app_server: Destroying… [id=i-0bf954919ed765de1]
aws_instance.app_server: Still destroying… [id=i-0bf954919ed765de1, 10s elapsed]
aws_instance.app_server: Still destroying… [id=i-0bf954919ed765de1, 20s elapsed]
aws_instance.app_server: Still destroying… [id=i-0bf954919ed765de1, 30s elapsed]
aws_instance.app_server: Destruction complete after 31s
Destroy complete! Resources: 1 destroyed.
存储远程状态
8分钟
|
地形
地形
视频
视频
经常参考这个?创建一个帐户来为教程添加书签。
现在您已经从本地计算机构建、更改和销毁了基础设施。这对于测试和开发来说非常有用,但在生产环境中,您应该保持状态的安全和加密,以便您的团队成员可以访问它以在基础设施上进行协作。做到这一点的最佳方法是在具有共享状态访问权限的远程环境中运行 Terraform。
Terraform Cloud允许团队轻松地对基础设施变更进行版本控制、审核和协作。它还安全地存储变量,包括 API 令牌和访问密钥,并为长期运行的 Terraform 进程提供安全、稳定的环境。
在本教程中,您将把状态迁移到 Terraform Cloud。
先决条件
本教程假设您已完成之前的教程。如果还没有,请创建一个名为 的目录 learn-terraform-aws-instance并将此代码粘贴到名为 的文件中main.tf。
主.tf
复制
terraform {
required_providers {
aws = {
source = “hashicorp/aws”
version = “~> 4.16”
}
}
required_version = “>= 1.2.0”
}
provider “aws” {
region = “us-west-2”
}
resource “aws_instance” “app_server” {
ami = “ami-08d70e59c07c61a3a”
instance_type = “t2.micro”
}
运行terraform init以初始化您的配置目录并下载所需的提供程序。即使您已经在此目录中执行过此操作,重新运行此命令也是安全的。
terraform init
Initializing the backend…
Initializing provider plugins…
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run “terraform init” in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running “terraform plan” to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
复制
接下来,应用您的配置。键入yes以确认建议的更改。
terraform apply
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
Terraform will perform the following actions:
#…
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only ‘yes’ will be accepted to approve.
Enter a value: yes
#…
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
复制
Terraform 配置了 AWS EC2 实例并将有关资源的数据存储在本地状态文件中。
设置 Terraform 云
如果您有 HashiCorp 云平台或 Terraform 云帐户,请使用现有凭据登录。有关如何注册新帐户和创建组织的更详细说明,请查看注册 Terraform Cloud 教程。
接下来,进行修改main.tf以将cloud块添加到您的 Terraform 配置中,并替换organization-name为您的组织名称。
主.tf
terraform {
cloud {
organization = “organization-name”
workspaces {
name = “learn-tfc-aws”
}
}
required_providers {
aws = {
source = “hashicorp/aws”
version = “~> 4.16”
}
}
}
笔记
旧版本的 Terraform 不支持该cloud块,因此您必须使用1.1.0 或更高版本才能遵循本教程。以前的版本可以使用remote后端块来配置 CLI 工作流程和迁移状态。
登录 Terraform 云
接下来,使用终端中的 Terraform CLI 登录您的 Terraform Cloud 帐户。
terraform login
Terraform will request an API token for app.terraform.io using your browser.
If login is successful, Terraform will store the token in plain text in
the following file for use by subsequent commands:
/Users//.terraform.d/credentials.tfrc.json
Do you want to proceed?
Only ‘yes’ will be accepted to confirm.
Enter a value:
复制
使用 a 进行确认yes,然后按照自动打开的浏览器窗口中的工作流程进行操作。当出现提示时,您需要将生成的 API 密钥粘贴到终端中。有关登录的更多详细信息,请参阅使用 Terraform Cloud 验证 CLI 教程。
初始化地形
现在您已经配置了 Terraform Cloud 集成,请运行terraform init以重新初始化您的配置并将状态文件迁移到 Terraform Cloud。当提示确认迁移时输入“yes”。
terraform init
Initializing Terraform Cloud…
Do you wish to proceed?
As part of migrating to Terraform Cloud, Terraform can optionally copy your
current workspace state to the configured Terraform Cloud workspace.
Answer “yes” to copy the latest state snapshot to the configured
Terraform Cloud workspace.
Answer “no” to ignore the existing state and just activate the configured
Terraform Cloud workspace with its existing state, if any.
Should Terraform migrate your existing state?
Enter a value: yes
Initializing provider plugins…
Terraform Cloud has been successfully initialized!
You may now begin working with Terraform Cloud. Try running “terraform plan” to
see any changes that are required for your infrastructure.
If you ever set or change modules or Terraform Settings, run “terraform init”
again to reinitialize your working directory.
复制
既然 Terraform 已将状态文件迁移到 Terraform Cloud,请删除本地状态文件。
rm terraform.tfstate
复制
将 Terraform Cloud 与 CLI 驱动的工作流程结合使用时,您可以选择让 Terraform 远程运行或在本地计算机上运行。使用本地执行时,Terraform Cloud 将在本地计算机上执行 Terraform 并将状态文件远程存储在 Terraform Cloud 中。在本教程中,您将使用远程执行模式。
设置工作区变量
该terraform init步骤learn-tfc-aws在您的 Terraform Cloud 组织中创建了工作区。您必须使用 AWS 凭证配置工作区以对 AWS 提供商进行身份验证。
导航到learn-tfc-awsTerraform Cloud 中的工作区,然后转到工作区的变量页面。在Workspace Variables下,添加您的AWS_ACCESS_KEY_ID和 AWS_SECRET_ACCESS_KEY作为Environment Variables,确保将它们标记为“敏感”。
设置工作区环境变量
应用配置
现在,运行terraform apply以触发 Terraform Cloud 中的运行。Terraform 将显示无需进行任何更改。
terraform apply
No changes. Your infrastructure matches the configuration.
Terraform has compared your real infrastructure against your configuration
and found no differences, so no changes are needed.
复制
这意味着 Terraform 没有检测到您的配置与实际存在的物理资源之间的任何差异。因此,Terraform 不需要做任何事情。
Terraform 现在将您的状态远程存储在 Terraform Cloud 中。远程状态存储使协作变得更加容易,并将状态和秘密信息保留在本地磁盘上。远程状态仅在使用时加载到内存中。
摧毁你的基础设施
确保运行terraform destroy以清理您在这些教程中创建的资源。Terraform 将在 Terraform Cloud 中执行此运行并将输出流式传输到终端窗口。出现提示时,请记住使用 进行确认yes。您还可以通过访问 Terraform Cloud Web UI 中的工作区并确认运行来确认操作。
terraform destroy
Running apply in Terraform Cloud. Output will stream here. Pressing Ctrl-C
will cancel the remote apply if it’s still pending. If the apply started it
will stop streaming the logs, but will not stop the apply running remotely.
Preparing the remote apply…
To view this run in a browser, visit:
https://app.terraform.io/app/hashicorp-training/learn-tfc-aws/runs/run-kovFzCiUSrbMP3sD
Waiting for the plan to start…
Terraform v1.2.0
on linux_amd64
Initializing Terraform configuration…
aws_instance.app_server: Refreshing state… [id=i-0e756c00e19ec8f6b]
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
Terraform will perform the following actions:
aws_instance.app_server will be destroyed
#…
Apply complete! Resources: 0 added, 0 changed, 1 destroyed.