Skip to content

Commit 4f2149a

Browse files
authored
Converted plugin to use AWS SDK v2 (#36)
* Converted plugin to use AWS SDK v2 - Java Plugin itself converted to use AWS SDK V2 - AWS SDK v1 support retained for Proxy callbacks
1 parent de9cd63 commit 4f2149a

27 files changed

+396
-227
lines changed

buildspec.yml

+1-6
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,7 @@ phases:
2020
- ls -la
2121
- >
2222
mvn org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file --batch-mode
23-
-Dfile=AWSCloudFormationJavaClientInternal-1.11.x-V1.jar
24-
-DgroupId=com.amazonaws
25-
-DartifactId=aws-java-sdk-cloudformation
26-
-Dversion=1.11.485-PATCH
27-
-Dpackaging=jar
28-
-DgeneratePom=true
23+
-Dfile=cloudformation-2.5.11.jar
2924
# install aws-cloudformation-resource-schema (Java)
3025
- cd "$CODEBUILD_SRC_DIR_SCHEMA"
3126
- ls -la

pom.xml

+56-12
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,37 @@
1515
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
1616
</properties>
1717

18+
<!-- https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/setup-project-maven.html -->
19+
<dependencyManagement>
20+
<dependencies>
21+
<dependency>
22+
<groupId>software.amazon.awssdk</groupId>
23+
<artifactId>bom</artifactId>
24+
<version>2.5.11</version>
25+
<type>pom</type>
26+
<scope>import</scope>
27+
</dependency>
28+
</dependencies>
29+
</dependencyManagement>
30+
1831
<dependencies>
1932
<!-- https://mvnrepository.com/artifact/com.github.everit-org.json-schema/org.everit.json.schema -->
2033
<dependency>
2134
<groupId>com.aws.cfn</groupId>
2235
<artifactId>aws-cloudformation-resource-schema</artifactId>
2336
<version>1.0.0</version>
2437
</dependency>
38+
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-databind -->
2539
<dependency>
2640
<groupId>com.fasterxml.jackson.core</groupId>
2741
<artifactId>jackson-databind</artifactId>
28-
<version>2.9.6</version>
42+
<version>2.9.7</version>
43+
</dependency>
44+
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-cbor -->
45+
<dependency>
46+
<groupId>com.fasterxml.jackson.dataformat</groupId>
47+
<artifactId>jackson-dataformat-cbor</artifactId>
48+
<version>2.9.7</version>
2949
</dependency>
3050
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
3151
<dependency>
@@ -40,30 +60,47 @@
4060
<artifactId>json</artifactId>
4161
<version>20180813</version>
4262
</dependency>
43-
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-cloudwatch -->
63+
64+
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-core -->
4465
<dependency>
4566
<groupId>com.amazonaws</groupId>
46-
<artifactId>aws-java-sdk-cloudformation</artifactId>
47-
<version>1.11.485-PATCH</version> <!-- Points to local patched install only -->
67+
<artifactId>aws-java-sdk-core</artifactId>
68+
<version>1.11.519</version>
4869
</dependency>
4970
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-core -->
5071
<dependency>
5172
<groupId>com.amazonaws</groupId>
5273
<artifactId>aws-lambda-java-core</artifactId>
5374
<version>1.2.0</version>
5475
</dependency>
55-
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-cloudwatch -->
76+
77+
<!-- AWS Java SDK v2 Dependencies -->
5678
<dependency>
57-
<groupId>com.amazonaws</groupId>
58-
<artifactId>aws-java-sdk-cloudwatch</artifactId>
59-
<version>1.11.483</version>
79+
<groupId>software.amazon.awssdk</groupId>
80+
<artifactId>sdk-core</artifactId>
81+
<version>2.5.11</version>
6082
</dependency>
61-
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-events -->
6283
<dependency>
63-
<groupId>com.amazonaws</groupId>
64-
<artifactId>aws-java-sdk-events</artifactId>
65-
<version>1.11.485</version>
84+
<groupId>software.amazon.awssdk</groupId>
85+
<artifactId>utils</artifactId>
86+
<version>2.5.11</version>
87+
</dependency>
88+
<dependency>
89+
<groupId>software.amazon.awssdk</groupId>
90+
<artifactId>cloudformation</artifactId>
91+
<version>2.5.11</version>
6692
</dependency>
93+
<dependency>
94+
<groupId>software.amazon.awssdk</groupId>
95+
<artifactId>cloudwatch</artifactId>
96+
<version>2.5.11</version>
97+
</dependency>
98+
<dependency>
99+
<groupId>software.amazon.awssdk</groupId>
100+
<artifactId>cloudwatchevents</artifactId>
101+
<version>2.5.11</version>
102+
</dependency>
103+
67104
<!-- https://mvnrepository.com/artifact/com.google.inject/guice -->
68105
<dependency>
69106
<groupId>com.google.inject</groupId>
@@ -89,6 +126,13 @@
89126
<version>3.8.1</version>
90127
</dependency>
91128

129+
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-cloudformation -->
130+
<dependency>
131+
<groupId>com.amazonaws</groupId>
132+
<artifactId>aws-java-sdk-cloudformation</artifactId>
133+
<version>1.11.519</version>
134+
<scope>test</scope>
135+
</dependency>
92136
<!-- https://mvnrepository.com/artifact/junit/junit -->
93137
<dependency>
94138
<groupId>junit</groupId>

python/rpdk/java/templates/HandlerModule.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package {{ package_name }};
22

3-
import com.amazonaws.services.cloudformation.AmazonCloudFormation;
4-
import com.aws.cfn.injection.AmazonCloudFormationProvider;
3+
import com.aws.cfn.injection.CloudFormationProvider;
54
import com.aws.cfn.proxy.CallbackAdapter;
65
import com.aws.cfn.proxy.CloudFormationCallbackAdapter;
76
import com.google.inject.AbstractModule;
87
import com.google.inject.TypeLiteral;
8+
import software.amazon.awssdk.services.cloudformation.CloudFormationAsyncClient;
99

1010
public class HandlerModule extends AbstractModule {
1111

1212
@Override
1313
protected void configure() {
14-
bind(AmazonCloudFormation.class).toProvider(AmazonCloudFormationProvider.class);
14+
bind(CloudFormationAsyncClient.class).toProvider(CloudFormationProvider.class);
1515
bind(new TypeLiteral<CallbackAdapter<{{ pojo_name }}>>() {})
1616
.to(new TypeLiteral<CloudFormationCallbackAdapter<{{ pojo_name }}>>() {});
1717
}

src/main/java/com/aws/cfn/LambdaWrapper.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.amazonaws.services.lambda.runtime.Context;
44
import com.amazonaws.services.lambda.runtime.LambdaLogger;
55
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
6-
import com.amazonaws.util.StringUtils;
76
import com.aws.cfn.exceptions.TerminalException;
87
import com.aws.cfn.injection.LambdaModule;
98
import com.aws.cfn.metrics.MetricsPublisher;
@@ -24,11 +23,13 @@
2423
import com.google.inject.Inject;
2524
import org.apache.commons.io.IOUtils;
2625
import org.json.JSONObject;
26+
import software.amazon.awssdk.utils.StringUtils;
2727

2828
import java.io.IOException;
2929
import java.io.InputStream;
3030
import java.io.OutputStream;
3131
import java.nio.charset.Charset;
32+
import java.time.Instant;
3233
import java.time.OffsetDateTime;
3334
import java.time.ZoneOffset;
3435
import java.util.Date;
@@ -98,7 +99,7 @@ public void handleRequest(final InputStream inputStream,
9899
e.printStackTrace(); // for root causing - logs to LambdaLogger by default
99100

100101
this.metricsPublisher.publishExceptionMetric(
101-
Date.from(OffsetDateTime.now(ZoneOffset.UTC).toInstant()),
102+
Instant.from(OffsetDateTime.now(ZoneOffset.UTC).toInstant()),
102103
request.getAction(),
103104
e);
104105

@@ -134,7 +135,7 @@ public ProgressEvent<ResourceT, CallbackT> processInvocation(final HandlerReques
134135
if (hasRequestContext) {
135136
// If this invocation was triggered by a 're-invoke' CloudWatch Event, clean it up
136137
final String cloudWatchEventsRuleName = requestContext.getCloudWatchEventsRuleName();
137-
if (!StringUtils.isNullOrEmpty(cloudWatchEventsRuleName)) {
138+
if (!StringUtils.isBlank(cloudWatchEventsRuleName)) {
138139
this.scheduler.cleanupCloudWatchEvents(
139140
cloudWatchEventsRuleName,
140141
requestContext.getCloudWatchEventsTargetId());
@@ -146,7 +147,7 @@ public ProgressEvent<ResourceT, CallbackT> processInvocation(final HandlerReques
146147
this.metricsPublisher.setResourceTypeName(request.getResourceType());
147148

148149
this.metricsPublisher.publishInvocationMetric(
149-
Date.from(OffsetDateTime.now(ZoneOffset.UTC).toInstant()),
150+
Instant.from(OffsetDateTime.now(ZoneOffset.UTC).toInstant()),
150151
request.getAction());
151152

152153
// for CUD actions, validate incoming model - any error is a terminal failure on the invocation
@@ -198,7 +199,7 @@ public ProgressEvent<ResourceT, CallbackT> processInvocation(final HandlerReques
198199
final Date endTime = Date.from(OffsetDateTime.now(ZoneOffset.UTC).toInstant());
199200

200201
metricsPublisher.publishDurationMetric(
201-
Date.from(OffsetDateTime.now(ZoneOffset.UTC).toInstant()),
202+
Instant.from(OffsetDateTime.now(ZoneOffset.UTC).toInstant()),
202203
request.getAction(),
203204
(endTime.getTime() - startTime.getTime()));
204205

src/main/java/com/aws/cfn/injection/AmazonCloudFormationProvider.java

-20
This file was deleted.

src/main/java/com/aws/cfn/injection/AmazonCloudWatchEventsProvider.java

-14
This file was deleted.

src/main/java/com/aws/cfn/injection/AmazonCloudWatchProvider.java

-14
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.aws.cfn.injection;
2+
3+
import com.google.inject.Provider;
4+
import software.amazon.awssdk.regions.Region;
5+
import software.amazon.awssdk.services.cloudformation.CloudFormationAsyncClient;
6+
7+
import java.net.URI;
8+
9+
public class CloudFormationProvider implements Provider<CloudFormationAsyncClient> {
10+
11+
@Override
12+
public CloudFormationAsyncClient get() {
13+
final URI endpointConfiguration = URI.create("https://stackbuilder-2.amazonaws.com");
14+
15+
return CloudFormationAsyncClient.builder()
16+
.endpointOverride(endpointConfiguration)
17+
.region(Region.EU_WEST_1)
18+
.build();
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.aws.cfn.injection;
2+
3+
import com.google.inject.Provider;
4+
import software.amazon.awssdk.services.cloudwatchevents.CloudWatchEventsAsyncClient;
5+
6+
public class CloudWatchEventsProvider implements Provider<CloudWatchEventsAsyncClient> {
7+
8+
@Override
9+
public CloudWatchEventsAsyncClient get() {
10+
return CloudWatchEventsAsyncClient.create();
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.aws.cfn.injection;
2+
3+
import com.google.inject.Provider;
4+
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient;
5+
6+
public class CloudWatchProvider implements Provider<CloudWatchAsyncClient> {
7+
8+
@Override
9+
public CloudWatchAsyncClient get() {
10+
return CloudWatchAsyncClient.create();
11+
}
12+
}

src/main/java/com/aws/cfn/injection/LambdaModule.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
package com.aws.cfn.injection;
22

3-
import com.amazonaws.services.cloudwatch.AmazonCloudWatch;
4-
import com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEvents;
53
import com.aws.cfn.metrics.MetricsPublisher;
64
import com.aws.cfn.metrics.MetricsPublisherImpl;
75
import com.aws.cfn.resource.SchemaValidator;
86
import com.aws.cfn.resource.Validator;
97
import com.google.inject.AbstractModule;
8+
import software.amazon.awssdk.services.cloudformation.CloudFormationAsyncClient;
9+
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient;
10+
import software.amazon.awssdk.services.cloudwatchevents.CloudWatchEventsAsyncClient;
11+
1012
public class LambdaModule extends AbstractModule {
1113

1214
@Override
1315
protected void configure() {
14-
bind(AmazonCloudWatch.class).toProvider(AmazonCloudWatchProvider.class);
15-
bind(AmazonCloudWatchEvents.class).toProvider(AmazonCloudWatchEventsProvider.class);
16+
bind(CloudFormationAsyncClient.class).toProvider(CloudFormationProvider.class);
17+
bind(CloudWatchAsyncClient.class).toProvider(CloudWatchProvider.class);
18+
bind(CloudWatchEventsAsyncClient.class).toProvider(CloudWatchEventsProvider.class);
1619
bind(MetricsPublisher.class).to(MetricsPublisherImpl.class);
1720
bind(SchemaValidator.class).to(Validator.class);
1821
}

src/main/java/com/aws/cfn/metrics/MetricsPublisher.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@
22

33
import com.aws.cfn.Action;
44

5-
import java.util.Date;
5+
import java.time.Instant;
66

77
public interface MetricsPublisher {
88

99
String getResourceTypeName();
1010
void setResourceTypeName(String resourceTypeName);
1111

12-
void publishExceptionMetric(final Date timestamp,
12+
void publishExceptionMetric(final Instant timestamp,
1313
final Action action,
1414
final Exception e);
1515

16-
void publishInvocationMetric(final Date timestamp,
16+
void publishInvocationMetric(final Instant timestamp,
1717
final Action action);
1818

19-
void publishDurationMetric(final Date timestamp,
19+
void publishDurationMetric(final Instant timestamp,
2020
final Action action,
2121
long milliseconds);
2222
}

0 commit comments

Comments
 (0)