terraform import 为字符串键值引发“需要索引值”错误

Ant*_*ong 3 terraform

如果它是由 terraform 从头开始​​创建的,那么它在状态文件中的样子:

{
  "module": "module.rds",
  "mode": "managed",
  "type": "aws_cloudwatch_log_subscription_filter",
  "name": "rds_logs_delivery",
  "each": "map",
  "provider": "provider.aws",
  "instances": [
    {
      "index_key": "prod-service-master.audit",
      "schema_version": 0,
      "attributes": {
        "destination_arn": "arn:aws:firehose:us-east-5:9999999999:deliverystream/prod-rds-logs",
        "distribution": "ByLogStream",
        "filter_pattern": "",
        "id": "cwlsf-9999999999",
        "log_group_name": "/aws/rds/instance/prod-service-master/audit",
        "name": "rds-logs-delivery-prod-service-master",
        "role_arn": "arn:aws:iam::9999999999:role/cloudwatch-logs-to-kinesis"
      },
      "private": "abcdefg",
      "depends_on": [
        "data.aws_caller_identity.current",
        "data.aws_partition.current",
        "data.terraform_remote_state.kinesis_delivery_stream"
      ]
    },
Run Code Online (Sandbox Code Playgroud)

由于某些原因,我需要将其导入另一个 tf 状态文件。所以我运行了这个命令:

 terraform import module.rds.aws_cloudwatch_log_subscription_filter.rds_logs_delivery["prod-service-reports.audit"] rds-logs-delivery-prod-service-master
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Error: Index value required

  on <import-address> line 1:
   1: module.rds.aws_cloudwatch_log_subscription_filter.rds_logs_delivery[prod-service-reports.audit]

Index brackets must contain either a literal number or a literal string.
Run Code Online (Sandbox Code Playgroud)

我该如何解决?我试过了

  1. 用单引号替换双引号,以及
  2. 没有报价

但我仍然遇到同样的错误。

sik*_*kiv 47

正如@JamesK在上面这个答案中所建议的,只有当您在 Windows 下使用 Linux 或者更具体地说 bash 或 Git Bash 时,才是解决方案。

PowerShell的解决方案如下:

terraform import resource[\`"prod-service-reports.audit\`"] ...
Run Code Online (Sandbox Code Playgroud)

感谢这里的回答:)


Chr*_*our 18

我发现你需要做这样的事情是 powershell core 7

terraform state rm 'resource[\"thing\"]'
Run Code Online (Sandbox Code Playgroud)

更新 2023-01,不知道发生了什么变化,但在 PS7 最新版和 TF 最新版中我不再需要 \ 了,这似乎现在可以使用

terraform state rm 'resource["thing"]'
Run Code Online (Sandbox Code Playgroud)

  • @Lethargos 又点击了这个,其他答案都不起作用,只有这个起作用,这是明显不同的 (4认同)
  • 谢谢你,克里斯。我需要这个语法,因为其他语法不起作用。 (4认同)
  • @Lethargos 不是,我不是,一个答案有反引号,对我来说根本不起作用,另一个答案未能用单引号引起来,对我来说根本不起作用。 (3认同)
  • @Lethargos,但由于缺少单引号,它不起作用 (3认同)

小智 7

您需要转义引号。就像在,

terraform import   module.rds.aws_cloudwatch_log_subscription_filter.rds_logs_delivery[\"prod-service-reports.audit\"] rds-logs-delivery-prod-service-master
Run Code Online (Sandbox Code Playgroud)


小智 5

  1. 导入到配置有“ count ”的资源中

    terraform import 'aws_instance.example[0]' aws-resource-id

  2. 导入到配置有“ for_each ”的资源中

  • Linux、Mac 操作系统和 UNIX

    terraform import 'aws_instance.example["ample"]' aws-resource-id

  • VSCode 和 Powershell

    terraform import 'aws_instance.example[\"ample\"]' aws-resource-id

  • 指令

    terraform import aws_instance.exapmle["ample"] aws-resource-id

以下是 terraform 导入的更多示例,请点击此处