实验步骤
创建 EC2 IAM 角色
导航到
IAM
在左侧菜单中,单击
角色
。单击创建角色
该按钮以创建新的 IAM 角色。在创建角色部分,为角色选择可信实体类型:
AWS 服务
使用案例:EC2
单击下一步
添加权限:现在,您可以看到策略列表。按名称
AdministratorAccess
搜索权限并添加。单击下一步
角色名称:输入
TERRAFORM_EC2
您已成功按名称 TERRAFORM_EC2 创建了一个 IAM 角色。
注意:您可以使用其他名称创建角色,然后将其附加到 EC2 实例
启动 EC2 实例
请确保您位于美国东部(弗吉尼亚北部)us-east-1 区域。
顶部菜单导航到 EC2
左侧面板,单击"实例",然后单击"启动新实例"。
(1)控制台启动实例
(2)选择系统镜像
(3)选择实例类型
(4)配置实例
实例数:输入
1
IAM角色:从列表中选择我们在上面创建的 IAM 角色。
将所有其他设置保留为默认值。单击"下一步:添加存储"
(5)添加存储
(6)添加标签
添加标签:点击添加标签按钮
键:
Name
值:
MyEC2Instance
点击
下一步:配置安全组
(7) 配置安全组
添加 SSH:
. 选择类型: 选择 SSH . 协议:TCP . 端口范围:22 . 源:选择"任何位置"
点击下一步
审核和启动
(8) 审核启动
检查所有选定的设置,无误点击启动
选择现有密钥对,确认并单击启动实例
环境配置
SSH 连接到 EC2 实例
以下命令切换到root权限。
sudo su
以下命令安装本实验所需软件。
yum install git -y
安装 Terraform: 地址
下载仓库代码模版部署
您需要使用
git clone https://github.com/hashicorp/learn-terraform-sensitive-variables.git
命令将代码模版拉取到EC2实例中确保您这些文件在同一位置。
通过运行以下命令初始化 Terraform:
terraform init
注意:
terraform init
将检查所有插件依赖项并下载它们。查看生成计划,请运行以下命令:
terraform plan
创建在
main.tf
配置文件中声明的所有资源 ,请运行以下命令:
terraform apply
您将能够看到将要创建的资源,通过输入
yes
批准所有资源的创建。
terraform apply
命令最多可能需要 2 分钟才能创建资源。
重构数据库凭据
在文本编辑器中打开
main.tf
。在文件底部附近,找到定义数据库的块,重构此配置。首先,在
variables.tf
中声明数据库管理员用户名和密码的输入变量。
variable "db_username" { description = "Database administrator username" type = string sensitive = true } variable "db_password" { description = "Database administrator password" type = string sensitive = true }
请注意,您已将变量声明为
sensitive
。现在更新main.tf
以引用这些变量。
resource "aws_db_instance" "database" { allocated_storage = 5 engine = "mysql" instance_class = "db.t2.micro" - username = "admin" - password = "notasecurepassword" + username = var.db_username + password = var.db_password db_subnet_group_name = aws_db_subnet_group.private.name skip_final_snapshot = true }
如果您现在要执行部署,Terraform 会提示您输入这些新变量的值,因为您尚未为它们分配默认值。但是,手动输入值非常耗时且容易出错。
接下来,您将使用两种不同的方法来设置敏感变量值。
使用tfvars
文件设置值
Terraform 支持使用变量定义文件设置变量值。您可以使用多个变量定义文件,使用单独的文件来设置敏感值或机密值。
创建一个新文件
secret.tfvars
,用于为新变量赋值。
db_username = "admin" db_password = "insecurepassword"
应用这些更改。
terraform apply -var-file="secret.tfvars"
因为您已将新变量标记为敏感变量,所以当您运行计划、应用或销毁命令时,Terraform 会输出
<sensitive value>
。
使用环境变量设置值
当Terraform运行时,它会在您的环境中查找与模式匹配的变量,并将这些值分配给配置中相应的Terraform变量。
使用环境变量为数据库管理员用户名和密码分配值。
export TF_VAR_db_username=admin TF_VAR_db_password=adifferentpassword
现在,运行
terraform apply
,Terraform 会将这些值分配给您的新变量。
引用敏感变量
在 Terraform 配置中使用敏感变量时,可以像使用任何其他变量一样使用它们。
将以下输出值添加到
outputs.tf
。
output "db_connect_string" { description = "MySQL database connection string" value = "Server=${aws_db_instance.database.address}; Database=ExampleDB; Uid=${var.db_username}; Pwd=${var.db_password}" }
现在应用此更改。Terraform 将引发错误,因为输出来自敏感变量。
terraform apply
现在将数据库连接字符串输出标记为
sensitive
,使 Terraform 将其隐藏。
output "db_connect_string" { description = "MySQL database connection string" value = "Server=${aws_db_instance.database.address}; Database=ExampleDB; Uid=${var.db_username}; Pwd=${var.db_password}" + sensitive = true }
应用此更改以查看 Terraform 现在将数据库连接字符串输出。
terraform apply
## ... Outputs: db_connect_string = <sensitive>
状态中的敏感值
使用本地状态文件运行 Terraform 命令时,Terraform 会将状态存储为纯文本(包括变量值),即使您已将其标记为
sensitive
。Terraform 需要将这些值存储在您的状态中,以便它可以告诉您自上次应用配置以来是否更改了它们。
terraform.tfstate "value": "Server=terraform-20210113192204255400000004.ct4cer62f3td.us-east-1.rds.amazonaws.com; Database=ExampleDB; Uid=admin; Pwd=adifferentpassword", "password": "adifferentpassword", ## ...
由于 Terraform 状态可能包含敏感值,因此必须确保状态文件的安全以避免泄露此数据。