我正在使用Terraform创建一个将竞价型实例用作核心实例的AWS EMR集群。
我知道我可以在bid_price
资源的core_instance_group
块内使用aws_emr_cluster
变量,但是我不想硬编码价格,因为我必须手动更改它们每次实例类型更改时。
使用AWS Web UI,我可以选择“按需使用最高价格” 选项。这正是我要复制的内容,但是在Terraform中。
现在,我正在尝试使用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/生成的图像):
我知道我可以通过使用外部数据源并将aws cli调用的输出传递给jq之类的东西来解决此问题,例如:
aws pricing get-products --filters "Type=TERM_MATCH,Field=sku,Value=8VCNEHQMSCQS4P39" --format-version aws_v1 --service-code AmazonEC2 | jq [........]
但是我想知道是否有任何方法可以完成我要使用纯Terraform进行的操作。预先感谢!
答案 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}"
放在本地人