Skip to content

Commit e73d687

Browse files
authored
Java add a CDK Script to autoscale so tests work (#7645)
* add a CDK Script * Remove AutoScalingTest.kt from PR * update POM * fixed linter issue * fixed linter issue
1 parent 876fdb3 commit e73d687

File tree

6 files changed

+346
-154
lines changed

6 files changed

+346
-154
lines changed

javav2/example_code/autoscale/pom.xml

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
<version>1.0-SNAPSHOT</version>
99
<properties>
1010
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
11-
<java.version>21</java.version>
12-
<maven.compiler.target>21</maven.compiler.target>
13-
<maven.compiler.source>21</maven.compiler.source>
11+
<java.version>17</java.version>
12+
<maven.compiler.target>17</maven.compiler.target>
13+
<maven.compiler.source>17</maven.compiler.source>
1414
</properties>
1515
<build>
1616
<plugins>
@@ -30,13 +30,6 @@
3030
<type>pom</type>
3131
<scope>import</scope>
3232
</dependency>
33-
<dependency>
34-
<groupId>org.apache.logging.log4j</groupId>
35-
<artifactId>log4j-bom</artifactId>
36-
<version>2.23.1</version>
37-
<type>pom</type>
38-
<scope>import</scope>
39-
</dependency>
4033
</dependencies>
4134
</dependencyManagement>
4235
<dependencies>
@@ -50,47 +43,38 @@
5043
<groupId>software.amazon.awssdk</groupId>
5144
<artifactId>secretsmanager</artifactId>
5245
</dependency>
53-
<dependency>
54-
<groupId>com.google.code.gson</groupId>
55-
<artifactId>gson</artifactId>
56-
<version>2.10.1</version>
57-
</dependency>
5846
<dependency>
5947
<groupId>software.amazon.awssdk</groupId>
60-
<artifactId>autoscaling</artifactId>
48+
<artifactId>cloudformation</artifactId>
6149
</dependency>
6250
<dependency>
6351
<groupId>software.amazon.awssdk</groupId>
6452
<artifactId>ec2</artifactId>
6553
</dependency>
6654
<dependency>
6755
<groupId>software.amazon.awssdk</groupId>
68-
<artifactId>auth</artifactId>
56+
<artifactId>netty-nio-client</artifactId>
6957
</dependency>
7058
<dependency>
71-
<groupId>software.amazon.awssdk</groupId>
72-
<artifactId>sso</artifactId>
59+
<groupId>com.google.code.gson</groupId>
60+
<artifactId>gson</artifactId>
61+
<version>2.10.1</version>
7362
</dependency>
7463
<dependency>
7564
<groupId>software.amazon.awssdk</groupId>
76-
<artifactId>ssooidc</artifactId>
77-
</dependency>
78-
<dependency>
79-
<groupId>org.apache.logging.log4j</groupId>
80-
<artifactId>log4j-core</artifactId>
65+
<artifactId>autoscaling</artifactId>
8166
</dependency>
8267
<dependency>
83-
<groupId>org.slf4j</groupId>
84-
<artifactId>slf4j-api</artifactId>
85-
<version>2.0.13</version>
68+
<groupId>software.amazon.awssdk</groupId>
69+
<artifactId>auth</artifactId>
8670
</dependency>
8771
<dependency>
88-
<groupId>org.apache.logging.log4j</groupId>
89-
<artifactId>log4j-slf4j2-impl</artifactId>
72+
<groupId>software.amazon.awssdk</groupId>
73+
<artifactId>sso</artifactId>
9074
</dependency>
9175
<dependency>
92-
<groupId>org.apache.logging.log4j</groupId>
93-
<artifactId>log4j-1.2-api</artifactId>
76+
<groupId>software.amazon.awssdk</groupId>
77+
<artifactId>ssooidc</artifactId>
9478
</dependency>
9579
</dependencies>
9680
</project>

javav2/example_code/autoscale/src/main/java/com/example/autoscaling/scenario/AutoScalingScenario.java

Lines changed: 112 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,21 @@
2929
import software.amazon.awssdk.services.autoscaling.model.TerminateInstanceInAutoScalingGroupRequest;
3030
import software.amazon.awssdk.services.autoscaling.model.DescribeAutoScalingInstancesRequest;
3131
import software.amazon.awssdk.services.ec2.Ec2Client;
32+
import software.amazon.awssdk.services.ec2.model.CreateLaunchTemplateVersionRequest;
33+
import software.amazon.awssdk.services.ec2.model.CreateLaunchTemplateVersionResponse;
34+
import software.amazon.awssdk.services.ec2.model.DescribeSubnetsRequest;
35+
import software.amazon.awssdk.services.ec2.model.DescribeSubnetsResponse;
36+
import software.amazon.awssdk.services.ec2.model.DescribeVpcsRequest;
37+
import software.amazon.awssdk.services.ec2.model.DescribeVpcsResponse;
38+
import software.amazon.awssdk.services.ec2.model.Ec2Exception;
39+
import software.amazon.awssdk.services.ec2.model.Filter;
40+
import software.amazon.awssdk.services.ec2.model.ModifyLaunchTemplateRequest;
41+
import software.amazon.awssdk.services.ec2.model.RequestLaunchTemplateData;
42+
import software.amazon.awssdk.services.ec2.model.ResponseLaunchTemplateData;
43+
import software.amazon.awssdk.services.ec2.model.Vpc;
3244

3345
import java.util.List;
46+
import java.util.Map;
3447
// snippet-end:[autoscale.java2.create_scaling_scenario.import]
3548

3649
// snippet-start:[autoscale.java2.create_scaling_scenario.main]
@@ -65,41 +78,42 @@
6578

6679
public class AutoScalingScenario {
6780
public static final String DASHES = new String(new char[80]).replace("\0", "-");
68-
81+
private static final String ROLES_STACK = "MyCdkAutoScaleStack";
6982
public static void main(String[] args) throws InterruptedException {
7083
final String usage = """
7184
7285
Usage:
73-
<groupName> <launchTemplateName> <vpcZoneId>
86+
<groupName>
7487
7588
Where:
7689
groupName - The name of the Auto Scaling group.
77-
launchTemplateName - The name of the launch template.\s
78-
vpcZoneId - A subnet Id for a virtual private cloud (VPC) where instances in the Auto Scaling group can be created.
7990
""";
8091

81-
//if (args.length != 3) {
82-
// System.out.println(usage);
83-
// System.exit(1);
84-
// }
85-
86-
String groupName = "Scott250" ; //rgs[0];
87-
String launchTemplateName = "MyTemplate5" ;//args[1];
88-
String vpcZoneId = "subnet-0ddc451b8a8a1aa44" ; //args[2];
89-
92+
String groupName = "MyAutoScalingGroup2";
9093
AutoScalingClient autoScalingClient = AutoScalingClient.builder()
91-
.region(Region.US_EAST_1)
94+
.region(Region.US_WEST_2)
9295
.build();
9396

94-
Ec2Client ec2 = Ec2Client.create();
97+
Ec2Client ec2 = Ec2Client.builder()
98+
.region(Region.US_WEST_2)
99+
.build();
95100

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

100105
System.out.println(DASHES);
106+
System.out.println("First, we will create a launch template using a CloudFormation script");
107+
CloudFormationHelper.deployCloudFormationStack(ROLES_STACK);
108+
Map<String, String> stackOutputs = CloudFormationHelper.getStackOutputsAsync(ROLES_STACK).join();
109+
String launchTemplateName = stackOutputs.get("LaunchTemplateNameOutput");
110+
String vpcZoneId = getVPC(ec2);
111+
updateTemlate(ec2, launchTemplateName );
112+
System.out.println("The VPC zone id created by the CloudFormation stack is"+vpcZoneId);
113+
101114
System.out.println("1. Create an Auto Scaling group named " + groupName);
102-
createAutoScalingGroup(autoScalingClient, groupName, launchTemplateName, vpcZoneId);
115+
createAutoScalingGroup(autoScalingClient, ec2, groupName, launchTemplateName, vpcZoneId);
116+
103117
System.out.println(
104118
"Wait 1 min for the resources, including the instance. Otherwise, an empty instance Id is returned");
105119
Thread.sleep(60000);
@@ -170,7 +184,8 @@ public static void main(String[] args) throws InterruptedException {
170184
System.out.println(DASHES);
171185

172186
System.out.println(DASHES);
173-
System.out.println("13. Delete the Auto Scaling group");
187+
System.out.println("13. Delete the Auto Scaling group and cloud formation resources");
188+
CloudFormationHelper.destroyCloudFormationStack(ROLES_STACK);
174189
deleteAutoScalingGroup(autoScalingClient, groupName);
175190
System.out.println(DASHES);
176191

@@ -181,6 +196,56 @@ public static void main(String[] args) throws InterruptedException {
181196
autoScalingClient.close();
182197
}
183198

199+
public static String getVPC(Ec2Client ec2) {
200+
try {
201+
DescribeVpcsRequest request = DescribeVpcsRequest.builder()
202+
.filters(f -> f.name("isDefault").values("true"))
203+
.build();
204+
205+
DescribeVpcsResponse response = ec2.describeVpcs(request);
206+
207+
if (!response.vpcs().isEmpty()) {
208+
Vpc defaultVpc = response.vpcs().get(0);
209+
System.out.println("Default VPC ID: " + defaultVpc.vpcId());
210+
return defaultVpc.vpcId();
211+
} else {
212+
System.out.println("No default VPC found.");
213+
return null; // Return null if no default VPC is found
214+
}
215+
216+
} catch (Ec2Exception e) {
217+
System.err.println("EC2 error: " + e.awsErrorDetails().errorMessage());
218+
return null; // Return null in case of an error
219+
}
220+
}
221+
222+
223+
public static void updateTemlate(Ec2Client ec2, String launchTemplateName ) {
224+
// Step 1: Create new launch template version
225+
String newAmiId = "ami-0025f0db847eb6254";
226+
RequestLaunchTemplateData launchTemplateData = RequestLaunchTemplateData.builder()
227+
.imageId(newAmiId)
228+
.build();
229+
230+
CreateLaunchTemplateVersionRequest createVersionRequest = CreateLaunchTemplateVersionRequest.builder()
231+
.launchTemplateName(launchTemplateName)
232+
.versionDescription("Updated with valid AMI")
233+
.sourceVersion("1")
234+
.launchTemplateData(launchTemplateData)
235+
.build();
236+
237+
CreateLaunchTemplateVersionResponse createResponse = ec2.createLaunchTemplateVersion(createVersionRequest);
238+
int newVersionNumber = createResponse.launchTemplateVersion().versionNumber().intValue();
239+
240+
// Step 2: Modify default version
241+
ModifyLaunchTemplateRequest modifyRequest = ModifyLaunchTemplateRequest.builder()
242+
.launchTemplateName(launchTemplateName)
243+
.defaultVersion(String.valueOf(newVersionNumber))
244+
.build();
245+
246+
ec2.modifyLaunchTemplate(modifyRequest);
247+
System.out.println("Updated launch template to version " + newVersionNumber + " with AMI " + newAmiId);
248+
}
184249

185250

186251
// snippet-start:[autoscale.java2.describe_scaling_activites.main]
@@ -226,36 +291,55 @@ public static void setDesiredCapacity(AutoScalingClient autoScalingClient, Strin
226291

227292
// snippet-start:[autoscale.java2.create_autoscalinggroup.main]
228293
public static void createAutoScalingGroup(AutoScalingClient autoScalingClient,
229-
String groupName,
230-
String launchTemplateName,
231-
String vpcZoneId) {
294+
Ec2Client ec2Client,
295+
String groupName,
296+
String launchTemplateName,
297+
String vpcId) {
232298
try {
233-
AutoScalingWaiter waiter = autoScalingClient.waiter();
299+
// Step 1: Get one subnet ID in the given VPC
300+
DescribeSubnetsRequest subnetRequest = DescribeSubnetsRequest.builder()
301+
.filters(Filter.builder().name("vpc-id").values(vpcId).build())
302+
.build();
303+
304+
DescribeSubnetsResponse subnetResponse = ec2Client.describeSubnets(subnetRequest);
305+
306+
if (subnetResponse.subnets().isEmpty()) {
307+
throw new RuntimeException("No subnets found in VPC: " + vpcId);
308+
}
309+
310+
String subnetId = subnetResponse.subnets().get(0).subnetId(); // Use first subnet
311+
System.out.println("Using subnet: " + subnetId);
312+
313+
// Step 2: Create launch template reference
234314
LaunchTemplateSpecification templateSpecification = LaunchTemplateSpecification.builder()
235315
.launchTemplateName(launchTemplateName)
236316
.build();
237317

318+
// Step 3: Create Auto Scaling group
238319
CreateAutoScalingGroupRequest request = CreateAutoScalingGroupRequest.builder()
239320
.autoScalingGroupName(groupName)
240-
.availabilityZones("us-east-1a")
241321
.launchTemplate(templateSpecification)
242-
.maxSize(1)
243322
.minSize(1)
244-
.vpcZoneIdentifier(vpcZoneId)
323+
.maxSize(1)
324+
.vpcZoneIdentifier(subnetId) // Correct: subnet ID, not VPC ID
245325
.build();
246326

247327
autoScalingClient.createAutoScalingGroup(request);
328+
329+
// Step 4: Wait until group is created
330+
AutoScalingWaiter waiter = autoScalingClient.waiter();
248331
DescribeAutoScalingGroupsRequest groupsRequest = DescribeAutoScalingGroupsRequest.builder()
249332
.autoScalingGroupNames(groupName)
250333
.build();
251334

252-
WaiterResponse<DescribeAutoScalingGroupsResponse> waiterResponse = waiter
253-
.waitUntilGroupExists(groupsRequest);
335+
WaiterResponse<DescribeAutoScalingGroupsResponse> waiterResponse =
336+
waiter.waitUntilGroupExists(groupsRequest);
337+
254338
waiterResponse.matched().response().ifPresent(System.out::println);
255339
System.out.println("Auto Scaling Group created");
256340

257-
} catch (AutoScalingException e) {
258-
System.err.println(e.awsErrorDetails().errorMessage());
341+
} catch (Ec2Exception | AutoScalingException e) {
342+
System.err.println("Error: " + e.awsErrorDetails().errorMessage());
259343
System.exit(1);
260344
}
261345
}

0 commit comments

Comments
 (0)