Получите стоимость ресурсов AWS на основе определенного тега

Я создал разные ресурсы AWS в EC2, хранилище, балансировщике нагрузки, сетях и т. Д. Я пометил каждый ресурс GroupName как ключ и значение, которое отличается для каждой группы, например. group1, group2 и т. Д.

Теперь я хочу узнать стоимость каждой группы. Я написал следующий код

    GroupDefinition groupDefinition =
        new GroupDefinition().withType(GroupDefinitionType.TAG).withKey("Cluster");

    GetCostAndUsageRequest costAndUsageRequest
        = new GetCostAndUsageRequest()
          .withGroupBy(groupDefinition)
          .withGranularity("MONTHLY")
          .withMetrics("UnblendedCost");

    GetCostAndUsageResult costAndUsage = 
         awsCostExplorer.getCostAndUsage(costAndUsageRequest);

Теперь я ожидаю, что у costAndUsage есть группы на основе каждого тега. Но это всегда дает мне полный счет. Я могу присвоить withKey любое случайное значение, но результат всегда один и тот же.

Зависимость от Maven:

    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk</artifactId>
        <version>1.11.453</version>
    </dependency>

Это ответ, который я получаю (первый resultByTime для краткости)

{
   "timePeriod":{
      "start":"2018-11-01",
      "end":"2018-12-01"
   },
   "total":{

   },
   "groups":[
      {
         "keys":[
            "Cluster$"
         ],
         "metrics":{
            "UnblendedCost":{
               "amount":"26712.9751185906",
               "unit":"USD"
            }
         }
      }
   ],
   "estimated":false
}

Я бы хотел

Cluster1 -> 1500 USD Cluster2 -> 1000 USD

Предположим, у меня есть куча ресурсов, помеченных ключом Cluster и значениями Cluster1 и Cluster2.

В ответе нет группировки по каждому фактическому значению тега. Что мне здесь не хватает?


person Ganesh Satpute    schedule 29.11.2018    source источник
comment
Какую версию API вы используете? Можете ли вы поделиться документацией, которую вы просмотрели?   -  person Dvir669    schedule 02.12.2018
comment
К сожалению, для этого не так много документации. Для этого вам просто нужно покопаться в исходном коде клиента. Вот ссылка: aws.amazon.com/sdk-for-java   -  person Ganesh Satpute    schedule 03.12.2018
comment
Я добавил клиентские версии SDK.   -  person Ganesh Satpute    schedule 03.12.2018
comment
Можете указать, как вы обращаетесь к данным ответа?   -  person Dvir669    schedule 03.12.2018
comment
проверьте ответ в документации AWS: docs.aws.amazon .com / aws-cost-management / latest / APIReference /   -  person Dvir669    schedule 03.12.2018
comment
Пока я отлаживаю, я вижу весь ответ. Вопрос не в том, чтобы правильно его проанализировать, это проблема, когда я получаю один и тот же вывод независимо от того, что я передаю в качестве ввода. Например, допустим, у меня есть тег с ключом Cluster. Есть ресурсы со значениями для этого конкретного тега Cluster1 Cluster2. Я ожидаю, что Cluster1 -> 1500 USD Cluster2 -> 1000 USD Я получаю одно и то же значение независимо от того, что я сдаю. Если передать несуществующий тег, я получу те же значения.   -  person Ganesh Satpute    schedule 04.12.2018
comment
Единственное, что я могу сказать - это то, что тег не включен в биллинговой консоли и обрабатывает его как несуществующее значение.   -  person Dvir669    schedule 04.12.2018
comment
да. Те не включены. Мы уже просили включить эти теги. Но это сбивает с толку, что API не отклоняет эти запросы.   -  person Ganesh Satpute    schedule 04.12.2018
comment
Вы можете сделать это самостоятельно - перейдите в службу биллинга, слева выберите «Теги распределения затрат», отметьте тег «Кластер» и нажмите «Активировать». Следующий отчет будет содержать ваши теги.   -  person Dvir669    schedule 05.12.2018
comment
К сожалению, моя учетная запись является вспомогательной учетной записью какой-то другой учетной записи. Поэтому это должен сделать владелец родительской учетной записи.   -  person Ganesh Satpute    schedule 05.12.2018
comment
Понятно - Удачи!   -  person Dvir669    schedule 05.12.2018


Ответы (2)


