diff --git a/java/custom-resource/README.md b/java/custom-resource/README.md index eede35a0ff..91e943457b 100644 --- a/java/custom-resource/README.md +++ b/java/custom-resource/README.md @@ -42,3 +42,13 @@ to run the CDK toolkit commands as usual (Maven will recompile as needed): $ cdk diff + +## Lambda +[`lambda`](./lambda) contains the source code for lambda handler. +After any code changes in the handler, follow these steps to deploy code changes. + + $ mvn package -f lambda/pom.xml + + + $ cp lambda/target/lambda-1.0.0-jar-with-dependencies.jar asset/ + diff --git a/java/custom-resource/asset/lambda-1.0.0-jar-with-dependencies.jar b/java/custom-resource/asset/lambda-1.0.0-jar-with-dependencies.jar new file mode 100644 index 0000000000..098dd97ed7 Binary files /dev/null and b/java/custom-resource/asset/lambda-1.0.0-jar-with-dependencies.jar differ diff --git a/java/custom-resource/cdk.json b/java/custom-resource/cdk.json index 1fcdaefc65..98074fd585 100644 --- a/java/custom-resource/cdk.json +++ b/java/custom-resource/cdk.json @@ -1,4 +1,3 @@ { - "app": "mvn exec:java -Dexec.mainClass=software.amazon.awscdk.examples.CustomResourceApp" - + "app": "mvn exec:java -pl cdk -Dexec.mainClass=software.amazon.awscdk.examples.CustomResourceApp" } diff --git a/java/custom-resource/cdk/cdk.json b/java/custom-resource/cdk/cdk.json new file mode 100644 index 0000000000..0a247595d5 --- /dev/null +++ b/java/custom-resource/cdk/cdk.json @@ -0,0 +1,3 @@ +{ + "app": "mvn test" +} \ No newline at end of file diff --git a/java/custom-resource/cdk/cdk.out.dummy/dummy.template.json b/java/custom-resource/cdk/cdk.out.dummy/dummy.template.json new file mode 100644 index 0000000000..2c63c08510 --- /dev/null +++ b/java/custom-resource/cdk/cdk.out.dummy/dummy.template.json @@ -0,0 +1,2 @@ +{ +} diff --git a/java/custom-resource/cdk/cdk.out.dummy/manifest.json b/java/custom-resource/cdk/cdk.out.dummy/manifest.json new file mode 100644 index 0000000000..ba081ddf10 --- /dev/null +++ b/java/custom-resource/cdk/cdk.out.dummy/manifest.json @@ -0,0 +1,18 @@ +{ + "version": "1.16.0", + "artifacts": { + "Tree": { + "type": "cdk:tree", + "properties": { + "file": "tree.json" + } + }, + "dummy": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "dummy.template.json" + } + } + } +} \ No newline at end of file diff --git a/java/custom-resource/cdk/pom.xml b/java/custom-resource/cdk/pom.xml new file mode 100644 index 0000000000..70bd5d3670 --- /dev/null +++ b/java/custom-resource/cdk/pom.xml @@ -0,0 +1,66 @@ + + + + + custom-resource + com.amazonaws.cdk + 1.0.0 + + 4.0.0 + + cdk + + + + + org.apache.maven.plugins + maven-resources-plugin + + + copy-folder + test + + copy-resources + + + ${project.basedir}/cdk.out + + + false + ${project.basedir}/cdk.out.dummy + + + + + + + + + + + UTF-8 + + + + + software.amazon.awscdk + aws-cdk-lib + [2.0.0,) + + + + software.constructs + constructs + [10.0.0,) + + + + + junit + junit + 4.13.1 + test + + + + \ No newline at end of file diff --git a/java/custom-resource/src/main/java/software/amazon/awscdk/examples/CustomResourceApp.java b/java/custom-resource/cdk/src/main/java/software/amazon/awscdk/examples/CustomResourceApp.java similarity index 100% rename from java/custom-resource/src/main/java/software/amazon/awscdk/examples/CustomResourceApp.java rename to java/custom-resource/cdk/src/main/java/software/amazon/awscdk/examples/CustomResourceApp.java diff --git a/java/custom-resource/src/main/java/software/amazon/awscdk/examples/CustomResourceStack.java b/java/custom-resource/cdk/src/main/java/software/amazon/awscdk/examples/CustomResourceStack.java similarity index 64% rename from java/custom-resource/src/main/java/software/amazon/awscdk/examples/CustomResourceStack.java rename to java/custom-resource/cdk/src/main/java/software/amazon/awscdk/examples/CustomResourceStack.java index 2ca2b6738d..6655eeea0e 100644 --- a/java/custom-resource/src/main/java/software/amazon/awscdk/examples/CustomResourceStack.java +++ b/java/custom-resource/cdk/src/main/java/software/amazon/awscdk/examples/CustomResourceStack.java @@ -1,22 +1,11 @@ package software.amazon.awscdk.examples; -import java.nio.file.*; - import java.util.Map; -import java.util.HashMap; import software.constructs.Construct; -import software.amazon.awscdk.CustomResource; -import software.amazon.awscdk.Duration; import software.amazon.awscdk.Stack; -import software.amazon.awscdk.customresources.*; import software.amazon.awscdk.CfnOutput; -import software.amazon.awscdk.services.logs.*; -import software.amazon.awscdk.services.lambda.Runtime; -import software.amazon.awscdk.services.lambda.InlineCode; -import software.amazon.awscdk.services.lambda.SingletonFunction; - public class CustomResourceStack extends Stack { public String response = ""; public CustomResourceStack(final Construct scope, final String id, final Map props) { diff --git a/java/custom-resource/src/main/java/software/amazon/awscdk/examples/MyCustomResource.java b/java/custom-resource/cdk/src/main/java/software/amazon/awscdk/examples/MyCustomResource.java similarity index 59% rename from java/custom-resource/src/main/java/software/amazon/awscdk/examples/MyCustomResource.java rename to java/custom-resource/cdk/src/main/java/software/amazon/awscdk/examples/MyCustomResource.java index d04c61ad81..46be534fac 100644 --- a/java/custom-resource/src/main/java/software/amazon/awscdk/examples/MyCustomResource.java +++ b/java/custom-resource/cdk/src/main/java/software/amazon/awscdk/examples/MyCustomResource.java @@ -1,38 +1,44 @@ package software.amazon.awscdk.examples; -import java.nio.file.*; - import java.util.Map; +import java.util.UUID; import software.constructs.Construct; import software.amazon.awscdk.CustomResource; import software.amazon.awscdk.Duration; -import java.util.UUID; import software.amazon.awscdk.customresources.*; import software.amazon.awscdk.services.logs.*; import software.amazon.awscdk.services.lambda.Runtime; -import software.amazon.awscdk.services.lambda.InlineCode; +import software.amazon.awscdk.services.lambda.Code; import software.amazon.awscdk.services.lambda.SingletonFunction; public class MyCustomResource extends Construct { public String response = ""; + public MyCustomResource(final Construct scope, final String id, final Map props) { super(scope, id); - try { + final SingletonFunction onEvent = SingletonFunction.Builder.create(this, "Singleton1") + .uuid(UUID.randomUUID().toString()) + .code(Code.fromAsset("./asset/lambda-1.0.0-jar-with-dependencies.jar")) + .handler("software.amazon.awscdk.examples.CustomResourceHandler") + .runtime(Runtime.JAVA_21).memorySize(1024) + .timeout(Duration.minutes(5)) + .build(); - final SingletonFunction onEvent = SingletonFunction.Builder.create(this, "Singleton") - .code(InlineCode.fromAsset("lambda")) - .handler("custom-resource-handler.on_event") - .runtime(Runtime.PYTHON_3_8) + final SingletonFunction isComplete = SingletonFunction.Builder.create(this, "Singleton2") .uuid(UUID.randomUUID().toString()) - .timeout(Duration.minutes(1)) + .code(Code.fromAsset("./asset/lambda-1.0.0-jar-with-dependencies.jar")) + .handler("software.amazon.awscdk.examples.CustomResourceIsCompleteHandler") + .runtime(Runtime.JAVA_21).memorySize(1024) + .timeout(Duration.minutes(5)) .build(); final Provider myProvider = Provider.Builder.create(this, "MyProvider") .onEventHandler(onEvent) + .isCompleteHandler(isComplete) .logRetention(RetentionDays.ONE_DAY) .build(); @@ -41,19 +47,10 @@ public MyCustomResource(final Construct scope, final String id, final Map + + + + custom-resource + com.amazonaws.cdk + 1.0.0 + + 4.0.0 + lambda + + + UTF-8 + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.2 + + false + + + + package + + shade + + + + + + + org.apache.maven.plugins + maven-resources-plugin + + + copy-folder + test + + copy-resources + + + ${project.basedir}/cdk.out + + + false + ${project.basedir}/cdk.out.dummy + + + + + + + + + + + + + com.amazonaws + aws-lambda-java-core + 1.2.1 + + + com.amazonaws + aws-lambda-java-events + 3.10.0 + + + + + + software.amazon.awssdk + bom + 2.10.24 + pom + import + + + + + + \ No newline at end of file diff --git a/java/custom-resource/lambda/src/main/java/software/amazon/awscdk/examples/CustomResourceHandler.java b/java/custom-resource/lambda/src/main/java/software/amazon/awscdk/examples/CustomResourceHandler.java new file mode 100644 index 0000000000..fa4523381f --- /dev/null +++ b/java/custom-resource/lambda/src/main/java/software/amazon/awscdk/examples/CustomResourceHandler.java @@ -0,0 +1,53 @@ +package software.amazon.awscdk.examples; + +import java.util.HashMap; +import java.util.Map; + +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +public class CustomResourceHandler implements RequestHandler, Map> { + @Override + public Map handleRequest(Map event, Context context) { + String requestType = (String) event.get("RequestType"); + + switch (requestType) { + case "Create": + return onCreate(event); + case "Update": + return onUpdate(event); + case "Delete": + return onDelete(event); + default: + throw new RuntimeException("Invalid request type: " + requestType); + } + } + + private Map onCreate(Map event) { + @SuppressWarnings("unchecked") + Map props = (Map) event.get("ResourceProperties"); + String message = (String) props.get("Message"); + + Map attributes = new HashMap(); + attributes.put("Response", String.format("Resource message %s", message)); + + Map response = new HashMap(); + response.put("Data", attributes); + + return response; + } + + private Map onUpdate(Map event) { + String physicalId = (String) event.get("PhysicalResourceId"); + Map response = new HashMap(); + response.put("PhysicalResourceId", physicalId); + return response; + } + + private Map onDelete(Map event) { + String physicalId = (String) event.get("PhysicalResourceId"); + Map response = new HashMap(); + response.put("PhysicalResourceId", physicalId); + return response; + } +} diff --git a/java/custom-resource/lambda/src/main/java/software/amazon/awscdk/examples/CustomResourceIsCompleteHandler.java b/java/custom-resource/lambda/src/main/java/software/amazon/awscdk/examples/CustomResourceIsCompleteHandler.java new file mode 100644 index 0000000000..c3c0799103 --- /dev/null +++ b/java/custom-resource/lambda/src/main/java/software/amazon/awscdk/examples/CustomResourceIsCompleteHandler.java @@ -0,0 +1,16 @@ +package software.amazon.awscdk.examples; + +import java.util.HashMap; +import java.util.Map; + +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +public class CustomResourceIsCompleteHandler implements RequestHandler, Map> { + @Override + public Map handleRequest(Map event, Context context) { + Map response = new HashMap(); + response.put("IsComplete", true); + return response; + } +} diff --git a/java/custom-resource/pom.xml b/java/custom-resource/pom.xml index 7425d4e017..c1ee36f0c1 100644 --- a/java/custom-resource/pom.xml +++ b/java/custom-resource/pom.xml @@ -1,75 +1,59 @@ - - 4.0.0 - com.amazonaws.cdk - custom-resource - 1.0.0 + + 4.0.0 - - UTF-8 - + com.amazonaws.cdk + custom-resource + pom + 1.0.0 - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 1.8 - 1.8 - - + + lambda + cdk + - - org.apache.maven.plugins - maven-assembly-plugin - 3.1.0 - - - jar-with-dependencies - - - - com.amazonaws.cdk.examples.CustomResourceApp - - - - - - make-assembly - package - - single - - - - - - + + UTF-8 + - - - - software.amazon.awscdk - aws-cdk-lib - [2.0.0,) - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + - - software.constructs - constructs - [10.0.0,) - + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + jar-with-dependencies + + + + com.amazonaws.cdk.software.amazon.awscdk.examples.CustomResourceApp + + + + + + make-assembly + package + + single + + + + - - - junit - junit - 4.13.1 - test - - - + + + \ No newline at end of file