Как я могу создать ресурс кластера EMR, который использует точечные экземпляры без жесткого кодирования переменной bid_price? - PullRequest
1 голос
/ 30 мая 2019

Я использую Terraform для создания кластера AWS EMR, который использует точечные экземпляры в качестве основных экземпляров.

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

Используя веб-интерфейс AWS, я могу выбрать «Использовать по требованию в качестве максимальной цены» . Это именно то, что я пытаюсь воспроизвести, но в 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, содержащий сведения об одном продукте (вы можете проверить ответ в примере здесь ). Фактическая цена по запросу скрыта где-то внутри этого 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. Заранее спасибо!

1 Ответ

1 голос
/ 30 мая 2019

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

В Terraform 0.12 вы сможете использовать функцию jsondecode , чтобы получить желаемое, используя приведенное ниже в качестве примера в связанном запросе на извлечение:

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, кроме того подхода, который вы уже предложили для внешнего источника данных. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...