/*******************************************************************************
* Copyright 2012-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use
* this file except in compliance with the License. A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file.
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
* *****************************************************************************
*
* AWS Tools for Windows (TM) PowerShell (TM)
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
using System.Text;
using Amazon.PowerShell.Common;
using Amazon.Runtime;
using Amazon.EC2;
using Amazon.EC2.Model;
namespace Amazon.PowerShell.Cmdlets.EC2
{
///
/// Describes the specified instances or all instances.
///
///
///
/// If you specify instance IDs, the output includes information for only the specified
/// instances. If you specify filters, the output includes information for only those
/// instances that meet the filter criteria. If you do not specify instance IDs or filters,
/// the output includes information for all instances, which can affect performance. We
/// recommend that you use pagination to ensure that the operation returns quickly and
/// successfully.
///
/// If you specify an instance ID that is not valid, an error is returned. If you specify
/// an instance that you do not own, it is not included in the output.
///
/// Recently terminated instances might appear in the returned results. This interval
/// is usually less than one hour.
///
/// If you describe instances in the rare case where an Availability Zone is experiencing
/// a service disruption and you specify instance IDs that are in the affected zone, or
/// do not specify any instance IDs at all, the call fails. If you describe instances
/// and specify only instance IDs that are in an unaffected zone, the call works normally.
///
In the AWS.Tools.EC2 module, this cmdlet automatically pages all available results to the pipeline - parameters related to iteration are only needed if you want to manually control the paginated output. To disable autopagination, use -NoAutoIteration.
///
[Cmdlet("Get", "EC2Instance")]
[OutputType("Amazon.EC2.Model.Reservation")]
[AWSCmdlet("Calls the Amazon Elastic Compute Cloud (EC2) DescribeInstances API operation.", Operation = new[] {"DescribeInstances"}, SelectReturnType = typeof(Amazon.EC2.Model.DescribeInstancesResponse))]
[AWSCmdletOutput("Amazon.EC2.Model.Reservation or Amazon.EC2.Model.DescribeInstancesResponse",
"This cmdlet returns a collection of Amazon.EC2.Model.Reservation objects.",
"The service call response (type Amazon.EC2.Model.DescribeInstancesResponse) can also be referenced from properties attached to the cmdlet entry in the $AWSHistory stack."
)]
public partial class GetEC2InstanceCmdlet : AmazonEC2ClientCmdlet, IExecutor
{
#region Parameter Filter
///
///
/// The filters.affinity
- The affinity setting for an instance running on a Dedicated
/// Host (default
| host
).architecture
- The instance architecture (i386
| x86_64
/// | arm64
).availability-zone
- The Availability Zone of the instance.block-device-mapping.attach-time
- The attach time for an EBS volume
/// mapped to the instance, for example, 2010-09-15T17:15:20.000Z
.block-device-mapping.delete-on-termination
- A Boolean that indicates
/// whether the EBS volume is deleted on instance termination.block-device-mapping.device-name
- The device name specified in the
/// block device mapping (for example, /dev/sdh
or xvdh
).block-device-mapping.status
- The status for the EBS volume (attaching
/// | attached
| detaching
| detached
).block-device-mapping.volume-id
- The volume ID of the EBS volume.capacity-reservation-id
- The ID of the Capacity Reservation into which
/// the instance was launched.client-token
- The idempotency token you provided when you launched
/// the instance.dns-name
- The public DNS name of the instance.hibernation-options.configured
- A Boolean that indicates whether the
/// instance is enabled for hibernation. A value of true
means that the instance
/// is enabled for hibernation. host-id
- The ID of the Dedicated Host on which the instance is running,
/// if applicable.hypervisor
- The hypervisor type of the instance (ovm
|
/// xen
). The value xen
is used for both Xen and Nitro hypervisors.iam-instance-profile.arn
- The instance profile associated with the
/// instance. Specified as an ARN.image-id
- The ID of the image used to launch the instance.instance-id
- The ID of the instance.instance-lifecycle
- Indicates whether this is a Spot Instance or a
/// Scheduled Instance (spot
| scheduled
).instance-state-code
- The state of the instance, as a 16-bit unsigned
/// integer. The high byte is used for internal purposes and should be ignored. The low
/// byte is set based on the state represented. The valid values are: 0 (pending), 16
/// (running), 32 (shutting-down), 48 (terminated), 64 (stopping), and 80 (stopped).instance-state-name
- The state of the instance (pending
/// | running
| shutting-down
| terminated
| stopping
/// | stopped
).instance-type
- The type of instance (for example, t2.micro
).instance.group-id
- The ID of the security group for the instance. instance.group-name
- The name of the security group for the instance.
/// ip-address
- The public IPv4 address of the instance.kernel-id
- The kernel ID.key-name
- The name of the key pair used when the instance was launched.launch-index
- When launching multiple instances, this is the index
/// for the instance in the launch group (for example, 0, 1, 2, and so on). launch-time
- The time when the instance was launched, in the ISO 8601
/// format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example, 2021-09-29T11:04:43.305Z
.
/// You can use a wildcard (*
), for example, 2021-09-29T*
, which
/// matches an entire day.metadata-options.http-tokens
- The metadata request authorization state
/// (optional
| required
)metadata-options.http-put-response-hop-limit
- The HTTP metadata request
/// put response hop limit (integer, possible values 1
to 64
)metadata-options.http-endpoint
- The status of access to the HTTP metadata
/// endpoint on your instance (enabled
| disabled
)metadata-options.instance-metadata-tags
- The status of access to instance
/// tags from the instance metadata (enabled
| disabled
)monitoring-state
- Indicates whether detailed monitoring is enabled
/// (disabled
| enabled
).network-interface.addresses.private-ip-address
- The private IPv4 address
/// associated with the network interface.network-interface.addresses.primary
- Specifies whether the IPv4 address
/// of the network interface is the primary private IPv4 address.network-interface.addresses.association.public-ip
- The ID of the association
/// of an Elastic IP address (IPv4) with a network interface.network-interface.addresses.association.ip-owner-id
- The owner ID of
/// the private IPv4 address associated with the network interface.network-interface.association.public-ip
- The address of the Elastic
/// IP address (IPv4) bound to the network interface.network-interface.association.ip-owner-id
- The owner of the Elastic
/// IP address (IPv4) associated with the network interface.network-interface.association.allocation-id
- The allocation ID returned
/// when you allocated the Elastic IP address (IPv4) for your network interface.network-interface.association.association-id
- The association ID returned
/// when the network interface was associated with an IPv4 address.network-interface.attachment.attachment-id
- The ID of the interface
/// attachment.network-interface.attachment.instance-id
- The ID of the instance to
/// which the network interface is attached.network-interface.attachment.instance-owner-id
- The owner ID of the
/// instance to which the network interface is attached.network-interface.attachment.device-index
- The device index to which
/// the network interface is attached.network-interface.attachment.status
- The status of the attachment (attaching
/// | attached
| detaching
| detached
).network-interface.attachment.attach-time
- The time that the network
/// interface was attached to an instance.network-interface.attachment.delete-on-termination
- Specifies whether
/// the attachment is deleted when an instance is terminated.network-interface.availability-zone
- The Availability Zone for the
/// network interface.network-interface.description
- The description of the network interface.network-interface.group-id
- The ID of a security group associated with
/// the network interface.network-interface.group-name
- The name of a security group associated
/// with the network interface.network-interface.ipv6-addresses.ipv6-address
- The IPv6 address associated
/// with the network interface.network-interface.mac-address
- The MAC address of the network interface.network-interface.network-interface-id
- The ID of the network interface.network-interface.owner-id
- The ID of the owner of the network interface.network-interface.private-dns-name
- The private DNS name of the network
/// interface.network-interface.requester-id
- The requester ID for the network interface.network-interface.requester-managed
- Indicates whether the network
/// interface is being managed by Amazon Web Services.network-interface.status
- The status of the network interface (available
)
/// | in-use
).network-interface.source-dest-check
- Whether the network interface
/// performs source/destination checking. A value of true
means that checking
/// is enabled, and false
means that checking is disabled. The value must
/// be false
for the network interface to perform network address translation
/// (NAT) in your VPC.network-interface.subnet-id
- The ID of the subnet for the network interface.network-interface.vpc-id
- The ID of the VPC for the network interface.outpost-arn
- The Amazon Resource Name (ARN) of the Outpost.owner-id
- The Amazon Web Services account ID of the instance owner.placement-group-name
- The name of the placement group for the instance.placement-partition-number
- The partition in which the instance is
/// located.platform
- The platform. To list only Windows instances, use windows
.private-dns-name
- The private IPv4 DNS name of the instance.private-ip-address
- The private IPv4 address of the instance.product-code
- The product code associated with the AMI used to launch
/// the instance.product-code.type
- The type of product code (devpay
|
/// marketplace
).ramdisk-id
- The RAM disk ID.reason
- The reason for the current state of the instance (for example,
/// shows "User Initiated [date]" when you stop or terminate the instance). Similar to
/// the state-reason-code filter.requester-id
- The ID of the entity that launched the instance on your
/// behalf (for example, Amazon Web Services Management Console, Auto Scaling, and so
/// on).reservation-id
- The ID of the instance's reservation. A reservation
/// ID is created any time you launch an instance. A reservation ID has a one-to-one relationship
/// with an instance launch request, but can be associated with more than one instance
/// if you launch multiple instances using the same launch request. For example, if you
/// launch one instance, you get one reservation ID. If you launch ten instances using
/// the same launch request, you also get one reservation ID.root-device-name
- The device name of the root device volume (for example,
/// /dev/sda1
).root-device-type
- The type of the root device volume (ebs
/// | instance-store
).source-dest-check
- Indicates whether the instance performs source/destination
/// checking. A value of true
means that checking is enabled, and false
/// means that checking is disabled. The value must be false
for the instance
/// to perform network address translation (NAT) in your VPC. spot-instance-request-id
- The ID of the Spot Instance request.state-reason-code
- The reason code for the state change.state-reason-message
- A message that describes the state change.subnet-id
- The ID of the subnet for the instance.tag:<key>
- The key/value combination of a tag assigned to the
/// resource. Use the tag key in the filter name and the tag value as the filter value.
/// For example, to find all resources that have a tag with the key Owner
/// and the value TeamA
, specify tag:Owner
for the filter name
/// and TeamA
for the filter value.tag-key
- The key of a tag assigned to the resource. Use this filter
/// to find all resources that have a tag with a specific key, regardless of the tag value.tenancy
- The tenancy of an instance (dedicated
| default
/// | host
).virtualization-type
- The virtualization type of the instance (paravirtual
/// | hvm
).vpc-id
- The ID of the VPC that the instance is running in.
///
///
[System.Management.Automation.Parameter(Position = 1, ValueFromPipelineByPropertyName = true)]
[Alias("Filters")]
public Amazon.EC2.Model.Filter[] Filter { get; set; }
#endregion
#region Parameter InstanceId
///
///
/// The instance IDs.Default: Describes all your instances.
///
///
[System.Management.Automation.Parameter(Position = 0, ValueFromPipelineByPropertyName = true, ValueFromPipeline = true)]
[Alias("InstanceIds")]
public object[] InstanceId { get; set; }
#endregion
#region Parameter MaxResult
///
///
/// The maximum number of items to return for this request. To get the next page of items,
/// make another request with the token returned in the output. For more information,
/// see Pagination.You cannot specify this parameter and the instance IDs parameter in the same request.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
[Alias("MaxResults")]
public System.Int32? MaxResult { get; set; }
#endregion
#region Parameter NextToken
///
///
/// The token returned from a previous paginated request. Pagination continues from the
/// end of the items returned by the previous request.
///
///
///
Note: In the AWS.Tools.EC2 module, this parameter is only used if you are manually controlling output pagination of the service API call.
///
In order to manually control output pagination, use '-NextToken $null' for the first call and '-NextToken $AWSHistory.LastServiceResponse.NextToken' for subsequent calls.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public System.String NextToken { get; set; }
#endregion
#region Parameter Select
///
/// Use the -Select parameter to control the cmdlet output. The default value is 'Reservations'.
/// Specifying -Select '*' will result in the cmdlet returning the whole service response (Amazon.EC2.Model.DescribeInstancesResponse).
/// Specifying the name of a property of type Amazon.EC2.Model.DescribeInstancesResponse will result in that property being returned.
/// Specifying -Select '^ParameterName' will result in the cmdlet returning the selected cmdlet parameter value.
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public string Select { get; set; } = "Reservations";
#endregion
#region Parameter PassThru
///
/// Changes the cmdlet behavior to return the value passed to the InstanceId parameter.
/// The -PassThru parameter is deprecated, use -Select '^InstanceId' instead. This parameter will be removed in a future version.
///
[System.Obsolete("The -PassThru parameter is deprecated, use -Select '^InstanceId' instead. This parameter will be removed in a future version.")]
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public SwitchParameter PassThru { get; set; }
#endregion
#region Parameter NoAutoIteration
#if MODULAR
///
/// By default the cmdlet will auto-iterate and retrieve all results to the pipeline by performing multiple
/// service calls. If set, the cmdlet will retrieve only the next 'page' of results using the value of NextToken
/// as the start point.
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public SwitchParameter NoAutoIteration { get; set; }
#endif
#endregion
protected override void ProcessRecord()
{
this._AWSSignerType = "v4";
base.ProcessRecord();
var context = new CmdletContext();
// allow for manipulation of parameters prior to loading into context
PreExecutionContextLoad(context);
#pragma warning disable CS0618, CS0612 //A class member was marked with the Obsolete attribute
if (ParameterWasBound(nameof(this.Select)))
{
context.Select = CreateSelectDelegate(Select) ??
throw new System.ArgumentException("Invalid value for -Select parameter.", nameof(this.Select));
if (this.PassThru.IsPresent)
{
throw new System.ArgumentException("-PassThru cannot be used when -Select is specified.", nameof(this.Select));
}
}
else if (this.PassThru.IsPresent)
{
context.Select = (response, cmdlet) => this.InstanceId;
}
#pragma warning restore CS0618, CS0612 //A class member was marked with the Obsolete attribute
if (this.Filter != null)
{
context.Filter = new List(this.Filter);
}
if (this.InstanceId != null)
{
context.InstanceId = AmazonEC2Helper.InstanceParamToIDs(this.InstanceId);
}
context.MaxResult = this.MaxResult;
context.NextToken = this.NextToken;
// allow further manipulation of loaded context prior to processing
PostExecutionContextLoad(context);
var output = Execute(context) as CmdletOutput;
ProcessOutput(output);
}
#region IExecutor Members
#if MODULAR
public object Execute(ExecutorContext context)
{
var cmdletContext = context as CmdletContext;
#pragma warning disable CS0618, CS0612 //A class member was marked with the Obsolete attribute
var useParameterSelect = this.Select.StartsWith("^") || this.PassThru.IsPresent;
#pragma warning restore CS0618, CS0612 //A class member was marked with the Obsolete attribute
// create request and set iteration invariants
var request = new Amazon.EC2.Model.DescribeInstancesRequest();
if (cmdletContext.Filter != null)
{
request.Filters = cmdletContext.Filter;
}
if (cmdletContext.InstanceId != null)
{
request.InstanceIds = cmdletContext.InstanceId;
}
if (cmdletContext.MaxResult != null)
{
request.MaxResults = cmdletContext.MaxResult.Value;
}
// Initialize loop variant and commence piping
var _nextToken = cmdletContext.NextToken;
var _userControllingPaging = this.NoAutoIteration.IsPresent || ParameterWasBound(nameof(this.NextToken));
var client = Client ?? CreateClient(_CurrentCredentials, _RegionEndpoint);
do
{
request.NextToken = _nextToken;
CmdletOutput output;
try
{
var response = CallAWSServiceOperation(client, request);
object pipelineOutput = null;
if (!useParameterSelect)
{
pipelineOutput = cmdletContext.Select(response, this);
}
output = new CmdletOutput
{
PipelineOutput = pipelineOutput,
ServiceResponse = response
};
_nextToken = response.NextToken;
}
catch (Exception e)
{
output = new CmdletOutput { ErrorResponse = e };
}
ProcessOutput(output);
} while (!_userControllingPaging && AutoIterationHelpers.HasValue(_nextToken));
if (useParameterSelect)
{
WriteObject(cmdletContext.Select(null, this));
}
return null;
}
#else
public object Execute(ExecutorContext context)
{
var cmdletContext = context as CmdletContext;
// create request
var request = new Amazon.EC2.Model.DescribeInstancesRequest();
if (cmdletContext.Filter != null)
{
request.Filters = cmdletContext.Filter;
}
if (cmdletContext.InstanceId != null)
{
request.InstanceIds = cmdletContext.InstanceId;
}
if (cmdletContext.MaxResult != null)
{
request.MaxResults = cmdletContext.MaxResult.Value;
}
if (cmdletContext.NextToken != null)
{
request.NextToken = cmdletContext.NextToken;
}
CmdletOutput output;
// issue call
var client = Client ?? CreateClient(_CurrentCredentials, _RegionEndpoint);
try
{
var response = CallAWSServiceOperation(client, request);
object pipelineOutput = null;
pipelineOutput = cmdletContext.Select(response, this);
output = new CmdletOutput
{
PipelineOutput = pipelineOutput,
ServiceResponse = response
};
}
catch (Exception e)
{
output = new CmdletOutput { ErrorResponse = e };
}
return output;
}
#endif
public ExecutorContext CreateContext()
{
return new CmdletContext();
}
#endregion
#region AWS Service Operation Call
private Amazon.EC2.Model.DescribeInstancesResponse CallAWSServiceOperation(IAmazonEC2 client, Amazon.EC2.Model.DescribeInstancesRequest request)
{
Utils.Common.WriteVerboseEndpointMessage(this, client.Config, "Amazon Elastic Compute Cloud (EC2)", "DescribeInstances");
try
{
#if DESKTOP
return client.DescribeInstances(request);
#elif CORECLR
return client.DescribeInstancesAsync(request).GetAwaiter().GetResult();
#else
#error "Unknown build edition"
#endif
}
catch (AmazonServiceException exc)
{
var webException = exc.InnerException as System.Net.WebException;
if (webException != null)
{
throw new Exception(Utils.Common.FormatNameResolutionFailureMessage(client.Config, webException.Message), webException);
}
throw;
}
}
#endregion
internal partial class CmdletContext : ExecutorContext
{
public List Filter { get; set; }
public List InstanceId { get; set; }
public System.Int32? MaxResult { get; set; }
public System.String NextToken { get; set; }
public System.Func Select { get; set; } =
(response, cmdlet) => response.Reservations;
}
}
}