导入现有资源到Terraform

#Terraform #IaC

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 中有良好的支持

  1. import block
  2. 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 的工作原理的理解也会有所帮助。