导入现有资源到Terraform
Table of Contents
前
记录下用于记录和分享,导入现有资源到 terraform 的最佳实践。
这是terraform 在使用过程中很常见的一种做法,但是在做的过程有些小细节可以没有注意。所以写这边文章来记录和分享一下。
正文
Terraform 管理资源的基本原理是保持远程的资源数据和本地的状态文件一致,所以我们导入资源就是把远程的状态复制到本地
这里假定你已经有了一个 初始化后的 terraform的项目
本地创建空资源
- 在本地创建空资源块来接收导入的状态
空的 aws_ssm_parameter 资源块,将在导入时自动填充,这里以 aws_iam_policy 为例子。
确认资源的命名需要通过 terraform的文档来进行查询,文档提供了相当全面的参数。
那么aws_iam_policy 对应的空结构如下。
resource "aws_iam_policy" "user_limit_access" {
# 参数将在导入之后根据导入的内容进行调整
}
导入远程状态
导入方法有两种,在高版本的 terraform 中有良好的支持
- import block
- Cli
在这里看实际情况选择使用,如果是少数资源使用 CLI 进行命令执行即可,但是如果导入资源数量较多,推荐使用 block形式进行导入。这里两种方式都会列举
Block 形式
import {
to = aws_iam_policy.administrator
id = "arn:aws:iam::123456789012:policy/UsersManageOwnCredentials"
}
Cli 形式
terraform import aws_iam_policy.administrator arn:aws:iam::123456789012:policy/UsersManageOwnCredentials
执行命令后 Terraform 会通过API来拉取资源的远程状态同步到本地,提示 Successful
编辑资源与本地状态一致
Terraform 目的是让资源文件定义的状态与远程一致。所以现在我们需要修改 tf文件让它的配置和 state中保持一致。这样就实现了同步,而不会做任何的变更。
使用下面命令列出现在所有的资源文件的详细状态
terraform show | less
并且进行资源搜索,找到它并且复制。在本次演示中,资源的状态内容如下:
resource "aws_iam_policy" "ssm_user_limit_access" {
name = "ssm-user-limit-access"
path = "/"
policy = jsonencode(
{
Statement = [
{
Action = "ssm:StartSession"
Condition = {
Bool = {
"aws:MultiFactorAuthPresent" = "true"
}
}
Effect = "Allow"
Resource = [
"arn:aws:ec2:ap-east-1:0000:instance/i-kkkkkk",
"arn:aws:ssm:ap-east-1:0000:document/SSM-SessionManagerRunShell"
]
Sid = "VisualEditor0"
},
{
Action = "ssm:TerminateSession"
Effect = "Allow"
Resource = "arn:aws:ssm:*:*:session/$${aws:username}-*"
Sid = "VisualEditor1"
},
]
Version = "2012-10-17"
}
)
tags = {}
tags_all = {}
}
复制状态信息到 资源的tf文件中。
验证 Terraform 配置
在完成配置之后,运行以下命令来验证 Terraform 配置是否正确:
terraform plan
如果一切正常,你将会看到计划输出。如果是 No changes. Your infrastructure matches the configuration. 那就说明我们的本地状态与远程的完全一致没有变化。就完成了这个资源的导入
总结
一个 导入现有的资源到本地的 SOP,对于terraform 的工作原理的理解也会有所帮助。