Managing Amazon EC2 Instances
Prerequisites
Before you begin, we recommend you read Getting started using the AWS SDK for C++.
Download the example code and build the solution as described in Get started on code examples.
To run the examples, the user profile your code uses to make the requests must have proper permissions in AWS (for the service and the action). For more information, see Providing AWS credentials.
Create an Instance
Create a new Amazon EC2 instance by calling the EC2Client’s RunInstances
function,
providing it with a RunInstancesRequest
Includes
#include <aws/core/Aws.h>
#include <aws/ec2/EC2Client.h>
#include <aws/ec2/model/RunInstancesRequest.h>
#include <iostream>
Code
Aws::EC2::EC2Client ec2Client(clientConfiguration);
Aws::EC2::Model::RunInstancesRequest runRequest;
runRequest.SetImageId(amiId);
runRequest.SetInstanceType(Aws::EC2::Model::InstanceType::t1_micro);
runRequest.SetMinCount(1);
runRequest.SetMaxCount(1);
Aws::EC2::Model::RunInstancesOutcome runOutcome = ec2Client.RunInstances(
runRequest);
if (!runOutcome.IsSuccess()) {
std::cerr << "Failed to launch EC2 instance " << instanceName <<
" based on ami " << amiId << ":" <<
runOutcome.GetError().GetMessage() << std::endl;
return false;
}
const Aws::Vector<Aws::EC2::Model::Instance> &instances = runOutcome.GetResult().GetInstances();
if (instances.empty()) {
std::cerr << "Failed to launch EC2 instance " << instanceName <<
" based on ami " << amiId << ":" <<
runOutcome.GetError().GetMessage() << std::endl;
return false;
}
See the complete example
Start an Instance
To start an Amazon EC2 instance, call the EC2Client’s StartInstances
function, providing
it with a StartInstancesRequest
Includes
#include <aws/ec2/EC2Client.h>
#include <aws/ec2/model/StartInstancesRequest.h>
Code
Aws::EC2::EC2Client ec2Client(clientConfiguration);
Aws::EC2::Model::StartInstancesRequest startRequest;
startRequest.AddInstanceIds(instanceId);
startRequest.SetDryRun(true);
Aws::EC2::Model::StartInstancesOutcome dryRunOutcome = ec2Client.StartInstances(startRequest);
if (dryRunOutcome.IsSuccess()) {
std::cerr
<< "Failed dry run to start instance. A dry run should trigger an error."
<< std::endl;
return false;
} else if (dryRunOutcome.GetError().GetErrorType() !=
Aws::EC2::EC2Errors::DRY_RUN_OPERATION) {
std::cout << "Failed dry run to start instance " << instanceId << ": "
<< dryRunOutcome.GetError().GetMessage() << std::endl;
return false;
}
startRequest.SetDryRun(false);
Aws::EC2::Model::StartInstancesOutcome startInstancesOutcome = ec2Client.StartInstances(startRequest);
if (!startInstancesOutcome.IsSuccess()) {
std::cout << "Failed to start instance " << instanceId << ": " <<
startInstancesOutcome.GetError().GetMessage() << std::endl;
} else {
std::cout << "Successfully started instance " << instanceId <<
std::endl;
}
See the complete example
Stop an Instance
To stop an Amazon EC2 instance, call the EC2Client’s StopInstances
function, providing it
with a StopInstancesRequest
Includes
#include <aws/ec2/model/StopInstancesRequest.h>
Code
Aws::EC2::EC2Client ec2Client(clientConfiguration);
Aws::EC2::Model::StopInstancesRequest request;
request.AddInstanceIds(instanceId);
request.SetDryRun(true);
Aws::EC2::Model::StopInstancesOutcome dryRunOutcome = ec2Client.StopInstances(request);
if (dryRunOutcome.IsSuccess()) {
std::cerr
<< "Failed dry run to stop instance. A dry run should trigger an error."
<< std::endl;
return false;
} else if (dryRunOutcome.GetError().GetErrorType() !=
Aws::EC2::EC2Errors::DRY_RUN_OPERATION) {
std::cout << "Failed dry run to stop instance " << instanceId << ": "
<< dryRunOutcome.GetError().GetMessage() << std::endl;
return false;
}
request.SetDryRun(false);
Aws::EC2::Model::StopInstancesOutcome outcome = ec2Client.StopInstances(request);
if (!outcome.IsSuccess()) {
std::cout << "Failed to stop instance " << instanceId << ": " <<
outcome.GetError().GetMessage() << std::endl;
} else {
std::cout << "Successfully stopped instance " << instanceId <<
std::endl;
}
See the complete example
Reboot an Instance
To reboot an Amazon EC2 instance, call the EC2Client’s RebootInstances
function,
providing it with a RebootInstancesRequest
Includes
#include <aws/ec2/EC2Client.h>
#include <aws/ec2/model/RebootInstancesRequest.h>
#include <iostream>
Code
Aws::EC2::EC2Client ec2Client(clientConfiguration);
Aws::EC2::Model::RebootInstancesRequest request;
request.AddInstanceIds(instanceId);
request.SetDryRun(true);
Aws::EC2::Model::RebootInstancesOutcome dry_run_outcome = ec2Client.RebootInstances(request);
if (dry_run_outcome.IsSuccess()) {
std::cerr
<< "Failed dry run to reboot on instance. A dry run should trigger an error."
<<
std::endl;
return false;
} else if (dry_run_outcome.GetError().GetErrorType()
!= Aws::EC2::EC2Errors::DRY_RUN_OPERATION) {
std::cout << "Failed dry run to reboot instance " << instanceId << ": "
<< dry_run_outcome.GetError().GetMessage() << std::endl;
return false;
}
request.SetDryRun(false);
Aws::EC2::Model::RebootInstancesOutcome outcome = ec2Client.RebootInstances(request);
if (!outcome.IsSuccess()) {
std::cout << "Failed to reboot instance " << instanceId << ": " <<
outcome.GetError().GetMessage() << std::endl;
} else {
std::cout << "Successfully rebooted instance " << instanceId <<
std::endl;
}
See the complete example
Describe Instances
To list your instances, create a DescribeInstancesRequestDescribeInstances
function. It will return a DescribeInstancesResponse
Instances are grouped by reservation. Each reservation corresponds to the call to
StartInstances
that launched the instance. To list your instances, you must first
call the DescribeInstancesResponse
class’ GetReservations
function, and
then call getInstances
on each returned Reservation object.
Includes
#include <aws/ec2/EC2Client.h>
#include <aws/ec2/model/DescribeInstancesRequest.h>
#include <aws/ec2/model/DescribeInstancesResponse.h>
#include <iomanip>
#include <iostream>
Code
Aws::EC2::EC2Client ec2Client(clientConfiguration);
Aws::EC2::Model::DescribeInstancesRequest request;
bool header = false;
bool done = false;
while (!done) {
Aws::EC2::Model::DescribeInstancesOutcome outcome = ec2Client.DescribeInstances(request);
if (outcome.IsSuccess()) {
if (!header) {
std::cout << std::left <<
std::setw(48) << "Name" <<
std::setw(20) << "ID" <<
std::setw(25) << "Ami" <<
std::setw(15) << "Type" <<
std::setw(15) << "State" <<
std::setw(15) << "Monitoring" << std::endl;
header = true;
}
const std::vector<Aws::EC2::Model::Reservation> &reservations =
outcome.GetResult().GetReservations();
for (const auto &reservation: reservations) {
const std::vector<Aws::EC2::Model::Instance> &instances =
reservation.GetInstances();
for (const auto &instance: instances) {
Aws::String instanceStateString =
Aws::EC2::Model::InstanceStateNameMapper::GetNameForInstanceStateName(
instance.GetState().GetName());
Aws::String typeString =
Aws::EC2::Model::InstanceTypeMapper::GetNameForInstanceType(
instance.GetInstanceType());
Aws::String monitorString =
Aws::EC2::Model::MonitoringStateMapper::GetNameForMonitoringState(
instance.GetMonitoring().GetState());
Aws::String name = "Unknown";
const std::vector<Aws::EC2::Model::Tag> &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();
}
std::cout <<
std::setw(48) << name <<
std::setw(20) << instance.GetInstanceId() <<
std::setw(25) << instance.GetImageId() <<
std::setw(15) << typeString <<
std::setw(15) << instanceStateString <<
std::setw(15) << monitorString << std::endl;
}
}
if (!outcome.GetResult().GetNextToken().empty()) {
request.SetNextToken(outcome.GetResult().GetNextToken());
} else {
done = true;
}
} else {
std::cerr << "Failed to describe EC2 instances:" <<
outcome.GetError().GetMessage() << std::endl;
return false;
}
}
Results are paged; you can get further results by passing the value returned from the result
object’s GetNextToken
function to your original request object’s
SetNextToken
function, then using the same request object in your next call to
DescribeInstances
.
See the complete example
Enable Instance Monitoring
You can monitor various aspects of your Amazon EC2 instances, such as CPU and network utilization, available memory, and disk space remaining. To learn more about instance monitoring, see Monitoring Amazon EC2 in the Amazon EC2 User Guide.
To start monitoring an instance, you must create a MonitorInstancesRequestMonitorInstances
function.
Includes
#include <aws/ec2/EC2Client.h>
#include <aws/ec2/model/MonitorInstancesRequest.h>
#include <aws/ec2/model/UnmonitorInstancesRequest.h>
#include <iostream>
Code
Aws::EC2::EC2Client ec2Client(clientConfiguration);
Aws::EC2::Model::MonitorInstancesRequest request;
request.AddInstanceIds(instanceId);
request.SetDryRun(true);
Aws::EC2::Model::MonitorInstancesOutcome dryRunOutcome = ec2Client.MonitorInstances(request);
if (dryRunOutcome.IsSuccess()) {
std::cerr
<< "Failed dry run to enable monitoring on instance. A dry run should trigger an error."
<<
std::endl;
return false;
} else if (dryRunOutcome.GetError().GetErrorType()
!= Aws::EC2::EC2Errors::DRY_RUN_OPERATION) {
std::cerr << "Failed dry run to enable monitoring on instance " <<
instanceId << ": " << dryRunOutcome.GetError().GetMessage() <<
std::endl;
return false;
}
request.SetDryRun(false);
Aws::EC2::Model::MonitorInstancesOutcome monitorInstancesOutcome = ec2Client.MonitorInstances(request);
if (!monitorInstancesOutcome.IsSuccess()) {
std::cerr << "Failed to enable monitoring on instance " <<
instanceId << ": " <<
monitorInstancesOutcome.GetError().GetMessage() << std::endl;
} else {
std::cout << "Successfully enabled monitoring on instance " <<
instanceId << std::endl;
}
See the complete example
Disable Instance Monitoring
To stop monitoring an instance, create an UnmonitorInstancesRequestUnmonitorInstances
function.
Includes
#include <aws/ec2/EC2Client.h>
#include <aws/ec2/model/MonitorInstancesRequest.h>
#include <aws/ec2/model/UnmonitorInstancesRequest.h>
#include <iostream>
Code
Aws::EC2::EC2Client ec2Client(clientConfiguration);
Aws::EC2::Model::UnmonitorInstancesRequest unrequest;
unrequest.AddInstanceIds(instanceId);
unrequest.SetDryRun(true);
Aws::EC2::Model::UnmonitorInstancesOutcome dryRunOutcome = ec2Client.UnmonitorInstances(unrequest);
if (dryRunOutcome.IsSuccess()) {
std::cerr
<< "Failed dry run to disable monitoring on instance. A dry run should trigger an error."
<<
std::endl;
return false;
} else if (dryRunOutcome.GetError().GetErrorType() !=
Aws::EC2::EC2Errors::DRY_RUN_OPERATION) {
std::cout << "Failed dry run to disable monitoring on instance " <<
instanceId << ": " << dryRunOutcome.GetError().GetMessage() <<
std::endl;
return false;
}
unrequest.SetDryRun(false);
Aws::EC2::Model::UnmonitorInstancesOutcome unmonitorInstancesOutcome = ec2Client.UnmonitorInstances(unrequest);
if (!unmonitorInstancesOutcome.IsSuccess()) {
std::cout << "Failed to disable monitoring on instance " << instanceId
<< ": " << unmonitorInstancesOutcome.GetError().GetMessage() <<
std::endl;
} else {
std::cout << "Successfully disable monitoring on instance " <<
instanceId << std::endl;
}
See the complete example
More Information
-
RunInstances in the Amazon EC2 API Reference
-
DescribeInstances in the Amazon EC2 API Reference
-
StartInstances in the Amazon EC2 API Reference
-
StopInstances in the Amazon EC2 API Reference
-
RebootInstances in the Amazon EC2 API Reference
-
DescribeInstances in the Amazon EC2 API Reference
-
MonitorInstances in the Amazon EC2 API Reference
-
UnmonitorInstances in the Amazon EC2 API Reference