Я не уверен, какую версию SDK вы используете на самом деле, но могу показать вам рабочий код на Ruby (я также группирую по сервису AWS):

credentials = Aws::SharedCredentials.new(profile_name: "REPLACE_profile_name_in_credentials_file")
client = Aws::CostExplorer::Client.new(region: "us-east-1", credentials: credentials)
resp = client.get_cost_and_usage({
      time_period: {
        start: Date.today.at_beginning_of_month.strftime("%Y-%m-%d"), 
        end: Date.tomorrow.strftime("%Y-%m-%d"), 
      },
      granularity: "MONTHLY", 
      metrics: ["UnblendedCost"],
      group_by: [
        {
          type: "DIMENSION", 
          key: "SERVICE",
        },
        {
          type: "TAG",
          key: "Cluster",  
        }
      ]
    })
resp.results_by_time.each do |result|
  #DO SOMETHING
end

Это может дать вам лучшее представление о том, что вам нужно добавить \ отредактировать. Если вы можете поделиться своей документацией и полученным ответом, будет полезно отредактировать и добавить более важную информацию.

person Dvir669    schedule 01.12.2018
comment
Спасибо за ответ @ Dvir669. Не хочу агрегироваться на сервисе. Можно ли будет проверить, работает ли после удаления SERVICE group by field? Кроме того, если изменить значение на Cluster1, вы получите тот же результат? Кроме того, включили ли вы тег Cluster на своем платежном портале AWS? - person Ganesh Satpute; 03.12.2018
comment
Кроме того, я пробовал использовать API так же, как вы. Я обнаружил, что независимо от того, отправляю ли я поле TAG, я получаю тот же результат. - person Ganesh Satpute; 03.12.2018
comment
Я не вижу, что вы делаете с ответом в своем коде - обратите внимание, что любой ответ от этого API имеет ResultsByTime - ›Группы -› Ключи, к которым вам нужно получить доступ, а не поле Total. - person Dvir669; 03.12.2018
comment
Вы можете удалить предложение Service, и оно все равно будет работать. Обратите внимание, что вам нужно использовать ключ тега, а не значение тега. - person Dvir669; 03.12.2018
comment
да. Это именно то, что я делаю (согласно вашим последним двум комментариям). Проблема не в ответе, проблема в получаемых мной значениях. Они одинаковы независимо от того, что я передаю как ключ тега. Логически это то, что я хочу: Cluster1 -> 1500 USD Cluster2 -> 1000 USD Конечно, здесь Cluster1 и Cluster2 - значения тега с именем Cluster. - person Ganesh Satpute; 04.12.2018
comment
Кроме того, активировали ли вы теги биллинга на портале стоимости и биллинга? - person Ganesh Satpute; 04.12.2018
comment
Привет, Ганеш, вы должны включить эти теги в биллинговой консоли, иначе вы не сможете выполнять поиск по нему. docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/ - person Dvir669; 04.12.2018

Код работал правильно. Я не получал должным образом, потому что для родительского счета получателя платежа необходимо выполнить дополнительные действия.

Тебе следует

  1. Перейдите на портал биллинга AWS
  2. Выберите тег, для которого вы хотите включить калькуляцию, в моем случае Cluster
  3. Включить распределение затрат
  4. На это потребуется около 24 часов.

Примечание: если у вас есть субаккаунт AWS, ваш родительский аккаунт получателя платежей будет иметь разрешение на выполнение вышеуказанных действий.

Дополнительные сведения см. В документации.


Через 24 часа, если вы запустите код, вы увидите ответ, как показано ниже.

{
   "timePeriod":{
      "start":"2018-12-01",
      "end":"2018-12-31"
   },
   "total":{

   },
   "groups":[
      {
         "keys":[
            "Cluster$"
         ],
         "metrics":{
            "UnblendedCost":{
               "amount":"23434.5469766795",
               "unit":"USD"
            }
         }
      },
      {
         "keys":[
            "Cluster$cluster-1"
         ],
         "metrics":{
            "UnblendedCost":{
               "amount":"2343.3888413893",
               "unit":"USD"
            }
         }
      },
      {
         "keys":[
            "Cluster$cluster-2"
         ],
         "metrics":{
            "UnblendedCost":{
               "amount":"23464.8057597427",
               "unit":"USD"
            }
         }
      }
   ],
   "estimated":true
}
person Ganesh Satpute    schedule 17.12.2018