问题描述
在使用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
命令来安装相关模块。