Amazon EC2 定价 api 为每种类型的定价提供不同的属性,我如何才能知道我的 ec2 实例在哪个定价下运行。因为在定价 api(即 json 文件)中,亚马逊提供了很少的属性,并且在这些属性中我只能从实例内部获取实例类型。如何得到别人?
[
{
"TDVRYW6K68T4XJHJ.JRTCKXETXF": {
"effectiveDate": "2016-01-01T00:00:00Z",
"offerTermCode": "JRTCKXETXF",
"priceDimensions": {
"TDVRYW6K68T4XJHJ.JRTCKXETXF.6YS6EN2CT7": {
"appliesTo": [],
"beginRange": "0",
"description": "$4.900 per On Demand Linux hs1.8xlarge Instance Hour",
"endRange": "Inf",
"pricePerUnit": {
"USD": "4.9000000000"
},
"rateCode": "TDVRYW6K68T4XJHJ.JRTCKXETXF.6YS6EN2CT7",
"unit": "Hrs"
}
},
"sku": "TDVRYW6K68T4XJHJ",
"termAttributes": {}
},
"attributes": {
"clockSpeed": "2 GHz",
"currentGeneration": "No",
"instanceFamily": "Storage optimized",
"instanceType": "hs1.8xlarge",
"licenseModel": "No License required",
"location": "EU (Ireland)",
"locationType": "AWS Region",
"memory": "117 GiB",
"networkPerformance": "10 Gigabit",
"operatingSystem": "Linux",
"operation": "RunInstances",
"physicalProcessor": "Intel Xeon E5-2650",
"preInstalledSw": "NA",
"processorArchitecture": "64-bit",
"servicecode": "AmazonEC2",
"storage": "24 x 2000",
"tenancy": "Shared",
"usagetype": "EU-BoxUsage:hs1.8xlarge",
"vcpu": "17"
}
}
]
1) 找到您的实例大小和可用区。例如
[ec2-user@ip-10-50-1-171 temp]$ ec2-metadata |grep placement
placement: eu-west-1a
[ec2-user@ip-10-50-1-171 temp]$ ec2-metadata |grep instance-type
instance-type: t2.micro
2) 提取 EC2 定价的正确文件,例如目前 https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/index.json
3)该文件内有“产品”。例如,在产品中找到 eu-west 的 t2.micro
"SYEPG42MVWFMUBT6" : {
"sku" : "SYEPG42MVWFMUBT6",
"productFamily" : "Compute Instance",
"attributes" : {
"servicecode" : "AmazonEC2",
"location" : "EU (Ireland)",
"locationType" : "AWS Region",
"instanceType" : "t2.micro",
"instanceFamily" : "General purpose",
"vcpu" : "1",
"physicalProcessor" : "Intel Xeon Family",
"clockSpeed" : "Up to 3.3 GHz",
"memory" : "1 GiB",
"storage" : "EBS only",
"networkPerformance" : "Low to Moderate",
"processorArchitecture" : "32-bit or 64-bit",
"tenancy" : "Shared",
"operatingSystem" : "SUSE",
"licenseModel" : "No License required",
"usagetype" : "EU-BoxUsage:t2.micro",
"operation" : "RunInstances:000g",
"preInstalledSw" : "NA",
"processorFeatures" : "Intel AVX; Intel Turbo"
}
},
记下该产品的 SKU
4) 接下来找到 json 文件中的“terms”部分。有“按需”和“保留”部分。在“OnDemand”中,感兴趣的产品的 SKU(在上面的示例中为 SYEPG42MVWFMUBT6)被提及一次。在“保留”中有几个不同条款的条目
如果您需要以编程方式执行所有这些步骤,则必须使用 shell 脚本和 jq 之类的工具或用于 json 处理的库(如 python 中包含的库)
我知道这个问题已经很老了,而且我没有有任何明确的证据(如果错误请有人纠正我)但是通过实验我发现要获得您的特定运行实例成本,您真的无法结合使用 EC2 元数据和 https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/price-changes.html API。
这是因为从价格 API 返回的信息适用于近期可供购买的实例的当前报价,而不是您特定的正在运行的实例。
具体来说,您想要找到的是与您的特定实例关联的费率代码,而这是通过调用DescribeInstances找不到的。您可以应用一系列过滤器来很好地猜测您帐户中运行的特定实例的实例成本可能是多少。但是,即使使用一些特定的过滤器(如下所示),我也无法唯一定义特定的实例
{
Filters: [
{
Type: 'TERM_MATCH',
Field: 'ServiceCode',
Value: 'AmazonEC2',
},
{
Type: 'TERM_MATCH',
Field: 'regionCode',
Value: 'us-east-1',
},
{
Type: 'TERM_MATCH',
Field: 'instanceType',
Value: 't3.medium',
},
{
Type: 'TERM_MATCH',
Field: 'marketoption',
Value: 'OnDemand',
},
{
Type: 'TERM_MATCH',
Field: 'operatingSystem',
Value: 'Linux',
},
{
Type: 'TERM_MATCH',
Field: 'tenancy',
Value: 'Shared',
},
],
FormatVersion: 'aws_v1',
NextToken: null,
ServiceCode: 'AmazonEC2',
};
(当用于查询GetProductsAPI
时,上述过滤器会返回大约 50 种不同的价格产品) 如果这里有任何帮助的话是
我一直在使用的一些代码定价页面可能会更容易 编辑: 我与 AWS 支持人员进行了一些合作,找到了一套可行的过滤器解决方案。在此处复制 AWS 的响应:
我了解您想要使用 aws 价目表查询 API 来输出 onDemand t3.medium 实例的定价,但是它会抛出大量相同实例类型的实例的结果,而不是获取您查询的确切 ec2 实例的输出。
当我使用您通过 aws cli get-products 请求提供的相同过滤器时,我能够从端重现相同的行为
1。经过深入研究后,我能够在指南的帮助下使用以下过滤器大幅降低搜索结果2。 命令:
aws pricing get-products --filters file://filters2.json --format-version aws_v1 --service-code AmazonEC2
过滤json文件:
[
{
"Type": "TERM_MATCH",
"Field": "ServiceCode",
"Value": "AmazonEC2"
},
{
"Type": "TERM_MATCH",
"Field": "regionCode",
"Value": "us-east-1"
},
{
"Type": "TERM_MATCH",
"Field": "instanceType",
"Value": "t3.medium"
},
{
"Type": "TERM_MATCH",
"Field": "marketoption",
"Value": "OnDemand"
},
{
"Type": "TERM_MATCH",
"Field": "operatingSystem",
"Value": "Linux"
},
{
"Type": "TERM_MATCH",
"Field": "tenancy",
"Value": "Shared"
},
{
"Type": "TERM_MATCH",
"Field": "preInstalledSw",
"Value": "NA"
},
{
"Type": "TERM_MATCH",
"Field": "licenseModel",
"Value": "No License required"
},
{
"Type": "TERM_MATCH",
"Field": "capacitystatus",
"Value": "Used"
}
]
以下是简而言之的结果:
过滤器中匹配的实例的按需实例价格。
至于仅过滤掉按需实例定价的解决方法,恐怕您必须创建 custon json 查询来仅过滤掉从更新脚本的输出返回的按需实例的值。