代码之家  ›  专栏  ›  技术社区  ›  volvox

terragrunt v0.14.9,terraform v0.11.7从第二个环境读取aws vpc id

  •  2
  • volvox  · 技术社区  · 6 年前

    我使用terragrunt来协调创建一个非默认的aws vpc。 我有s3/dynamodb状态管理,vpc代码是一个模块。我有“vpc环境” terraform.tfvars 代码根据 terragrunt README.md .

    我创建了第二个模块,它最终将在这个vpc中创建主机,但现在只想输出它的id。/ 地形.tfvars 用于此模块的实例化。

    1. 我跑 terragrunt apply 在vpc环境目录中-vpc created
    2. 我跑 地形应用 在hosts environment directory-output指令中第二次不起作用(没有错误,但不正确,请参阅下文)。

    这是有一天运行 terragrunt apply-all 在vpc/hosts环境目录的父目录中;我阅读文档时建议使用 terraform_remote_state 要公开vpc id的数据源,所以我在 data.tf 主机文件 模块 :

    data "terraform_remote_state" "vpc" {
        backend = "s3"
        config {
            bucket  = "myBucket"
            key     = "keyToMy/vpcEnvironment.tfstate"
            region  = "stateRegion"
        }
    }
    

    然后,在东道主 模块 outputs.tf ,我指定了要检查分配的输出:

    output "mon_vpc" {
        value = "${data.terraform_remote_state.vpc.id}"
    }
    

    当我在上面运行(2)时,它会退出:

    申请完成!资源:0已添加,0已更改,0已销毁。

    输出:

    周一VPC=2018-06-02 23:14:42.958848954+0000 UTC

    问题:

    1. 我在设置代码时出错了 环境 已配置为从已存在的vpc(terraform状态文件)中正确获取vpc id-希望您提供有关此处更改内容的任何建议。

    2. 看起来我已经成功地获取了vpc的创建日期,而不是它的id,这让代码很困惑-有人知道为什么吗?

    我没有使用社区模块-都是手工创建的。

    编辑:作为对布兰登·米勒的回应,这里还有一点。在我的vpc模块中,我有一个outputs.tf,其中包含其他输出:

    output "aws_vpc.mv.id-op" {
        value = "${aws_vpc.mv.id}"
    }
    

    vpc.tf包含

    resource "aws_vpc" "mv" {
        cidr_block = "${var.vpcCidr}"
        enable_dns_support = true
        enable_dns_hostnames = true
        tags = {
            Name = "mv-vpc-${var.aws_region}"
        }
    }
    

    因为这个cfg导致一个vpc被创建,而且大多数参数是 <computed> ,我假设state将包含足够的数据供其他模块通过咨询state引用(我首先假设terraform在引擎盖下使用aws api,而不是咨询不同的状态键)。

    编辑2:先阅读@brendan miller的所有答案和以下评论。 使用句点会导致一个问题,因为它会混淆terraform(请参阅下面brendan对规范格式的回答):

    Error: output 'mon_vpc': unknown resource 'data.aws_vpc.mv-ds' referenced in variable data.aws_vpc.mv-ds.vpc.id
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Brandon Miller    6 年前

    你命名了你的输出 aws_vpc.mv.id-op 但是当你找回它的时候 id . 你可以试试

    data.terraform_remote_state.vpc.aws_vpc.mv.id
    

    但我不确定Terraform是否会抱怨 . . 但是格式应该总是

    data.terraform_remote_state.<name of the remote state module>.<name of the output>
    

    你提到想用aws api获取这些信息。也可以使用 aws_vpc 数据源。他们的例子使用id,但是你也可以在vpc上使用任何标签。

    这样地:

    data "aws_vpc" "default" {
      filter {
        name   = "tag:Name"
        values = ["example-vpc-name"]
      }
    }
    

    那么你可以用这个来做身份证

    ${data.aws_vpc.default.id}
    

    此外,这将检索所有标记集,例如:

    ${data.aws_vpc.default.tags.Name}
    

    还有苹果酒街区

    ${data.aws_vpc.default.cidr_block}
    

    以及其他一些信息。这对于存储和检索有关vpc的内容非常有用。