【问题标题】:match tf state with the existing EC2 instance resource将 tf state 与现有 EC2 实例资源匹配
【发布时间】:2020-02-19 20:49:41
【问题描述】:

我有一个存储在 S3 存储桶中的 tf 状态文件,其中包含有关 EC2 实例的部分:

       "attributes": {
                    "ami": "ami-0ed60c7b71b6610a6",
                    "arn": "arn:aws:ec2:eu-west-1:44444444444444:instance/i-07cff2b254b1cde3c",
                    "associate_public_ip_address": "false",
                    "availability_zone": "eu-west-1a",
                    "cpu_core_count": "1",
                    "cpu_threads_per_core": "2",
                    "credit_specification.#": "1",
                    "credit_specification.0.cpu_credits": "standard",
                    "disable_api_termination": "true",
                    "ebs_block_device.#": "2",
                    "ebs_block_device.2279853085.delete_on_termination": "true",
                    "ebs_block_device.2279853085.device_name": "",
                    "ebs_block_device.2279853085.encrypted": "false",
                    "ebs_block_device.2279853085.iops": "100",
                    "ebs_block_device.2279853085.kms_key_id": "",
                    "ebs_block_device.2279853085.snapshot_id": "snap-016c60740e5e35f25",
                    "ebs_block_device.2279853085.volume_id": "vol-03efc2ed4652597a9",
                    "ebs_block_device.2279853085.volume_size": "30",
                    "ebs_block_device.2279853085.volume_type": "gp2",
                    "ebs_block_device.897462451.delete_on_termination": "true",
                    "ebs_block_device.897462451.device_name": "/dev/xvde",
                    "ebs_block_device.897462451.encrypted": "false",
                    "ebs_block_device.897462451.iops": "100",
                    "ebs_block_device.897462451.kms_key_id": "",
                    "ebs_block_device.897462451.snapshot_id": "snap-0d3e70949c825b0e9",
                    "ebs_block_device.897462451.volume_id": "vol-0120f6b2038ec6066",
                    "ebs_block_device.897462451.volume_size": "30",
                    "ebs_block_device.897462451.volume_type": "gp2",
                    "ebs_optimized": "false",
                    "ephemeral_block_device.#": "0",
                    "get_password_data": "false",
                    "iam_instance_profile": "kp-prd-ec2",
                    "id": "i-07cff2b254b1cde3c",
                    "instance_state": "running",
                    "instance_type": "t3.micro",
                    "ipv6_address_count": "0",
                    "ipv6_addresses.#": "0",
                    "key_name": "gdp_-data-admin",
                    "monitoring": "false",
                    "network_interface.#": "0",
                    "password_data": "",
                    "placement_group": "",
                    "primary_network_interface_id": "eni-09e9454cb4954ecde",
                    "private_dns": "ip-10-194-27-15.eu-west-1.compute.internal",
                    "private_ip": "10.194.27.15",
                    "public_dns": "",
                    "public_ip": "",
                    "root_block_device.#": "1",
                    "root_block_device.0.delete_on_termination": "true",
                    "root_block_device.0.encrypted": "false",
                    "root_block_device.0.iops": "240",
                    "root_block_device.0.kms_key_id": "",
                    "root_block_device.0.volume_id": "vol-0d53a53b8825c9889",
                    "root_block_device.0.volume_size": "80",
                    "root_block_device.0.volume_type": "gp2",
                    "security_groups.#": "0",
                    "source_dest_check": "true",
                    "subnet_id": "subnet-53af101a",
                    "tenancy": "default",
                    "user_data": "9306f6c8f4c0679a11f00c8e5dbaf14ef5944e65",

                    "vpc_security_group_ids.#": "3",
                    "vpc_security_group_ids.1370631249": "sg-fb68699f",
                    "vpc_security_group_ids.359020622": "sg-22b0be44",
                    "vpc_security_group_ids.41262993": "sg-3d52f758"

当我运行我的 terraform 时,我知道它想要强制进行一些更改,因此,它必须销毁并再次创建 EC2 实例:

   disable_api_termination:                                             "true" => "true"
      ebs_block_device.#:                                                  "2" => "2"
      ebs_block_device.2279853085.delete_on_termination:                   "true" => "false" (forces new resource)
      ebs_block_device.2279853085.device_name:                             "/dev/xvdd" => "" (forces new resource)
      ebs_block_device.3965576335.delete_on_termination:                   "" => "true" (forces new resource)
      ebs_block_device.3965576335.device_name:                             "" => "/dev/xvdd" (forces new resource)
      ebs_block_device.3965576335.encrypted:                               "" => <computed> (forces new resource)
      ebs_block_device.3965576335.iops:                                    "" => ""
      ebs_block_device.3965576335.kms_key_id:                              "" => <computed> (forces new resource)
      ebs_block_device.3965576335.snapshot_id:                             "" => <computed> (forces new resource)
      ebs_block_device.3965576335.volume_id:                               "" => <computed>
      ebs_block_device.3965576335.volume_size:                             "" => "10" (forces new resource)
      ebs_block_device.3965576335.volume_type:                             "" => "gp2" (forces new resource)
      ebs_block_device.3986656952.delete_on_termination:                   "" => "true" (forces new resource)
      ebs_block_device.3986656952.device_name:                             "" => "/dev/xvde" (forces new resource)
      ebs_block_device.3986656952.encrypted:                               "" => <computed> (forces new resource)
      ebs_block_device.3986656952.iops:                                    "" => ""
      ebs_block_device.3986656952.kms_key_id:                              "" => <computed> (forces new resource)
      ebs_block_device.3986656952.snapshot_id:                             "" => <computed> (forces new resource)
      ebs_block_device.3986656952.volume_id:                               "" => <computed>
      ebs_block_device.3986656952.volume_size:                             "" => "10" (forces new resource)
      ebs_block_device.3986656952.volume_type:                             "" => "gp2" (forces new resource)
      ebs_block_device.897462451.delete_on_termination:                    "true" => "false" (forces new resource)
      ebs_block_device.897462451.device_name:                              "/dev/xvde" => "" (forces new resource)
      ebs_optimized:                                                       "true" => "false" (forces new resource)

我绝对不想重新创建实例,因为它被另一个团队使用,所以我想将 tf 状态与我在控制台中的状态相匹配。请问有什么帮助吗? 如何在不丢失任何数据的情况下执行此操作?

【问题讨论】:

  • 定义资源的 Terraform 代码是什么样的?看起来 Terraform 说您尚未根据状态定义附加到它的 EBS 卷,因此 Terraform 想要删除这些 EBS 卷。但是因为当 EBS 卷直接附加到实例而不是通过单独的 aws_ebs_volumeaws_ebs_volume_attachment 资源时这是不可行的,所以它必须删除整个实例并重建。

标签: amazon-web-services terraform


【解决方案1】:

您可以执行terraform state rm 将资源从当前状态中移除。这将导致 Terraform 尝试创建新资源。因此,您需要执行terraform import 将资源状态导入您的状态文件,并使其成为您要与之匹配的资源的目标。由于您没有共享完整的资源信息,也没有共享您不想更改的 AWS 实例的信息,因此我将列出这些命令,就好像资源称为 foo 并且没有封装在模块中一样,并且好像实例名为id-123456789。如果这不能转化为您的情况,请分享更多信息:

terraform state rm aws_instance.foo
terraform import aws_instance.foo id-123456789

terraform import
terraform state rm

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2013-12-18
    相关资源
    最近更新 更多