如何使用terraform import与模块

121次阅读
没有评论

问题描述

在使用Terraform时,遇到了一个问题。他们的AWS设置非常庞大,使用了多个模块进行分离。用户尝试使用terraform import命令导入一个手动创建的S3存储桶,但是命令无法找到配置文件并报错。用户希望能够正确导入这个资源。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

使用terraform import命令时,需要使用资源地址语法来指定要导入的对象。对于在子模块中声明的资源,可以在地址的开头添加模块路径来引用它们。例如:

terraform import module.assets.aws_s3_bucket.machine-learning BUCKET-NAME

如果不确定要使用哪个地址来导入特定的资源实例,可以运行terraform plan命令查看Terraform提议要创建的实例地址,然后使用相同的地址运行terraform import命令,告诉Terraform使用现有的对象。
对于包含序列(如[0]["foo"])的地址,需要使用转义或引号来确保Shell不会将其解释为自己的元字符,而是将其原样传递给Terraform:
– 在类Unix风格的Shell中,使用单引号使内部地址被视为字面量:

terraform import 'aws_instance.example["foo"]'
  • 在Windows的命令解释器cmd.exe中,使用反斜杠转义任何引号:
terraform import "aws_instance.example[\"foo\"]"

请注意,PowerShell的外部程序转义规则非常麻烦,因此不建议使用PowerShell来运行此类命令。

方案2

首先运行terraform plan命令,然后使用输出中的名称进行导入。目标是导入计划输出中列出的资源,这样下次运行计划时,它们就不会被列为要添加的资源。例如,如果aws_s3_bucket.machine-learning在计划输出中不存在,那么它可能是module.aws_s3_bucket.machine-learning或者根据aws-assets.tf的内容可能是module.aws_s3_bucket.machine-learning[0]

方案3

根据用户提供的截图和代码,可以看出他们的配置已经是正确的。但是,他们仍然遇到了相同的错误。这可能是由于Terraform的一些问题导致的。用户可以尝试运行terraform init命令来安装aws_s3_bucket模块,然后再次尝试导入资源。

总结

在使用Terraform导入资源时,需要使用正确的资源地址语法。对于在子模块中声明的资源,需要在地址的开头添加模块路径。如果不确定要使用哪个地址,可以运行terraform plan命令查看Terraform提议要创建的实例地址。在处理包含序列的地址时,需要使用转义或引号来确保Shell正确解析地址。如果遇到问题,可以尝试运行terraform init命令来安装相关模块。

正文完