如何将terraform导入与传入的变量一起使用?

如何将terraform导入与传入的变量一起使用?,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我正在学习terraform,并希望使用该工具设置AWS基础设施 我们有3个AWS环境:沙箱环境、暂存环境和生产环境,并且有支持这些环境的现有基础架构。例如,每个环境有3个独立的专有网络 我想使用terraformimport根据我试图设置的环境导入这些资源的状态。所以我基本上想这样做,虽然我知道这在语法上是不正确的,但是你明白了 $ terraform import aws_vpc.my_vpc -var 'environment=sandbox' 因此,我的模块设置如下 vpc/main.

我正在学习terraform,并希望使用该工具设置AWS基础设施

我们有3个AWS环境:沙箱环境、暂存环境和生产环境,并且有支持这些环境的现有基础架构。例如,每个环境有3个独立的专有网络

我想使用
terraformimport
根据我试图设置的环境导入这些资源的状态。所以我基本上想这样做,虽然我知道这在语法上是不正确的,但是你明白了

$ terraform import aws_vpc.my_vpc -var 'environment=sandbox'
因此,我的模块设置如下

vpc/main.tf
-----------
provider "aws" {
  region = "us-east-1"
}
resource "aws_vpc" "my_vpc" {
  cidr_block = ""
}

vpc/variables.tf
----------------
variable "environment" {
  type map = map(string)
  default {
    sandbox    = "vpc-1234"
    staging    = "vpc-2345"
    production = "vpc-3456"
  }
}
这意味着我基本上想做

$ terraform import aws_vpc.my_vpc vpc-1234
我怎样才能做到这一点呢?

仅供参考

“地形导入”命令用于导入现有地形 基础设施

该命令当前一次只能导入一个资源。这 意味着您还不能将Terraform导入指向整个 资源,如AWS VPC,并导入所有资源。此工作流将 将在未来版本的Terraform中进行改进

传递这些变量的那个变量将被视为子序列模块的输入变量,而不是从环境变量文件中获取值,而是为变量设置值

输入变量用作地形模块的参数,允许 在不改变模块功能的情况下定制模块的各个方面 拥有自己的源代码,并允许在不同的应用程序之间共享模块 配置

导入syantax:

terraform import aws_instance.example i-abcd1234
此命令定位ID为i-abcd1234的AWS实例并附加 它的现有设置(如EC2 API所述)与 地形状态下的aws_instance.example

因此,使用变量处理导入的方法可以是系统环境变量, 由于可以导入ec2,因此该示例基于使用变量导入实例

 export stage_instance=i-abcexample && terraform import aws_instance.ec2 $stage_instance
instance.tf

provider "aws" {
  region              = "us-west-2"
  profile             = "test"
}

resource "aws_instance" "ec2" {
  ami                         = "ami-0f2176987ee50226e"
  instance_type               = "t2.micro"
  associate_public_ip_address = false
  subnet_id                   = "subnet-example"
  vpc_security_group_ids      = ["sg-example"]
  key_name                    = "mytest-ec2key"
  tags = {
    Name = "Test EC2 Instance"
  }
}
要将变量传递给上述脚本,可以使用系统环境变量

 export stage_instance=i-abcexample && terraform import aws_instance.ec2 $stage_instance
或者你也可以试试

export stage_instance=abc && export prod_instance=abc
然后尝试导入

terraform import aws_instance.ec2 $stage_instance

我也遇到了同样的问题,我发现顺序很重要。 此命令可用于:

$ terraform import -var 'environment=sandbox' aws_vpc.my_vpc vpc-1234

这意味着我必须在terraform(.bashrc文件)外部编程
stage_实例
prod_实例
。我希望有一个纯粹的地形解决方案。是的,确切地说,把它们放在bashrc中,或者像我在Answer中发布的那样做。我认为这里的根本原因是工作空间没有映射到环境。根据提供的信息,这可能就是问题所在。