Skip to content

Commit cfe2434

Browse files
authored
Replace lambda destinations (#39)
* Replaced Lambda destinations with dead letter topic. Added assertj like Assertion for CDK In this project, lambda is called synchronously which means destinations are not invoked. So, there were removed. Also added dead letter topic to receive failures executions. Signed-off-by: muhamadto <muhamadto@gmail.com>
1 parent c6d18c5 commit cfe2434

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+2056
-4025
lines changed

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ jobs:
2424
release:
2525
runs-on: ubuntu-latest
2626
container:
27-
image: ghcr.io/muhamadto/spring-native-amazonlinux2-base:17-amazonlinux2
27+
image: ghcr.io/muhamadto/spring-native-amazonlinux2-base:17-amazonlinux2
2828
options: --user=worker:ci
2929
permissions:
3030
id-token: write

Dockerfile

Lines changed: 0 additions & 5 deletions
This file was deleted.

lombok.config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
lombok.addLombokGeneratedAnnotation=true

pom.xml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
<sonar.organization>muhamadto</sonar.organization>
7373
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
7474
<revision>1.0.0-SNAPSHOT</revision>
75+
<jackson.version>2.13.0</jackson.version>
7576
</properties>
7677

7778
<modules>
@@ -126,6 +127,33 @@
126127
</dependency>
127128
<!-- UTILS ENDS -->
128129

130+
<!-- JACKSON -->
131+
132+
<dependency>
133+
<groupId>com.fasterxml.jackson.core</groupId>
134+
<artifactId>jackson-databind</artifactId>
135+
<version>${jackson.version}</version>
136+
</dependency>
137+
138+
<dependency>
139+
<groupId>com.fasterxml.jackson.module</groupId>
140+
<artifactId>jackson-module-parameter-names</artifactId>
141+
<version>${jackson.version}</version>
142+
</dependency>
143+
144+
<dependency>
145+
<groupId>com.fasterxml.jackson.datatype</groupId>
146+
<artifactId>jackson-datatype-jsr310</artifactId>
147+
<version>${jackson.version}</version>
148+
</dependency>
149+
150+
<dependency>
151+
<groupId>com.fasterxml.jackson.datatype</groupId>
152+
<artifactId>jackson-datatype-jdk8</artifactId>
153+
<version>${jackson.version}</version>
154+
</dependency>
155+
<!-- JACKSON ENDS -->
156+
129157
<!-- TEST -->
130158
<dependency>
131159
<groupId>org.assertj</groupId>

spring-native-aws-lambda-infra/pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,16 @@
8686
</dependency>
8787
<!-- UTILS ENDS -->
8888

89+
<!-- JACKSON -->
90+
91+
<dependency>
92+
<groupId>com.fasterxml.jackson.module</groupId>
93+
<artifactId>jackson-module-parameter-names</artifactId>
94+
</dependency>
95+
96+
<!-- JACKSON ENDS-->
97+
98+
8999
<!-- TEST -->
90100

91101
<dependency>

spring-native-aws-lambda-infra/src/main/java/com/coffeebeans/springnativeawslambda/infra/ApiBaseStack.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import software.amazon.awscdk.services.iam.Role;
3636
import software.amazon.awscdk.services.lambda.Code;
3737
import software.amazon.awscdk.services.lambda.Function;
38-
import software.amazon.awscdk.services.lambda.destinations.SnsDestination;
3938
import software.amazon.awscdk.services.sns.ITopic;
4039
import software.amazon.awscdk.services.sns.Topic;
4140
import software.amazon.awscdk.services.sns.subscriptions.SqsSubscription;
@@ -61,7 +60,8 @@ public ApiBaseStack(
6160

6261
@NotNull
6362
protected Queue createQueue(@NotBlank final String queueId) {
64-
final DeadLetterQueue deadLetterQueue = createDeadLetterQueue(queueId + DEAD_LETTER_QUEUE_SUFFIX);
63+
final DeadLetterQueue deadLetterQueue = createDeadLetterQueue(
64+
queueId + DEAD_LETTER_QUEUE_SUFFIX);
6565

6666
return Queue.Builder.create(this, queueId)
6767
.queueName(queueId)
@@ -153,16 +153,14 @@ protected Function createFunction(
153153
@NotBlank final String lambdaId,
154154
@NotBlank final String handler,
155155
@NotNull final Code code,
156-
@NotNull final Topic successTopic,
157-
@NotNull final Topic failureTopic,
156+
@NotNull final Topic deadLetterTopic,
158157
@NotNull Role role,
159158
@NotEmpty final Map<String, String> environment) {
160159
return this.createFunction(null,
161160
lambdaId,
162161
handler,
163162
code,
164-
successTopic,
165-
failureTopic,
163+
deadLetterTopic,
166164
role,
167165
environment);
168166
}
@@ -173,8 +171,7 @@ protected Function createFunction(
173171
@NotBlank final String lambdaId,
174172
@NotBlank final String handler,
175173
@NotNull final Code code,
176-
@NotNull final ITopic successTopic,
177-
@NotNull final ITopic failureTopic,
174+
@NotNull final ITopic deadLetterTopic,
178175
@NotNull IRole role,
179176
@NotEmpty final Map<String, String> environment) {
180177
return CustomRuntime2Function.Builder.create(this, lambdaId)
@@ -185,8 +182,7 @@ protected Function createFunction(
185182
.role(role)
186183
.vpc(vpc)
187184
.environment(environment)
188-
.onSuccess(new SnsDestination(successTopic))
189-
.onFailure(new SnsDestination(failureTopic))
185+
.deadLetterTopic(deadLetterTopic)
190186
.timeout(Duration.seconds(LAMBDA_FUNCTION_TIMEOUT_IN_SECONDS))
191187
.memorySize(LAMBDA_FUNCTION_MEMORY_SIZE)
192188
.retryAttempts(LAMBDA_FUNCTION_RETRY_ATTEMPTS)

spring-native-aws-lambda-infra/src/main/java/com/coffeebeans/springnativeawslambda/infra/Application.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public final class Application {
3939
private static final String ENVIRONMENT_NAME_DEV = "dev";
4040
private static final String ENVIRONMENT_NAME_PRD = "prd";
4141
private static final String LAMBDA_CODE_PATH =
42-
SpringNativeAwsLambdaStack.LAMBDA_FUNCTION_ID + "/target/spring-native-aws-lambda-function-native-zip.zip";
42+
SpringNativeAwsLambdaStack.LAMBDA_FUNCTION_ID
43+
+ "/target/spring-native-aws-lambda-function-native-zip.zip";
4344
private static final String QUALIFIER = "cbcore";
4445
private static final String FILE_ASSETS_BUCKET_NAME = "cbcore-cdk-bucket";
4546

@@ -51,9 +52,14 @@ public static void main(final String... args) {
5152
final Map<String, String> tags = createTags(env, TAG_VALUE_COST_CENTRE);
5253

5354
switch (env) {
54-
case ENVIRONMENT_NAME_DEV -> createStack(app, DEV_STACK_NAME, LAMBDA_CODE_PATH, QUALIFIER, FILE_ASSETS_BUCKET_NAME, env);
55-
case ENVIRONMENT_NAME_PRD -> createStack(app, PRD_STACK_NAME, LAMBDA_CODE_PATH, QUALIFIER, FILE_ASSETS_BUCKET_NAME, env);
56-
default -> throw new IllegalArgumentException("Environment variable " + TAG_KEY_ENV + " is not set to a valid value. Set it to '[dev|prd]'");
55+
case ENVIRONMENT_NAME_DEV ->
56+
createStack(app, DEV_STACK_NAME, LAMBDA_CODE_PATH, QUALIFIER, FILE_ASSETS_BUCKET_NAME,
57+
env);
58+
case ENVIRONMENT_NAME_PRD ->
59+
createStack(app, PRD_STACK_NAME, LAMBDA_CODE_PATH, QUALIFIER, FILE_ASSETS_BUCKET_NAME,
60+
env);
61+
default -> throw new IllegalArgumentException("Environment variable " + TAG_KEY_ENV
62+
+ " is not set to a valid value. Set it to '[dev|prd]'");
5763
}
5864

5965
tags.entrySet().stream()

spring-native-aws-lambda-infra/src/main/java/com/coffeebeans/springnativeawslambda/infra/SpringNativeAwsLambdaStack.java

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,62 +19,61 @@
1919
package com.coffeebeans.springnativeawslambda.infra;
2020

2121
import static com.coffeebeans.springnativeawslambda.infra.TagUtils.TAG_KEY_ENV;
22+
import static software.amazon.awscdk.services.iam.ManagedPolicy.fromAwsManagedPolicyName;
2223
import static software.amazon.awscdk.services.lambda.Code.fromAsset;
23-
import static software.amazon.awscdk.services.sqs.DeduplicationScope.MESSAGE_GROUP;
2424

2525
import java.util.List;
2626
import java.util.Map;
2727
import javax.validation.constraints.NotBlank;
28-
import org.jetbrains.annotations.NotNull;
28+
import javax.validation.constraints.NotNull;
2929
import software.amazon.awscdk.StackProps;
30-
import software.amazon.awscdk.services.iam.ManagedPolicy;
30+
import software.amazon.awscdk.services.iam.IManagedPolicy;
3131
import software.amazon.awscdk.services.iam.Role;
3232
import software.amazon.awscdk.services.iam.ServicePrincipal;
3333
import software.amazon.awscdk.services.lambda.AssetCode;
3434
import software.amazon.awscdk.services.lambda.Function;
3535
import software.amazon.awscdk.services.sns.Topic;
36-
import software.amazon.awscdk.services.sns.subscriptions.SqsSubscription;
37-
import software.amazon.awscdk.services.sqs.Queue;
3836
import software.constructs.Construct;
3937

4038
public class SpringNativeAwsLambdaStack extends ApiBaseStack {
4139

4240
static final String LAMBDA_FUNCTION_ID = "spring-native-aws-lambda-function";
4341
private static final String REST_API_ID = LAMBDA_FUNCTION_ID + "-rest-api";
44-
private static final String SNS_SUCCESS_TOPIC_ID = LAMBDA_FUNCTION_ID + "-success-topic";
45-
private static final String SNS_FAILURE_TOPIC_ID = LAMBDA_FUNCTION_ID + "-failure-topic";
46-
private static final String SQS_SUCCESS_QUEUE_ID = LAMBDA_FUNCTION_ID + "-success-queue";
47-
private static final String SQS_FAILURE_QUEUE_ID = LAMBDA_FUNCTION_ID + "-failure-queue";
42+
private static final String DEAD_LETTER_TOPIC_ID = LAMBDA_FUNCTION_ID + "-topic.dlq";
4843
private static final String LAMBDA_HANDLER = "org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest";
4944
private static final String ENVIRONMENT_VARIABLE_SPRING_PROFILES_ACTIVE = "SPRING_PROFILES_ACTIVE";
5045

51-
public SpringNativeAwsLambdaStack(@NotNull final Construct scope,
46+
public SpringNativeAwsLambdaStack(
47+
@NotNull final Construct scope,
5248
@NotBlank final String id,
5349
@NotBlank final String lambdaCodePath,
5450
@NotBlank final String stage,
5551
@NotNull final StackProps props) {
56-
super(scope, id, props);
5752

58-
final Queue successQueue = createQueue(SQS_SUCCESS_QUEUE_ID);
59-
final SqsSubscription successQueueSubscription = createSqsSubscription(successQueue);
60-
final Topic successTopic = createTopic(SNS_SUCCESS_TOPIC_ID);
61-
successTopic.addSubscription(successQueueSubscription);
53+
super(scope, id, props);
6254

63-
final Queue failureQueue = createQueue(SQS_FAILURE_QUEUE_ID);
64-
final SqsSubscription failureQueueSubscription = createSqsSubscription(failureQueue);
65-
final Topic failureTopic = createTopic(SNS_FAILURE_TOPIC_ID);
66-
failureTopic.addSubscription(failureQueueSubscription);
55+
final Topic deadLetterTopic = createTopic(DEAD_LETTER_TOPIC_ID);
6756

68-
final Map<String, String> environment = Map.of(ENVIRONMENT_VARIABLE_SPRING_PROFILES_ACTIVE, stage, TAG_KEY_ENV, stage);
57+
final List<IManagedPolicy> managedPolicies =
58+
List.of(fromAwsManagedPolicyName("service-role/AWSLambdaBasicExecutionRole"));
6959

7060
final Role role = Role.Builder.create(this, LAMBDA_FUNCTION_ID + "-role")
7161
.assumedBy(new ServicePrincipal("lambda.amazonaws.com"))
72-
.managedPolicies(List.of(ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSLambdaBasicExecutionRole")))
62+
.managedPolicies(managedPolicies)
7363
.build();
7464

7565
final AssetCode assetCode = fromAsset(lambdaCodePath);
7666

77-
final Function function = createFunction(LAMBDA_FUNCTION_ID, LAMBDA_HANDLER, assetCode, successTopic, failureTopic, role, environment);
67+
final Map<String, String> environment =
68+
Map.of(ENVIRONMENT_VARIABLE_SPRING_PROFILES_ACTIVE, stage, TAG_KEY_ENV, stage);
69+
70+
final Function function = createFunction(
71+
LAMBDA_FUNCTION_ID,
72+
LAMBDA_HANDLER,
73+
assetCode,
74+
deadLetterTopic,
75+
role,
76+
environment);
7877

7978
createLambdaRestApi(stage, REST_API_ID, "name", "POST", function, true);
8079
}

spring-native-aws-lambda-infra/src/main/java/com/coffeebeans/springnativeawslambda/infra/StackUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ private static StackProps createStackProps(@NotBlank final String stackName,
5353
}
5454

5555
@NotNull
56-
private static DefaultStackSynthesizer createDefaultStackSynthesizer(@NotBlank final String qualifier,
56+
private static DefaultStackSynthesizer createDefaultStackSynthesizer(
57+
@NotBlank final String qualifier,
5758
@NotBlank final String fileAssetsBucketName) {
5859
return DefaultStackSynthesizer.Builder.create()
5960
.qualifier(qualifier)

spring-native-aws-lambda-infra/src/main/java/com/coffeebeans/springnativeawslambda/infra/TagUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ public final class TagUtils {
3030
public static final String TAG_KEY_COST_CENTRE = "COST_CENTRE";
3131
public static final String TAG_VALUE_COST_CENTRE = "coffeeBeans-core";
3232

33-
public static Map<String, String> createTags(@NotBlank final String env, @NotBlank final String costCentre) {
33+
public static Map<String, String> createTags(@NotBlank final String env,
34+
@NotBlank final String costCentre) {
3435
return Map.of(TAG_KEY_ENV, env, TAG_KEY_COST_CENTRE, costCentre);
3536
}
3637
}

0 commit comments

Comments
 (0)