Skip to content

Java V2 Updated the Java AWS Autoscale MVP #7423

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 16 additions & 32 deletions javav2/example_code/autoscale/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>21</java.version>
<maven.compiler.target>21</maven.compiler.target>
<maven.compiler.source>21</maven.compiler.source>
<java.version>17</java.version>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
</properties>
<build>
<plugins>
Expand All @@ -26,14 +26,7 @@
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.31.8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-bom</artifactId>
<version>2.23.1</version>
<version>2.29.45</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Expand All @@ -50,47 +43,38 @@
<groupId>software.amazon.awssdk</groupId>
<artifactId>secretsmanager</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>autoscaling</artifactId>
<artifactId>cloudformation</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>ec2</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>auth</artifactId>
<artifactId>netty-nio-client</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sso</artifactId>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>ssooidc</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<artifactId>autoscaling</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.13</version>
<groupId>software.amazon.awssdk</groupId>
<artifactId>auth</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j2-impl</artifactId>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sso</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<groupId>software.amazon.awssdk</groupId>
<artifactId>ssooidc</artifactId>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,21 @@
import software.amazon.awssdk.services.autoscaling.model.TerminateInstanceInAutoScalingGroupRequest;
import software.amazon.awssdk.services.autoscaling.model.DescribeAutoScalingInstancesRequest;
import software.amazon.awssdk.services.ec2.Ec2Client;
import software.amazon.awssdk.services.ec2.model.CreateLaunchTemplateVersionRequest;
import software.amazon.awssdk.services.ec2.model.CreateLaunchTemplateVersionResponse;
import software.amazon.awssdk.services.ec2.model.DescribeSubnetsRequest;
import software.amazon.awssdk.services.ec2.model.DescribeSubnetsResponse;
import software.amazon.awssdk.services.ec2.model.DescribeVpcsRequest;
import software.amazon.awssdk.services.ec2.model.DescribeVpcsResponse;
import software.amazon.awssdk.services.ec2.model.Ec2Exception;
import software.amazon.awssdk.services.ec2.model.Filter;
import software.amazon.awssdk.services.ec2.model.ModifyLaunchTemplateRequest;
import software.amazon.awssdk.services.ec2.model.RequestLaunchTemplateData;
import software.amazon.awssdk.services.ec2.model.ResponseLaunchTemplateData;
import software.amazon.awssdk.services.ec2.model.Vpc;

import java.util.List;
import java.util.Map;
// snippet-end:[autoscale.java2.create_scaling_scenario.import]

// snippet-start:[autoscale.java2.create_scaling_scenario.main]
Expand Down Expand Up @@ -65,41 +78,34 @@

