如何创建使用竞价型实例的EMR群集资源,而不用硬编码bid_price变量?

时间:2019-05-30 17:51:41

标签: json amazon-web-services terraform terraform-provider-aws

我正在使用Terraform创建一个将竞价型实例用作核心实例的AWS EMR集群。

我知道我可以在bid_price资源的core_instance_group块内使用aws_emr_cluster变量,但是我不想硬编码价格,因为我必须手动更改它们每次实例类型更改时。

使用AWS Web UI,我可以选择“按需使用最高价格” 选项。这正是我要复制的内容,但是在Terraform中。

on-demand

现在,我正在尝试使用aws_pricing_product数据源解决我的问题。您可以在下面看到我到目前为止的内容:

data "aws_pricing_product" "m4_large_price" {
  service_code = "AmazonEC2"

  filters {
   field = "instanceType"
   value = "m4.large"
  }

  filters {
   field = "operatingSystem"
   value = "Linux"
  }

  filters {
   field = "tenancy"
   value = "Shared"
  }

  filters {
   field = "usagetype"
   value = "BoxUsage:m4.large"
  }

  filters {
   field = "preInstalledSw"
   value = "NA"
  }

  filters {
    field = "location"
    value = "US East (N. Virginia)"
  }
}

data.aws_pricing_product.m4_large_price.result返回包含单个产品详细信息的json(您可以查看示例here的响应)。实际的按需价格埋在此json内的某个位置,但我不知道该如何获得(使用http://jsonviewer.stack.hu/生成的图像)​​:

price-json

我知道我可以通过使用外部数据源并将aws cli调用的输出传递给jq之类的东西来解决此问题,例如:

aws pricing get-products --filters "Type=TERM_MATCH,Field=sku,Value=8VCNEHQMSCQS4P39" --format-version aws_v1 --service-code AmazonEC2 | jq [........]

但是我想知道是否有任何方法可以完成我要使用纯Terraform进行的操作。预先感谢!

2 个答案:

答案 0 :(得分:1)

不幸的是,aws_pricing_product data source docs并未详细介绍如何有效使用它,但是添加了discussion in the pull request的内容却增加了一些见识。

在Terraform 0.12中,您应该能够使用jsondecode function来获得所需的内容,并在链接请求请求中给出以下示例:

data "aws_pricing_product" "example" {
  service_code = "AmazonRedshift"

  filters = [
    {
      field = "instanceType"
      value = "ds1.xlarge"
    },
    {
      field = "location"
      value = "US East (N. Virginia)"
    },
  ]
}

# Potential Terraform 0.12 syntax - may change during implementation
# Also, not sure about the exact attribute reference architecture myself :)
output "example" {
  values = jsondecode(data.json_query.example.value).terms.OnDemand.*.priceDimensions.*.pricePerUnit.USD
}

如果您被困在Terraform <0.12上,那么您可能很难在Terraform中本地执行此操作,而不是已经建议的外部数据源方法。

答案 1 :(得分:1)

@cfelipe将${jsondecode(data.aws_pricing_product.m4_large_price.value).terms.OnDemand.*.priceDimensions.*.pricePerUnit.USD}"放在本地人