Синтаксическая справка для создания фильтра в aws ec2 descriptioninstance api call в c ++ - PullRequest
0 голосов
/ 29 марта 2019

Использование DescribeInstancesRequest (c ++ sdk) для получения ответа о конкретном instance_id.У меня возникла проблема с созданием фильтра.

Я адаптирую пример кода, предоставленный примером кода aws-doc-sdk-examples c ++ description_instances.cpp.Я добавил код, чтобы отфильтровать ответ и использовать известный действительный (теперь жестко запрограммированный) идентификатор экземпляра.

Я пробовал несколько вариантов, чтобы настроить фильтр, но документы мне не ясны по поводу "формат «пара значений» для фильтра.

Вот полный код.Он компилирует только поиск, но всегда отвечает "Не удалось найти: ..."

Пожалуйста, дайте мне знать, что я ошибаюсь с синтаксисом фильтра!(См. Прокомментированный раздел Фильтрация идентификатора экземпляра)

Спасибо

void Server::set_instance_info()
{
  // Get server instance information via aws sdk
  Aws::SDKOptions options;
  Aws::InitAPI(options);
  {
    /* @TODO Make this a startup config value */
    Aws::Client::ClientConfiguration clientConfig;
    clientConfig.region = "us-west-2";
    Aws::EC2::EC2Client ec2(clientConfig);

    Aws::EC2::Model::DescribeInstancesRequest request;

    // Filter an instance_id
    Aws::EC2::Model::Filter filter;
    filter.SetName("instance_id");
    Aws::String filter_val{"Name=instance_id,Values=i-0e120b44acc929946"};
    Aws::Vector<Aws::String> filter_values;
    filter_values.push_back(filter_val);
    filter.SetValues(filter_values);
    Aws::Vector<Aws::EC2::Model::Filter> DIRFilter;
    DIRFilter.push_back(filter);
    request.SetFilters(DIRFilter);

    auto outcome = ec2.DescribeInstances(request);
    if (outcome.IsSuccess())
    {
      const auto &reservations =
        outcome.GetResult().GetReservations();

      for (const auto &reservation : reservations)
      {
        const auto &instances = reservation.GetInstances();
        for (const auto &instance : instances)
        {
          Aws::String instanceStateString =
            Aws::EC2::Model::InstanceStateNameMapper::GetNameForInstanceStateName(
                instance.GetState().GetName());

          Aws::String type_string =
            Aws::EC2::Model::InstanceTypeMapper::GetNameForInstanceType(
                instance.GetInstanceType());

          Aws::String name = "Unknown";
          const auto &tags = instance.GetTags();
          auto nameIter = std::find_if(tags.cbegin(), tags.cend(),
              [](const Aws::EC2::Model::Tag &tag)
              {
              return tag.GetKey() == "Name";
              });
          if (nameIter != tags.cend())
          {
            name = nameIter->GetValue();
          }
          Server::id_ = instance.GetInstanceId();
          Server::name_ = name;
          Server::type_ = type_string;
          Server::dn_ = "Not implemented";
          Server::ip_ = "Not implmented";
        }
      }
    } else {
      Server::id_ = "Could not find: " + filter_val;;
      Server::name_ = "";
      Server::type_ = "";
      Server::dn_ = "";
      Server::ip_ = "";
    }
  }
  return;
}

1 Ответ

0 голосов
/ 29 марта 2019

Я просто не мог заставить фильтр работать. Любой вклад будет оценен. Однако есть альтернативный метод, использующий функцию-член WithInstanceIds. Чтение документации по API - это всегда хорошая идея !!

Вот подпрограмма, которая работает:

void Server::set_instance_info()
{
  // Get server instance information via aws sdk
  Aws::SDKOptions options;
  Aws::InitAPI(options);
  {
    /* @TODO Make this a startup config value */
    Aws::Client::ClientConfiguration clientConfig;
    clientConfig.region = "us-west-2";
    Aws::EC2::EC2Client ec2(clientConfig);

    Aws::EC2::Model::DescribeInstancesRequest request;

    /* @TODO Make this a startup config value */
    const Aws::String instanceId{"i-0e120b44acc929946"};
    Aws::Vector<Aws::String> instances;
    instances.push_back(instanceId);
    request.WithInstanceIds(instances);

    auto outcome = ec2.DescribeInstances(request);
    if (outcome.IsSuccess())
    {
      const auto &reservations =
        outcome.GetResult().GetReservations();

      for (const auto &reservation : reservations)
      {
        const auto &instances = reservation.GetInstances();
        for (const auto &instance : instances)
        {
          Aws::String instanceStateString =
            Aws::EC2::Model::InstanceStateNameMapper::GetNameForInstanceStateName(
                instance.GetState().GetName());

          Aws::String type_string =
            Aws::EC2::Model::InstanceTypeMapper::GetNameForInstanceType(
                instance.GetInstanceType());

          Aws::String name = "Unknown";
          const auto &tags = instance.GetTags();
          auto nameIter = std::find_if(tags.cbegin(), tags.cend(),
              [](const Aws::EC2::Model::Tag &tag)
              {
              return tag.GetKey() == "Name";
              });
          if (nameIter != tags.cend())
          {
            name = nameIter->GetValue();
          }
          Server::id_ = instance.GetInstanceId();
          Server::name_ = name;
          Server::type_ = type_string;
          Server::dn_ = "Not implemented";
          Server::ip_ = "Not implmented";
        }
      }
    } else {
      Server::id_ = "Could not find: "+ instanceId;
      Server::name_ = "";
      Server::type_ = "";
      Server::dn_ = "";
      Server::ip_ = "";
    }
  }
  return;
}
...