public class AutoScalingScenario {
public static final String DASHES = new String(new char[80]).replace("\0", "-");

private static final String ROLES_STACK = "MyCdkAutoScaleStack";
public static void main(String[] args) throws InterruptedException {
final String usage = """

Usage:
<groupName> <launchTemplateName> <vpcZoneId>

Where:
groupName - The name of the Auto Scaling group.
launchTemplateName - The name of the launch template.\s
vpcZoneId - A subnet Id for a virtual private cloud (VPC) where instances in the Auto Scaling group can be created.
""";

//if (args.length != 3) {
// System.out.println(usage);
// System.exit(1);
// }

String groupName = "Scott250" ; //rgs[0];
String launchTemplateName = "MyTemplate5" ;//args[1];
String vpcZoneId = "subnet-0ddc451b8a8a1aa44" ; //args[2];

// The name of the Auto Scaling group.
String groupName = "MyAutoScalingGroup2";
AutoScalingClient autoScalingClient = AutoScalingClient.builder()
.region(Region.US_EAST_1)
.region(Region.US_WEST_2)
.build();

Ec2Client ec2 = Ec2Client.create();
Ec2Client ec2 = Ec2Client.builder()
.region(Region.US_WEST_2)
.build();

System.out.println(DASHES);
System.out.println("Welcome to the Amazon EC2 Auto Scaling example scenario.");
System.out.println(DASHES);

System.out.println(DASHES);
System.out.println("First, we will create a launch template using a CloudFormation script");
CloudFormationHelper.deployCloudFormationStack(ROLES_STACK);
Map<String, String> stackOutputs = CloudFormationHelper.getStackOutputsAsync(ROLES_STACK).join();
String launchTemplateName = stackOutputs.get("LaunchTemplateNameOutput");
String vpcZoneId = getVPC(ec2);
updateTemlate(ec2, launchTemplateName );
System.out.println("The VPC zone id created by the CloudFormation stack is"+vpcZoneId);

System.out.println("1. Create an Auto Scaling group named " + groupName);
createAutoScalingGroup(autoScalingClient, groupName, launchTemplateName, vpcZoneId);
createAutoScalingGroup(autoScalingClient, ec2, groupName, launchTemplateName, vpcZoneId);

System.out.println(
"Wait 1 min for the resources, including the instance. Otherwise, an empty instance Id is returned");
Thread.sleep(60000);
Expand Down Expand Up @@ -170,7 +176,8 @@ public static void main(String[] args) throws InterruptedException {
System.out.println(DASHES);

System.out.println(DASHES);
System.out.println("13. Delete the Auto Scaling group");
System.out.println("13. Delete the Auto Scaling group and cloud formation resources");
CloudFormationHelper.destroyCloudFormationStack(ROLES_STACK);
deleteAutoScalingGroup(autoScalingClient, groupName);
System.out.println(DASHES);

Expand All @@ -181,6 +188,56 @@ public static void main(String[] args) throws InterruptedException {
autoScalingClient.close();
}

public static String getVPC(Ec2Client ec2) {
try {
DescribeVpcsRequest request = DescribeVpcsRequest.builder()
.filters(f -> f.name("isDefault").values("true"))
.build();

DescribeVpcsResponse response = ec2.describeVpcs(request);

if (!response.vpcs().isEmpty()) {
Vpc defaultVpc = response.vpcs().get(0);
System.out.println("Default VPC ID: " + defaultVpc.vpcId());
return defaultVpc.vpcId();
} else {
System.out.println("No default VPC found.");
return null; // Return null if no default VPC is found
}

} catch (Ec2Exception e) {
System.err.println("EC2 error: " + e.awsErrorDetails().errorMessage());
return null; // Return null in case of an error
}
}


public static void updateTemlate(Ec2Client ec2, String launchTemplateName ) {
// Step 1: Create new launch template version
String newAmiId = "ami-0025f0db847eb6254";
RequestLaunchTemplateData launchTemplateData = RequestLaunchTemplateData.builder()
.imageId(newAmiId)
.build();

CreateLaunchTemplateVersionRequest createVersionRequest = CreateLaunchTemplateVersionRequest.builder()
.launchTemplateName(launchTemplateName)
.versionDescription("Updated with valid AMI")
.sourceVersion("1")
.launchTemplateData(launchTemplateData)
.build();

CreateLaunchTemplateVersionResponse createResponse = ec2.createLaunchTemplateVersion(createVersionRequest);
int newVersionNumber = createResponse.launchTemplateVersion().versionNumber().intValue();

// Step 2: Modify default version
ModifyLaunchTemplateRequest modifyRequest = ModifyLaunchTemplateRequest.builder()
.launchTemplateName(launchTemplateName)
.defaultVersion(String.valueOf(newVersionNumber))
.build();

ec2.modifyLaunchTemplate(modifyRequest);
System.out.println("Updated launch template to version " + newVersionNumber + " with AMI " + newAmiId);
}


// snippet-start:[autoscale.java2.describe_scaling_activites.main]
Expand Down Expand Up @@ -224,42 +281,61 @@ public static void setDesiredCapacity(AutoScalingClient autoScalingClient, Strin
}
// snippet-end:[autoscale.java2.set_capacity.main]

// snippet-start:[autoscale.java2.create_autoscalinggroup.main]
// snippet-start:[autoscale.java2.create_scaling_group.main]
public static void createAutoScalingGroup(AutoScalingClient autoScalingClient,
String groupName,
String launchTemplateName,
String vpcZoneId) {
Ec2Client ec2Client,
String groupName,
String launchTemplateName,
String vpcId) {
try {
AutoScalingWaiter waiter = autoScalingClient.waiter();
// Step 1: Get one subnet ID in the given VPC
DescribeSubnetsRequest subnetRequest = DescribeSubnetsRequest.builder()
.filters(Filter.builder().name("vpc-id").values(vpcId).build())
.build();

DescribeSubnetsResponse subnetResponse = ec2Client.describeSubnets(subnetRequest);

if (subnetResponse.subnets().isEmpty()) {
throw new RuntimeException("No subnets found in VPC: " + vpcId);
}

String subnetId = subnetResponse.subnets().get(0).subnetId(); // Use first subnet
System.out.println("Using subnet: " + subnetId);

// Step 2: Create launch template reference
LaunchTemplateSpecification templateSpecification = LaunchTemplateSpecification.builder()
.launchTemplateName(launchTemplateName)
.build();

// Step 3: Create Auto Scaling group
CreateAutoScalingGroupRequest request = CreateAutoScalingGroupRequest.builder()
.autoScalingGroupName(groupName)
.availabilityZones("us-east-1a")
.launchTemplate(templateSpecification)
.maxSize(1)
.minSize(1)
.vpcZoneIdentifier(vpcZoneId)
.maxSize(1)
.vpcZoneIdentifier(subnetId) // Correct: subnet ID, not VPC ID
.build();

autoScalingClient.createAutoScalingGroup(request);

// Step 4: Wait until group is created
AutoScalingWaiter waiter = autoScalingClient.waiter();
DescribeAutoScalingGroupsRequest groupsRequest = DescribeAutoScalingGroupsRequest.builder()
.autoScalingGroupNames(groupName)
.build();

WaiterResponse<DescribeAutoScalingGroupsResponse> waiterResponse = waiter
.waitUntilGroupExists(groupsRequest);
WaiterResponse<DescribeAutoScalingGroupsResponse> waiterResponse =
waiter.waitUntilGroupExists(groupsRequest);

waiterResponse.matched().response().ifPresent(System.out::println);
System.out.println("Auto Scaling Group created");

} catch (AutoScalingException e) {
System.err.println(e.awsErrorDetails().errorMessage());
} catch (Ec2Exception | AutoScalingException e) {
System.err.println("Error: " + e.awsErrorDetails().errorMessage());
System.exit(1);
}
}
// snippet-end:[autoscale.java2.create_autoscalinggroup.main]
// snippet-end:[autoscale.java2.create_scaling_group.main]

// snippet-start:[autoscale.java2.describe_autoscalinggroup.main]
public static void describeAutoScalingInstance(AutoScalingClient autoScalingClient, String id) {
Expand Down Expand Up @@ -437,7 +513,7 @@ public static void terminateInstanceInAutoScalingGroup(AutoScalingClient autoSca
}
// snippet-end:[autoscale.java2.terminate_instance.main]

// snippet-start:[autoscale.java2.del_group.main]
// snippet-start:[autoscale.java2.del_scaling_group.main]
public static void deleteAutoScalingGroup(AutoScalingClient autoScalingClient, String groupName) {
try {
DeleteAutoScalingGroupRequest deleteAutoScalingGroupRequest = DeleteAutoScalingGroupRequest.builder()
Expand All @@ -453,6 +529,6 @@ public static void deleteAutoScalingGroup(AutoScalingClient autoScalingClient, S
System.exit(1);
}
}
// snippet-end:[autoscale.java2.del_group.main]
// snippet-end:[autoscale.java2.del_scaling_group.main]
}
// snippet-end:[autoscale.java2.create_scaling_scenario.main]
Loading
Loading