0

Using DescribeInstancesRequest (c++ sdk) to get response about a particular instance_id. I am having a problem constructing the filter.

I am adapting the example code provided by the aws-doc-sdk-examples c++ example code describe_instances.cpp. I have added code to filter the response to use a known valid (now hard coded) instance ID.

I have tried multiple variations to set up the filter, but the docs aren't clear to me about the "value pair" format for the filter.

Here is the complete code. It compiles just find, but always responds with the "Could not find: ..."

Please let me know what I am getting wrong with the filter syntax! (See commented section Filter an instance id)

Thanks

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;
}
Mark S.
  • 27
  • 7

1 Answers1

0

I just couldn't get the filter to work. Any input would be appreciated. However, there is an alternate method using the WithInstanceIds member function. Reading the API docs is always a good idea!!

Here is the subroutine that works:

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;
}
Mark S.
  • 27
  • 7