From d9a8febb1b1cc67ddd661a9da839754f6ec51d94 Mon Sep 17 00:00:00 2001 From: Frank Chen Date: Thu, 2 Apr 2026 17:46:26 -0700 Subject: [PATCH 1/7] update examples to use zip deployment --- .github/workflows/e2e-tests.yml | 4 +- examples/Dockerfile | 29 -- examples/Dockerfile-java17 | 30 -- examples/Dockerfile-java21 | 30 -- examples/Dockerfile-java25 | 30 -- examples/README.md | 1 - examples/template.yaml | 494 ++++++++------------------------ 7 files changed, 116 insertions(+), 502 deletions(-) delete mode 100644 examples/Dockerfile delete mode 100644 examples/Dockerfile-java17 delete mode 100644 examples/Dockerfile-java21 delete mode 100644 examples/Dockerfile-java25 diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 3ace24a96..783324553 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -60,13 +60,13 @@ jobs: - name: sam build run: | # add --no-cached if debugging sam build sam build --parameter-overrides \ - 'ParameterKey=Architecture,ParameterValue=x86_64 ParameterKey=DockerFile,ParameterValue=examples/Dockerfile-java${{ matrix.java }} ParameterKey=FunctionNameSuffix,ParameterValue=-java${{ matrix.java }}' + 'ParameterKey=Architecture,ParameterValue=x86_64 ParameterKey=JavaVersion,ParameterValue=java${{ matrix.java }}' working-directory: ./examples - name: sam deploy run: | sam deploy --stack-name Java${{ matrix.java }}SDKCloudBasedIntegrationTestStack \ --resolve-image-repos --resolve-s3 --capabilities CAPABILITY_IAM --parameter-overrides \ - 'ParameterKey=Architecture,ParameterValue=x86_64 ParameterKey=DockerFile,ParameterValue=examples/Dockerfile-java${{ matrix.java }} ParameterKey=FunctionNameSuffix,ParameterValue=-java${{ matrix.java }}' + 'ParameterKey=Architecture,ParameterValue=x86_64 ParameterKey=JavaVersion,ParameterValue=java${{ matrix.java }}' working-directory: ./examples - name: Setup Java ${{ matrix.java }} uses: actions/setup-java@v5 diff --git a/examples/Dockerfile b/examples/Dockerfile deleted file mode 100644 index 379c2c8d1..000000000 --- a/examples/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -# Build stage -FROM amazoncorretto:17-alpine AS builder - -# Install Maven -RUN apk add --no-cache maven -WORKDIR /build - -# Copy parent pom and all modules -COPY pom.xml . -COPY sdk ./sdk -COPY sdk-testing ./sdk-testing -COPY sdk-integration-tests ./sdk-integration-tests -COPY examples ./examples -COPY coverage-report ./coverage-report - -# Build and install the SDK modules first -RUN mvn clean install -DskipTests -pl sdk,sdk-testing -am - -# Build the examples project -RUN mvn clean package -DskipTests -pl examples -am - -# Runtime stage -FROM public.ecr.aws/lambda/java:17 - -# Copy only the built JAR from build stage -COPY --from=builder /build/examples/target/*.jar ${LAMBDA_TASK_ROOT}/lib/ - -# Default CMD (will be overridden by ImageConfig.Command in SAM template) -CMD ["software.amazon.lambda.durable.examples.step.SimpleStepExample::handleRequest"] diff --git a/examples/Dockerfile-java17 b/examples/Dockerfile-java17 deleted file mode 100644 index 8e49bfd33..000000000 --- a/examples/Dockerfile-java17 +++ /dev/null @@ -1,30 +0,0 @@ -# Build stage -FROM --platform=linux/amd64 amazoncorretto:17-alpine AS builder - -WORKDIR /build - -# Copy parent pom and all modules -COPY pom.xml . -COPY sdk ./sdk -COPY sdk-testing ./sdk-testing -COPY sdk-integration-tests ./sdk-integration-tests -COPY examples ./examples -COPY coverage-report ./coverage-report - -# Install Maven -RUN apk add --no-cache maven - -# Build and install the SDK modules first -RUN mvn clean install -DskipTests -pl sdk,sdk-testing -am - -# Build the examples project -RUN mvn clean package -DskipTests -pl examples -am - -# Runtime stage -FROM public.ecr.aws/lambda/java:17 - -# Copy only the built JAR from build stage -COPY --from=builder /build/examples/target/*.jar ${LAMBDA_TASK_ROOT}/lib/ - -# Default CMD (will be overridden by ImageConfig.Command in SAM template) -CMD ["software.amazon.lambda.durable.examples.step.SimpleStepExample::handleRequest"] diff --git a/examples/Dockerfile-java21 b/examples/Dockerfile-java21 deleted file mode 100644 index c0714457b..000000000 --- a/examples/Dockerfile-java21 +++ /dev/null @@ -1,30 +0,0 @@ -# Build stage -FROM --platform=linux/amd64 amazoncorretto:21-alpine AS builder - -WORKDIR /build - -# Copy parent pom and all modules -COPY pom.xml . -COPY sdk ./sdk -COPY sdk-testing ./sdk-testing -COPY sdk-integration-tests ./sdk-integration-tests -COPY examples ./examples -COPY coverage-report ./coverage-report - -# Install Maven -RUN apk add --no-cache maven - -# Build and install the SDK modules first -RUN mvn clean install -DskipTests -pl sdk,sdk-testing -am - -# Build the examples project -RUN mvn clean package -DskipTests -pl examples -am - -# Runtime stage -FROM public.ecr.aws/lambda/java:21 - -# Copy only the built JAR from build stage -COPY --from=builder /build/examples/target/*.jar ${LAMBDA_TASK_ROOT}/lib/ - -# Default CMD (will be overridden by ImageConfig.Command in SAM template) -CMD ["software.amazon.lambda.durable.examples.step.SimpleStepExample::handleRequest"] diff --git a/examples/Dockerfile-java25 b/examples/Dockerfile-java25 deleted file mode 100644 index 6201b7918..000000000 --- a/examples/Dockerfile-java25 +++ /dev/null @@ -1,30 +0,0 @@ -# Build stage -FROM --platform=linux/amd64 amazoncorretto:25-alpine AS builder - -WORKDIR /build - -# Copy parent pom and all modules -COPY pom.xml . -COPY sdk ./sdk -COPY sdk-testing ./sdk-testing -COPY sdk-integration-tests ./sdk-integration-tests -COPY examples ./examples -COPY coverage-report ./coverage-report - -# Install Maven -RUN apk add --no-cache maven - -# Build and install the SDK modules first -RUN mvn clean install -DskipTests -pl sdk,sdk-testing -am - -# Build the examples project -RUN mvn clean package -DskipTests -pl examples -am - -# Runtime stage -FROM public.ecr.aws/lambda/java:25 - -# Copy only the built JAR from build stage -COPY --from=builder /build/examples/target/*.jar ${LAMBDA_TASK_ROOT}/lib/ - -# Default CMD (will be overridden by ImageConfig.Command in SAM template) -CMD ["software.amazon.lambda.durable.examples.step.SimpleStepExample::handleRequest"] diff --git a/examples/README.md b/examples/README.md index 606aa6370..3eb183e0a 100644 --- a/examples/README.md +++ b/examples/README.md @@ -7,7 +7,6 @@ Example applications demonstrating the AWS Lambda Durable Execution SDK for Java - Java 17+ - Maven 3.8+ - AWS SAM CLI (for deployment) -- Docker (for SAM build) - AWS credentials configured ## Local Testing diff --git a/examples/template.yaml b/examples/template.yaml index 324ff008e..6568e83ec 100644 --- a/examples/template.yaml +++ b/examples/template.yaml @@ -10,14 +10,10 @@ Parameters: AllowedValues: - x86_64 - arm64 - DockerFile: + JavaVersion: Type: String - Default: examples/Dockerfile - Description: path to Dockerfile - FunctionNameSuffix: - Type: String - Default: '' - Description: Suffix to append to all function names + Default: 'java17' + Description: Java runtime version Globals: Function: @@ -25,57 +21,40 @@ Globals: MemorySize: 512 Architectures: - !Ref Architecture + DurableConfig: + ExecutionTimeout: 300 + RetentionPeriodInDays: 7 Resources: NoopExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - noop-example - - !Ref FunctionNameSuffix - ImageConfig: - Command: [ "software.amazon.lambda.durable.examples.general.NoopExample::handleRequest" ] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.general.NoopExample" + Runtime: !Ref JavaVersion SimpleStepExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - simple-step-example - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.step.SimpleStepExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.step.SimpleStepExample" + Runtime: !Ref JavaVersion SimpleInvokeExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'simple-invoke-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.invoke.SimpleInvokeExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.invoke.SimpleInvokeExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow @@ -83,665 +62,420 @@ Resources: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - lambda:InvokeFunction - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:simple-invoke-example${FunctionNameSuffix}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:simple-invoke-example${JavaVersion}" - Effect: Allow Action: - lambda:InvokeFunction Resource: '*' - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples WaitExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'wait-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.wait.WaitExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.wait.WaitExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-example${JavaVersion}" RetryExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'retry-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.step.RetryExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.step.RetryExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:retry-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:retry-example${JavaVersion}" WaitAtLeastExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'wait-at-least-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.wait.WaitAtLeastExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.wait.WaitAtLeastExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-at-least-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-at-least-example${JavaVersion}" WaitAtLeastInProcessExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'wait-at-least-in-process-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.wait.WaitAtLeastInProcessExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.wait.WaitAtLeastInProcessExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-at-least-in-process-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-at-least-in-process-example${JavaVersion}" RetryInProcessExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'retry-in-process-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.step.RetryInProcessExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.step.RetryInProcessExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:retry-in-process-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:retry-in-process-example${JavaVersion}" GenericTypesExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'generic-types-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.general.GenericTypesExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.general.GenericTypesExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:generic-types-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:generic-types-example${JavaVersion}" GenericInputOutputExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'generic-input-output-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.general.GenericInputOutputExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.general.GenericInputOutputExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:generic-input-output-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:generic-input-output-example${JavaVersion}" CustomConfigExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'custom-config-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.general.CustomConfigExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.general.CustomConfigExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:custom-config-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:custom-config-example${JavaVersion}" LoggingExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'logging-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.general.LoggingExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.general.LoggingExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:logging-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:logging-example${JavaVersion}" ErrorHandlingExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'error-handling-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.general.ErrorHandlingExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.general.ErrorHandlingExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:error-handling-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:error-handling-example${JavaVersion}" CallbackExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'callback-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.callback.CallbackExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.callback.CallbackExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:callback-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:callback-example${JavaVersion}" ManyAsyncStepsExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'many-async-steps-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.step.ManyAsyncStepsExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.step.ManyAsyncStepsExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:many-async-steps-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:many-async-steps-example${JavaVersion}" ChildContextExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'child-context-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.child.ChildContextExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.child.ChildContextExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:child-context-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:child-context-example${JavaVersion}" WaitAsyncExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'wait-async-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.wait.WaitAsyncExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.wait.WaitAsyncExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-async-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-async-example${JavaVersion}" ManyAsyncChildContextExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'many-async-child-context-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.child.ManyAsyncChildContextExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.child.ManyAsyncChildContextExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:many-async-child-context-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:many-async-child-context-example${JavaVersion}" SimpleMapExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'simple-map-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.map.SimpleMapExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.map.SimpleMapExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:simple-map-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:simple-map-example${JavaVersion}" ComplexMapExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'complex-map-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.map.ComplexMapExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.map.ComplexMapExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:complex-map-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:complex-map-example${JavaVersion}" WaitForConditionExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'wait-for-condition-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.wait.WaitForConditionExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.wait.WaitForConditionExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-for-condition-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-for-condition-example${JavaVersion}" ConcurrentWaitForConditionExampleFunction: Type: AWS::Serverless::Function Properties: - PackageType: Image FunctionName: !Join - - '' + - '-' - - 'concurrent-wait-for-condition-example' - - !Ref FunctionNameSuffix - ImageConfig: - Command: ["software.amazon.lambda.durable.examples.wait.ConcurrentWaitForConditionExample::handleRequest"] - DurableConfig: - ExecutionTimeout: 300 - RetentionPeriodInDays: 7 + - !Ref JavaVersion + Handler: "software.amazon.lambda.durable.examples.wait.ConcurrentWaitForConditionExample" + Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:concurrent-wait-for-condition-example${FunctionNameSuffix}" - Metadata: - Dockerfile: !Ref DockerFile - DockerContext: ../ - DockerTag: durable-examples + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:concurrent-wait-for-condition-example${JavaVersion}" Outputs: NoopExampleFunction: Description: Noop Example Function ARN Value: !GetAtt NoopExampleFunction.Arn - NoopExampleFunctionName: - Description: Noop Example Function Name - Value: !Ref NoopExampleFunction - SimpleStepExampleFunction: Description: Simple Step Example Function ARN Value: !GetAtt SimpleStepExampleFunction.Arn - SimpleStepExampleFunctionName: - Description: Simple Step Example Function Name - Value: !Ref SimpleStepExampleFunction - SimpleInvokeExampleFunction: Description: Simple Invoke Example Function ARN Value: !GetAtt SimpleInvokeExampleFunction.Arn - SimpleInvokeExampleFunctionName: - Description: Simple Invoke Example Function Name - Value: !Ref SimpleInvokeExampleFunction - WaitExampleFunction: Description: Wait Example Function ARN Value: !GetAtt WaitExampleFunction.Arn - WaitExampleFunctionName: - Description: Wait Example Function Name - Value: !Ref WaitExampleFunction - RetryExampleFunction: Description: Retry Example Function ARN Value: !GetAtt RetryExampleFunction.Arn - RetryExampleFunctionName: - Description: Retry Example Function Name - Value: !Ref RetryExampleFunction - WaitAtLeastExampleFunction: Description: Wait At Least Example Function ARN Value: !GetAtt WaitAtLeastExampleFunction.Arn - WaitAtLeastExampleFunctionName: - Description: Wait At Least Example Function Name - Value: !Ref WaitAtLeastExampleFunction - WaitAtLeastInProcessExampleFunction: Description: Wait At Least In Process Example Function ARN Value: !GetAtt WaitAtLeastInProcessExampleFunction.Arn - WaitAtLeastInProcessExampleFunctionName: - Description: Wait At Least In Process Example Function Name - Value: !Ref WaitAtLeastInProcessExampleFunction - RetryInProcessExampleFunction: Description: Retry In Process Example Function ARN Value: !GetAtt RetryInProcessExampleFunction.Arn - RetryInProcessExampleFunctionName: - Description: Retry In Process Example Function Name - Value: !Ref RetryInProcessExampleFunction - GenericTypesExampleFunction: Description: Generic Types Example Function ARN Value: !GetAtt GenericTypesExampleFunction.Arn - GenericTypesExampleFunctionName: - Description: Generic Types Example Function Name - Value: !Ref GenericTypesExampleFunction - GenericInputOutputExampleFunction: Description: Generic Input Output Example Function ARN Value: !GetAtt GenericInputOutputExampleFunction.Arn - GenericInputOutputExampleFunctionName: - Description: Generic Input Output Example Function Name - Value: !Ref GenericInputOutputExampleFunction - CustomConfigExampleFunction: Description: Custom Config Example Function ARN Value: !GetAtt CustomConfigExampleFunction.Arn - CustomConfigExampleFunctionName: - Description: Custom Config Example Function Name - Value: !Ref CustomConfigExampleFunction - LoggingExampleFunction: Description: Logging Example Function ARN Value: !GetAtt LoggingExampleFunction.Arn - LoggingExampleFunctionName: - Description: Logging Example Function Name - Value: !Ref LoggingExampleFunction - ErrorHandlingExampleFunction: Description: Error Handling Example Function ARN Value: !GetAtt ErrorHandlingExampleFunction.Arn - ErrorHandlingExampleFunctionName: - Description: Error Handling Example Function Name - Value: !Ref ErrorHandlingExampleFunction - CallbackExampleFunction: Description: Callback Example Function ARN Value: !GetAtt CallbackExampleFunction.Arn - CallbackExampleFunctionName: - Description: Callback Example Function Name - Value: !Ref CallbackExampleFunction - ManyAsyncStepsExampleFunction: Description: Many Async Steps Example Function ARN Value: !GetAtt ManyAsyncStepsExampleFunction.Arn - ManyAsyncStepsExampleFunctionName: - Description: Many Async Steps Example Function Name - Value: !Ref ManyAsyncStepsExampleFunction - ChildContextExampleFunction: Description: Child Context Example Function ARN Value: !GetAtt ChildContextExampleFunction.Arn - ChildContextExampleFunctionName: - Description: Child Context Example Function Name - Value: !Ref ChildContextExampleFunction - WaitAsyncExampleFunction: Description: Wait Async Example Function ARN Value: !GetAtt WaitAsyncExampleFunction.Arn - WaitAsyncExampleFunctionName: - Description: Wait Async Example Function Name - Value: !Ref WaitAsyncExampleFunction - ManyAsyncChildContextExampleFunction: Description: Many Async Child Context Example Function ARN Value: !GetAtt ManyAsyncChildContextExampleFunction.Arn - ManyAsyncChildContextExampleFunctionName: - Description: Many Async Child Context Example Function Name - Value: !Ref ManyAsyncChildContextExampleFunction - SimpleMapExampleFunction: Description: Simple Map Example Function ARN Value: !GetAtt SimpleMapExampleFunction.Arn - SimpleMapExampleFunctionName: - Description: Simple Map Example Function Name - Value: !Ref SimpleMapExampleFunction - ComplexMapExampleFunction: Description: Complex Map Example Function ARN Value: !GetAtt ComplexMapExampleFunction.Arn - ComplexMapExampleFunctionName: - Description: Complex Map Example Function Name - Value: !Ref ComplexMapExampleFunction - WaitForConditionExampleFunction: Description: Wait For Condition Example Function ARN Value: !GetAtt WaitForConditionExampleFunction.Arn - WaitForConditionExampleFunctionName: - Description: Wait For Condition Example Function Name - Value: !Ref WaitForConditionExampleFunction - ConcurrentWaitForConditionExampleFunction: Description: Concurrent Wait For Condition Example Function ARN Value: !GetAtt ConcurrentWaitForConditionExampleFunction.Arn - - ConcurrentWaitForConditionExampleFunctionName: - Description: Concurrent Wait For Condition Example Function Name - Value: !Ref ConcurrentWaitForConditionExampleFunction - From 1bb6f8519f8e0ffd3024ed6b305062e23ba03ca7 Mon Sep 17 00:00:00 2001 From: Frank Chen Date: Thu, 2 Apr 2026 17:50:42 -0700 Subject: [PATCH 2/7] update cloud test running to use java17 by default --- .../lambda/durable/examples/CloudBasedIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/src/test/java/software/amazon/lambda/durable/examples/CloudBasedIntegrationTest.java b/examples/src/test/java/software/amazon/lambda/durable/examples/CloudBasedIntegrationTest.java index 740f3f017..f45ffc332 100644 --- a/examples/src/test/java/software/amazon/lambda/durable/examples/CloudBasedIntegrationTest.java +++ b/examples/src/test/java/software/amazon/lambda/durable/examples/CloudBasedIntegrationTest.java @@ -60,7 +60,7 @@ static void setup() { account = System.getProperty("test.aws.account"); region = System.getProperty("test.aws.region"); - functionNameSuffix = System.getProperty("test.function.name.suffix", ""); + functionNameSuffix = System.getProperty("test.function.name.suffix", "-java17"); if (account == null || region == null) { try (var sts = StsClient.create()) { From d9738ed2b21ce1d8e3f35b857ad093545e8493f6 Mon Sep 17 00:00:00 2001 From: Frank Chen Date: Thu, 2 Apr 2026 18:06:01 -0700 Subject: [PATCH 3/7] fix e2e workflow --- .github/workflows/e2e-tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 783324553..9da033b98 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -57,6 +57,8 @@ jobs: role-to-assume: "${{ secrets.ACTIONS_INTEGRATION_ROLE_NAME }}" role-session-name: java-language-sdk-test aws-region: ${{ env.AWS_REGION }} + - name: Build locally + run: mvn -B -q -Dmaven.test.skip=true install --file pom.xml - name: sam build run: | # add --no-cached if debugging sam build sam build --parameter-overrides \ From ad51e50ed90d1a9aea6188cb5b6a556846144386 Mon Sep 17 00:00:00 2001 From: Frank Chen Date: Fri, 3 Apr 2026 14:10:30 -0700 Subject: [PATCH 4/7] fix policy --- examples/template.yaml | 63 ++++++++++++++---------------------------- 1 file changed, 21 insertions(+), 42 deletions(-) diff --git a/examples/template.yaml b/examples/template.yaml index 6568e83ec..731efea6f 100644 --- a/examples/template.yaml +++ b/examples/template.yaml @@ -24,6 +24,7 @@ Globals: DurableConfig: ExecutionTimeout: 300 RetentionPeriodInDays: 7 + Runtime: !Ref JavaVersion Resources: NoopExampleFunction: @@ -34,7 +35,6 @@ Resources: - - noop-example - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.general.NoopExample" - Runtime: !Ref JavaVersion SimpleStepExampleFunction: Type: AWS::Serverless::Function @@ -44,7 +44,6 @@ Resources: - - simple-step-example - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.step.SimpleStepExample" - Runtime: !Ref JavaVersion SimpleInvokeExampleFunction: Type: AWS::Serverless::Function @@ -54,7 +53,6 @@ Resources: - - 'simple-invoke-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.invoke.SimpleInvokeExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow @@ -62,7 +60,7 @@ Resources: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - lambda:InvokeFunction - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:simple-invoke-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:simple-invoke-example-${JavaVersion}" - Effect: Allow Action: - lambda:InvokeFunction @@ -76,14 +74,13 @@ Resources: - - 'wait-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.wait.WaitExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-example-${JavaVersion}" RetryExampleFunction: Type: AWS::Serverless::Function @@ -93,14 +90,13 @@ Resources: - - 'retry-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.step.RetryExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:retry-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:retry-example-${JavaVersion}" WaitAtLeastExampleFunction: Type: AWS::Serverless::Function @@ -110,14 +106,13 @@ Resources: - - 'wait-at-least-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.wait.WaitAtLeastExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-at-least-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-at-least-example-${JavaVersion}" WaitAtLeastInProcessExampleFunction: Type: AWS::Serverless::Function @@ -127,14 +122,13 @@ Resources: - - 'wait-at-least-in-process-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.wait.WaitAtLeastInProcessExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-at-least-in-process-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-at-least-in-process-example-${JavaVersion}" RetryInProcessExampleFunction: Type: AWS::Serverless::Function @@ -144,14 +138,13 @@ Resources: - - 'retry-in-process-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.step.RetryInProcessExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:retry-in-process-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:retry-in-process-example-${JavaVersion}" GenericTypesExampleFunction: Type: AWS::Serverless::Function @@ -161,14 +154,13 @@ Resources: - - 'generic-types-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.general.GenericTypesExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:generic-types-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:generic-types-example-${JavaVersion}" GenericInputOutputExampleFunction: Type: AWS::Serverless::Function @@ -178,14 +170,13 @@ Resources: - - 'generic-input-output-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.general.GenericInputOutputExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:generic-input-output-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:generic-input-output-example-${JavaVersion}" CustomConfigExampleFunction: Type: AWS::Serverless::Function @@ -195,14 +186,13 @@ Resources: - - 'custom-config-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.general.CustomConfigExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:custom-config-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:custom-config-example-${JavaVersion}" LoggingExampleFunction: Type: AWS::Serverless::Function @@ -212,14 +202,13 @@ Resources: - - 'logging-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.general.LoggingExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:logging-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:logging-example-${JavaVersion}" ErrorHandlingExampleFunction: Type: AWS::Serverless::Function @@ -229,14 +218,13 @@ Resources: - - 'error-handling-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.general.ErrorHandlingExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:error-handling-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:error-handling-example-${JavaVersion}" CallbackExampleFunction: Type: AWS::Serverless::Function @@ -246,14 +234,13 @@ Resources: - - 'callback-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.callback.CallbackExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:callback-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:callback-example-${JavaVersion}" ManyAsyncStepsExampleFunction: Type: AWS::Serverless::Function @@ -263,14 +250,13 @@ Resources: - - 'many-async-steps-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.step.ManyAsyncStepsExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:many-async-steps-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:many-async-steps-example-${JavaVersion}" ChildContextExampleFunction: Type: AWS::Serverless::Function @@ -280,14 +266,13 @@ Resources: - - 'child-context-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.child.ChildContextExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:child-context-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:child-context-example-${JavaVersion}" WaitAsyncExampleFunction: Type: AWS::Serverless::Function @@ -297,14 +282,13 @@ Resources: - - 'wait-async-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.wait.WaitAsyncExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-async-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-async-example-${JavaVersion}" ManyAsyncChildContextExampleFunction: Type: AWS::Serverless::Function @@ -314,14 +298,13 @@ Resources: - - 'many-async-child-context-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.child.ManyAsyncChildContextExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:many-async-child-context-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:many-async-child-context-example-${JavaVersion}" SimpleMapExampleFunction: Type: AWS::Serverless::Function @@ -331,14 +314,13 @@ Resources: - - 'simple-map-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.map.SimpleMapExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:simple-map-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:simple-map-example-${JavaVersion}" ComplexMapExampleFunction: Type: AWS::Serverless::Function @@ -348,14 +330,13 @@ Resources: - - 'complex-map-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.map.ComplexMapExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:complex-map-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:complex-map-example-${JavaVersion}" WaitForConditionExampleFunction: Type: AWS::Serverless::Function @@ -365,14 +346,13 @@ Resources: - - 'wait-for-condition-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.wait.WaitForConditionExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-for-condition-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-for-condition-example-${JavaVersion}" ConcurrentWaitForConditionExampleFunction: Type: AWS::Serverless::Function @@ -382,14 +362,13 @@ Resources: - - 'concurrent-wait-for-condition-example' - !Ref JavaVersion Handler: "software.amazon.lambda.durable.examples.wait.ConcurrentWaitForConditionExample" - Runtime: !Ref JavaVersion Policies: - Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:concurrent-wait-for-condition-example${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:concurrent-wait-for-condition-example-${JavaVersion}" Outputs: NoopExampleFunction: From f0cdf708510599d1698dd6741666fcd39df2759a Mon Sep 17 00:00:00 2001 From: Frank Chen Date: Wed, 8 Apr 2026 09:30:08 -0700 Subject: [PATCH 5/7] rename stack name to avoid deployment failures --- .github/workflows/e2e-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 9da033b98..971278f29 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -66,7 +66,7 @@ jobs: working-directory: ./examples - name: sam deploy run: | - sam deploy --stack-name Java${{ matrix.java }}SDKCloudBasedIntegrationTestStack \ + sam deploy --stack-name JavaSDKCloudBasedIntegrationTestStack-Java${{ matrix.java }}Runtime \ --resolve-image-repos --resolve-s3 --capabilities CAPABILITY_IAM --parameter-overrides \ 'ParameterKey=Architecture,ParameterValue=x86_64 ParameterKey=JavaVersion,ParameterValue=java${{ matrix.java }}' working-directory: ./examples From f82b3227e0e306fc4382fb52aac7c2925995161a Mon Sep 17 00:00:00 2001 From: Frank Chen Date: Wed, 8 Apr 2026 09:50:32 -0700 Subject: [PATCH 6/7] rename function to avoid conflict --- examples/template.yaml | 62 ++++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/examples/template.yaml b/examples/template.yaml index 731efea6f..36adfc5a5 100644 --- a/examples/template.yaml +++ b/examples/template.yaml @@ -34,6 +34,7 @@ Resources: - '-' - - noop-example - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.general.NoopExample" SimpleStepExampleFunction: @@ -43,6 +44,7 @@ Resources: - '-' - - simple-step-example - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.step.SimpleStepExample" SimpleInvokeExampleFunction: @@ -52,6 +54,7 @@ Resources: - '-' - - 'simple-invoke-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.invoke.SimpleInvokeExample" Policies: - Statement: @@ -60,7 +63,7 @@ Resources: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - lambda:InvokeFunction - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:simple-invoke-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:simple-invoke-example-${JavaVersion}-runtime" - Effect: Allow Action: - lambda:InvokeFunction @@ -73,6 +76,7 @@ Resources: - '-' - - 'wait-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.wait.WaitExample" Policies: - Statement: @@ -80,7 +84,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-example-${JavaVersion}-runtime" RetryExampleFunction: Type: AWS::Serverless::Function @@ -89,6 +93,7 @@ Resources: - '-' - - 'retry-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.step.RetryExample" Policies: - Statement: @@ -96,7 +101,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:retry-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:retry-example-${JavaVersion}-runtime" WaitAtLeastExampleFunction: Type: AWS::Serverless::Function @@ -105,6 +110,7 @@ Resources: - '-' - - 'wait-at-least-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.wait.WaitAtLeastExample" Policies: - Statement: @@ -112,7 +118,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-at-least-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-at-least-example-${JavaVersion}-runtime" WaitAtLeastInProcessExampleFunction: Type: AWS::Serverless::Function @@ -121,6 +127,7 @@ Resources: - '-' - - 'wait-at-least-in-process-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.wait.WaitAtLeastInProcessExample" Policies: - Statement: @@ -128,7 +135,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-at-least-in-process-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-at-least-in-process-example-${JavaVersion}-runtime" RetryInProcessExampleFunction: Type: AWS::Serverless::Function @@ -137,6 +144,7 @@ Resources: - '-' - - 'retry-in-process-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.step.RetryInProcessExample" Policies: - Statement: @@ -144,7 +152,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:retry-in-process-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:retry-in-process-example-${JavaVersion}-runtime" GenericTypesExampleFunction: Type: AWS::Serverless::Function @@ -153,6 +161,7 @@ Resources: - '-' - - 'generic-types-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.general.GenericTypesExample" Policies: - Statement: @@ -160,7 +169,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:generic-types-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:generic-types-example-${JavaVersion}-runtime" GenericInputOutputExampleFunction: Type: AWS::Serverless::Function @@ -169,6 +178,7 @@ Resources: - '-' - - 'generic-input-output-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.general.GenericInputOutputExample" Policies: - Statement: @@ -176,7 +186,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:generic-input-output-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:generic-input-output-example-${JavaVersion}-runtime" CustomConfigExampleFunction: Type: AWS::Serverless::Function @@ -185,6 +195,7 @@ Resources: - '-' - - 'custom-config-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.general.CustomConfigExample" Policies: - Statement: @@ -192,7 +203,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:custom-config-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:custom-config-example-${JavaVersion}-runtime" LoggingExampleFunction: Type: AWS::Serverless::Function @@ -201,6 +212,7 @@ Resources: - '-' - - 'logging-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.general.LoggingExample" Policies: - Statement: @@ -208,7 +220,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:logging-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:logging-example-${JavaVersion}-runtime" ErrorHandlingExampleFunction: Type: AWS::Serverless::Function @@ -217,6 +229,7 @@ Resources: - '-' - - 'error-handling-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.general.ErrorHandlingExample" Policies: - Statement: @@ -224,7 +237,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:error-handling-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:error-handling-example-${JavaVersion}-runtime" CallbackExampleFunction: Type: AWS::Serverless::Function @@ -233,6 +246,7 @@ Resources: - '-' - - 'callback-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.callback.CallbackExample" Policies: - Statement: @@ -240,7 +254,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:callback-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:callback-example-${JavaVersion}-runtime" ManyAsyncStepsExampleFunction: Type: AWS::Serverless::Function @@ -249,6 +263,7 @@ Resources: - '-' - - 'many-async-steps-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.step.ManyAsyncStepsExample" Policies: - Statement: @@ -256,7 +271,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:many-async-steps-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:many-async-steps-example-${JavaVersion}-runtime" ChildContextExampleFunction: Type: AWS::Serverless::Function @@ -265,6 +280,7 @@ Resources: - '-' - - 'child-context-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.child.ChildContextExample" Policies: - Statement: @@ -272,7 +288,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:child-context-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:child-context-example-${JavaVersion}-runtime" WaitAsyncExampleFunction: Type: AWS::Serverless::Function @@ -281,6 +297,7 @@ Resources: - '-' - - 'wait-async-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.wait.WaitAsyncExample" Policies: - Statement: @@ -288,7 +305,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-async-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-async-example-${JavaVersion}-runtime" ManyAsyncChildContextExampleFunction: Type: AWS::Serverless::Function @@ -297,6 +314,7 @@ Resources: - '-' - - 'many-async-child-context-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.child.ManyAsyncChildContextExample" Policies: - Statement: @@ -304,7 +322,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:many-async-child-context-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:many-async-child-context-example-${JavaVersion}-runtime" SimpleMapExampleFunction: Type: AWS::Serverless::Function @@ -313,6 +331,7 @@ Resources: - '-' - - 'simple-map-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.map.SimpleMapExample" Policies: - Statement: @@ -320,7 +339,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:simple-map-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:simple-map-example-${JavaVersion}-runtime" ComplexMapExampleFunction: Type: AWS::Serverless::Function @@ -329,6 +348,7 @@ Resources: - '-' - - 'complex-map-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.map.ComplexMapExample" Policies: - Statement: @@ -336,7 +356,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:complex-map-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:complex-map-example-${JavaVersion}-runtime" WaitForConditionExampleFunction: Type: AWS::Serverless::Function @@ -345,6 +365,7 @@ Resources: - '-' - - 'wait-for-condition-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.wait.WaitForConditionExample" Policies: - Statement: @@ -352,7 +373,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-for-condition-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:wait-for-condition-example-${JavaVersion}-runtime" ConcurrentWaitForConditionExampleFunction: Type: AWS::Serverless::Function @@ -361,6 +382,7 @@ Resources: - '-' - - 'concurrent-wait-for-condition-example' - !Ref JavaVersion + - runtime Handler: "software.amazon.lambda.durable.examples.wait.ConcurrentWaitForConditionExample" Policies: - Statement: @@ -368,7 +390,7 @@ Resources: Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState - Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:concurrent-wait-for-condition-example-${JavaVersion}" + Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:concurrent-wait-for-condition-example-${JavaVersion}-runtime" Outputs: NoopExampleFunction: From 7281d19360bb3323bda38a59e34bafc96938e377 Mon Sep 17 00:00:00 2001 From: Frank Chen Date: Wed, 8 Apr 2026 09:51:43 -0700 Subject: [PATCH 7/7] update cases to use the new function names --- .github/workflows/e2e-tests.yml | 2 +- .../lambda/durable/examples/CloudBasedIntegrationTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 971278f29..e38fe4149 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -79,5 +79,5 @@ jobs: - name: Build locally run: mvn -B -q -Dmaven.test.skip=true install --file pom.xml - name: Cloud Based Integration Tests - run: mvn clean test -B -Dtest.cloud.enabled=true -Dtest=CloudBasedIntegrationTest -Dtest.function.name.suffix='-java${{ matrix.java }}' + run: mvn clean test -B -Dtest.cloud.enabled=true -Dtest=CloudBasedIntegrationTest -Dtest.function.name.suffix='-java${{ matrix.java }}-runtime' working-directory: ./examples diff --git a/examples/src/test/java/software/amazon/lambda/durable/examples/CloudBasedIntegrationTest.java b/examples/src/test/java/software/amazon/lambda/durable/examples/CloudBasedIntegrationTest.java index f45ffc332..6f809513e 100644 --- a/examples/src/test/java/software/amazon/lambda/durable/examples/CloudBasedIntegrationTest.java +++ b/examples/src/test/java/software/amazon/lambda/durable/examples/CloudBasedIntegrationTest.java @@ -60,7 +60,7 @@ static void setup() { account = System.getProperty("test.aws.account"); region = System.getProperty("test.aws.region"); - functionNameSuffix = System.getProperty("test.function.name.suffix", "-java17"); + functionNameSuffix = System.getProperty("test.function.name.suffix", "-java17-runtime"); if (account == null || region == null) { try (var sts = StsClient.create()) {