= AWS Elastic Compute Cloud (EC2) Component
:doctitle: AWS Elastic Compute Cloud (EC2)
:shortname: aws2-ec2
:artifactid: camel-aws2-ec2
:description: Manage AWS EC2 instances using AWS SDK version 2.x.
:since: 3.1
:supportlevel: Stable
:component-header: Only producer is supported
//Manually maintained attributes
:group: AWS
:camel-spring-boot-name: aws2-ec2

*Since Camel {since}*

*{component-header}*

The AWS2 EC2 component supports the ability to create, run, start, stop and terminate
https://aws.amazon.com/ec2/[AWS EC2] instances.

Prerequisites

You must have a valid Amazon Web Services developer account, and be
signed up to use Amazon EC2. More information is available at
https://aws.amazon.com/ec2/[Amazon EC2].


== URI Format

-------------------------
aws2-ec2://label[?options]
-------------------------

You can append query options to the URI in the following format,
?options=value&option2=value&...


// component-configure options: START

// component-configure options: END

// component options: START
include::partial$component-configure-options.adoc[]
include::partial$component-endpoint-options.adoc[]
// component options: END

// endpoint options: START

// endpoint options: END


Required EC2 component options

You have to provide the amazonEc2Client in the
Registry or your accessKey and secretKey to access
the https://aws.amazon.com/ec2/[Amazon EC2] service.

== Usage

=== Static credentials vs Default Credential Provider

You have the possibility of avoiding the usage of explicit static credentials, by specifying the useDefaultCredentialsProvider option and set it to true.

 - Java system properties - aws.accessKeyId and aws.secretKey
 - Environment variables - AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.
 - Web Identity Token from AWS STS.
 - The shared credentials and config files.
 - Amazon ECS container credentials - loaded from the Amazon ECS if the environment variable AWS_CONTAINER_CREDENTIALS_RELATIVE_URI is set.
 - Amazon EC2 Instance profile credentials. 

For more information about this you can look at https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials.html[AWS credentials documentation]

=== Message headers evaluated by the EC2 producer

[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Header |Type |Description

|`CamelAwsEC2ImageId` |`String` |An image ID of the AWS marketplace

|`CamelAwsEC2InstanceType` |com.amazonaws.services.ec2.model.InstanceType |The instance type we want to create and run

|`CamelAwsEC2Operation` |`String` |The operation we want to perform

|`CamelAwsEC2InstanceMinCount` |`Int` |The mininum number of instances we want to run.

|`CamelAwsEC2InstanceMaxCount` |`Int` |The maximum number of instances we want to run.

|`CamelAwsEC2InstanceMonitoring` |Boolean |Define if we want the running instances to be monitored

|`CamelAwsEC2InstanceEbsOptimized` |`Boolean` |Define if the creating instance is optimized for EBS I/O.

|`CamelAwsEC2InstanceSecurityGroups` |Collection |The security groups to associate to the instances

|`CamelAwsEC2InstancesIds` |`Collection` |A collection of instances IDS to execute start, stop, describe and
terminate operations on.

|`CamelAwsEC2InstancesTags` |`Collection` |A collection of tags to add or remove from EC2 resources
|=======================================================================

== Supported producer operations

- createAndRunInstances
- startInstances
- stopInstances
- terminateInstances
- describeInstances
- describeInstancesStatus
- rebootInstances
- monitorInstances
- unmonitorInstances
- createTags
- deleteTags

== Examples

=== Producer Examples

- createAndRunInstances: this operation will create an EC2 instance and run it

[source,java]
--------------------------------------------------------------------------------
from("direct:createAndRun")
     .setHeader(EC2Constants.IMAGE_ID, constant("ami-fd65ba94"))
     .setHeader(EC2Constants.INSTANCE_TYPE, constant(InstanceType.T2Micro))
     .setHeader(EC2Constants.INSTANCE_MIN_COUNT, constant("1"))
     .setHeader(EC2Constants.INSTANCE_MAX_COUNT, constant("1"))
     .to("aws2-ec2://TestDomain?accessKey=xxxx&secretKey=xxxx&operation=createAndRunInstances");
--------------------------------------------------------------------------------

- startInstances: this operation will start a list of EC2 instances

[source,java]
--------------------------------------------------------------------------------
from("direct:start")
     .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                Collection<String> l = new ArrayList<>();
                l.add("myinstance");
                exchange.getIn().setHeader(AWS2EC2Constants.INSTANCES_IDS, l);
            }
        })
     .to("aws2-ec2://TestDomain?accessKey=xxxx&secretKey=xxxx&operation=startInstances");
--------------------------------------------------------------------------------

- stopInstances: this operation will stop a list of EC2 instances

[source,java]
--------------------------------------------------------------------------------
from("direct:stop")
     .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                Collection<String> l = new ArrayList<>();
                l.add("myinstance");
                exchange.getIn().setHeader(AWS2EC2Constants.INSTANCES_IDS, l);
            }
        })
     .to("aws2-ec2://TestDomain?accessKey=xxxx&secretKey=xxxx&operation=stopInstances");
--------------------------------------------------------------------------------

- terminateInstances: this operation will terminate a list of EC2 instances

[source,java]
--------------------------------------------------------------------------------
from("direct:stop")
     .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                Collection<String> l = new ArrayList<>();
                l.add("myinstance");
                exchange.getIn().setHeader(AWS2EC2Constants.INSTANCES_IDS, l);
            }
        })
     .to("aws2-ec2://TestDomain?accessKey=xxxx&secretKey=xxxx&operation=terminateInstances");
--------------------------------------------------------------------------------

== Using a POJO as body

Sometimes build an AWS Request can be complex, because of multiple options. We introduce the possibility to use a POJO as body.
In AWS EC2 there are multiple operations you can submit, as an example for Create and run an instance, you can do something like:

[source,java]
------------------------------------------------------------------------------------------------------
from("direct:start")
  .setBody(RunInstancesRequest.builder().imageId("test-1").instanceType(InstanceType.T2_MICRO).build())
  .to("aws2-ec2://TestDomain?accessKey=xxxx&secretKey=xxxx&operation=createAndRunInstances&pojoRequest=true");
------------------------------------------------------------------------------------------------------

In this way you'll pass the request directly without the need of passing headers and options specifically related to this operation.

== Dependencies

Maven users will need to add the following dependency to their pom.xml.

*pom.xml*

[source,xml]
---------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws2-ec2</artifactId>
    <version>${camel-version}</version>
</dependency>
---------------------------------------

where `$\{camel-version}` must be replaced by the actual version of Camel.


include::spring-boot:partial$starter.adoc[]
