簡體   English   中英

Terraform 配置未使用其他文件中的 output 來獲取已創建的資源,而是嘗試重新創建它並失敗(安全組 ID)

[英]Terraform config isn't using output from other file for already created resource, instead tries to recreate it and fails (security group id)

在 terraform/aws/global/vpc/security_groups.tf 我有以下代碼來創建我的堡壘安全組,以及 output.tf 文件,如下所示。 但是在 terraform/aws/layers/bastion/main.tf (代碼也在下面)中,我引用了該安全組,因為我需要它的安全組 ID 來創建我的 EC2 實例,我遇到的問題是,而不是從已經由 /vpc/security_groups.tf 配置創建的現有安全組它嘗試創建整個安全組並且運行顯然失敗,因為它已經存在。 如何更改我的代碼以獲取現有 SG 的 ID? 我不想在與我的實例相同的配置文件中創建我的 SG,我的一些安全組在不同資源之間共享。 我正在使用 Terraform 雲和 VPC 有自己的工作區,所以我認為這實際上可能是狀態不同的問題.. 有解決辦法嗎?

terraform/aws/global/vpc/security_groups.tf

    provider "aws" {
    region = "eu-west-1"
}

resource "aws_security_group" "bastion" {
  name        = "Bastion_Terraform"
  description = "Bastion SSH access Terraform"
  vpc_id      = "vpc-12345"

  ingress {
    description = "Bastion SSH"
    from_port   = ##
    to_port     = ##
    protocol    = "##"
    cidr_blocks = ["1.2.3.4/56"]
  }
  ingress {
    description = "Bastion SSH"
    from_port   = ##
    to_port     = ##
    protocol    = "##"
    cidr_blocks = ["1.2.3.4/0"]    
  }
  egress {
    description = "Access to "
    from_port   = ##
    to_port     = ##
    protocol    = "tcp"
    security_groups = ["sg-12345"]
  }
  egress {
    description = "Access to ##"
    from_port   = ##
    to_port     = ##
    protocol    = "tcp"
    security_groups = ["sg-12345"]
  }

  tags = {
    Name = "Bastion Terraform"
  }
}

terraform/aws/global/vpc/outputs.tf

output "bastion-sg" {
  value = aws_security_group.bastion.id
}

terraform/aws/layers/bastion/main.tf

    provider "aws" {
    region = var.region
}

module "vpc" {
    source = "../../global/vpc"
}

module "ec2-instance" {
    source = "terraform-aws-modules/ec2-instance/aws"

    name = "bastion"
    instance_count = 1
    ami = var.image_id
    instance_type = var.instance_type
    vpc_security_group_ids = ["${module.vpc.bastion-sg}"]
    subnet_id = var.subnet
    iam_instance_profile = var.iam_role

    tags = {
        Layer = "Bastion"
    }
}

當您在 TF 模塊中有這樣的子模塊塊時:

module "ec2-instance" {
    source = "terraform-aws-modules/ec2-instance/aws"

    name = "bastion"
    instance_count = 1
    ami = var.image_id
    instance_type = var.instance_type
    vpc_security_group_ids = ["${module.vpc.bastion-sg}"]
    subnet_id = var.subnet
    iam_instance_profile = var.iam_role

    tags = {
        Layer = "Bastion"
    }
}

它不只是引用該子模塊,它創建了一個全新的實例,它僅對父模塊及其 state 唯一。 認為這不是賦值或指針,而是構建一個全新的模塊實例(使用模塊作為模板),並再次創建其所有資源。

您將需要在具有其模塊塊的父模塊中直接引用子模塊的輸出,或者您需要使用 terraform_remote_state 數據源或 Terragrunt 依賴項從 state 文件加載輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM