Code Monkey home page Code Monkey logo

spring-native-aws-lambda's Introduction

spring-native-aws-lambda

CodeQL Build Deploy to AWS

Quality Gate Security Rating Reliability Rating Vulnerabilities Bugs SonarCloud Coverage

Component Version
JDK 21
Spring Cloud 2023.0.0
Spring Boot 3.2.1

Test

$ sdk use java 21.0.1-graal
$ ./mvnw -ntp clean verify -U

Building and Running

Locally

Using docker-compose

  1. Run the following commands
    $ docker-compose up
  2. Make a call
    $ curl --location --request POST 'http://localhost:4566/restapis/<restApiId>/compose/_user_request_/somePathId' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "body": "{ \"name\": \"CoffeeBeans\" }"
      }'
    The service responds
    [
        {
            "name": "CoffeeBeans",
            "saved": true
        }
    ]

Using mvnw

  1. Run the following commands
    $ export SPRING_PROFILES_ACTIVE=local
    $ ./mvnw -ntp clean -Pnative -DskipTests native:compile package -pl spring-native-aws-lambda-function
    $ ./spring-native-aws-lambda-function/target/spring-native-aws-lambda-function
    The service starts in less than 100 ms
    2022-12-07 02:56:51.706  INFO 42417 --- [           main] c.c.s.Application   : Starting Application using Java 17.0.4
    2022-12-07 02:56:51.706  INFO 42417 --- [           main] c.c.s.Application   : No active profile set, falling back to 1 default profile: "default"
    2022-12-07 02:56:51.723  INFO 42417 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
    2022-12-07 02:56:51.724  INFO 42417 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
    2022-12-07 02:56:51.724  INFO 42417 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.68]
    2022-12-07 02:56:51.733  INFO 42417 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
    2022-12-07 02:56:51.733  INFO 42417 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 27 ms
    2022-12-07 02:56:51.761  INFO 42417 --- [           main] o.s.c.f.web.mvc.FunctionHandlerMapping   : FunctionCatalog: org.springframework.cloud.function.context.catalog.BeanFactoryAwareFunctionRegistry@7efd575
    2022-12-07 02:56:51.763  INFO 42417 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
    2022-12-07 02:56:51.763  INFO 42417 --- [           main] c.c.s.Application   : Started Application in 0.084 seconds (JVM running for 0.087)
  2. Make a call
    $ curl --location --request POST 'http://localhost:8080' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "body": "{ \"name\": \"CoffeeBeans\" }"
      }'
    The service responds
    [
        {
            "name": "CoffeeBeans",
            "saved": true
        }
    ]

Github action

Initial setup for Github action to work

  1. Create an Identity providers in AWS for github actions.
  2. Create a new CoffeebeansCoreGithubActions Iam role with the following inline IAM policy
   {
   "Version": "2012-10-17",
   "Statement": [
      {
         "Action": "iam:PassRole",
         "Resource": [
            "arn:aws:iam::{aws-account-number}:role/cdk-{qualifier}-lookup-role-{aws-account-number}-{aws-region}",
            "arn:aws:iam::{aws-account-number}:role/cdk-{qualifier}-file-publishing-role-{aws-account-number}-{aws-region}",
            "arn:aws:iam::{aws-account-number}:role/cdk-{qualifier}-image-publishing-role-{aws-account-number}-{aws-region}",
            "arn:aws:iam::{aws-account-number}:role/cdk-{qualifier}-cfn-exec-role-{aws-account-number}-{aws-region}",
            "arn:aws:iam::{aws-account-number}:role/cdk-{qualifier}-deploy-role-{aws-account-number}-{aws-region}"
         ],
         "Effect": "Allow"
      }
   ]
}

and the following trust relationship

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": {
            "Federated": "arn:aws:iam::{aws-account-number}:oidc-provider/token.actions.githubusercontent.com"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
            "StringEquals": {
               "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
            },
            "StringLike": {
               "token.actions.githubusercontent.com:sub": "repo:{github-account-or-org}/spring-native-aws-lambda:*"
            }
         }
      }
   ]
}
  1. Create a new CDKBootstrapForCoffeebeansCore IAM role for CDK bootstrap with the following IAM managed policy CoffeebeansCoreCdkBootstrapAccess
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "ECRPermissions",
         "Effect": "Allow",
         "Action": [
            "ecr:CreateRepository",
            "ecr:DeleteRepository",
            "ecr:SetRepositoryPolicy",
            "ecr:DescribeRepositories"
         ],
         "Resource": "arn:aws:ecr:{aws-region}:{aws-account-number}:repository/cdk-{qualifier}-container-assets-{aws-account-number}-{aws-region}"
      },
      {
         "Sid": "IAMPermissions",
         "Effect": "Allow",
         "Action": [
            "iam:GetRole",
            "iam:CreateRole",
            "iam:DeleteRole",
            "iam:AttachRolePolicy",
            "iam:PutRolePolicy",
            "iam:DetachRolePolicy",
            "iam:DeleteRolePolicy"
         ],
         "Resource": [
            "arn:aws:iam::{aws-account-number}:role/cdk-{qualifier}-lookup-role-{aws-account-number}-{aws-region}",
            "arn:aws:iam::{aws-account-number}:role/cdk-{qualifier}-file-publishing-role-{aws-account-number}-{aws-region}",
            "arn:aws:iam::{aws-account-number}:role/cdk-{qualifier}-image-publishing-role-{aws-account-number}-{aws-region}",
            "arn:aws:iam::{aws-account-number}:role/cdk-{qualifier}-cfn-exec-role-{aws-account-number}-{aws-region}",
            "arn:aws:iam::{aws-account-number}:role/cdk-{qualifier}-deploy-role-{aws-account-number}-{aws-region}"
         ]
      },
      {
         "Sid": "S3Permissions",
         "Effect": "Allow",
         "Action": [
            "s3:PutBucketPublicAccessBlock",
            "s3:CreateBucket",
            "s3:DeleteBucketPolicy",
            "s3:PutEncryptionConfiguration",
            "s3:GetEncryptionConfiguration",
            "s3:PutBucketPolicy",
            "s3:DeleteBucket",
            "s3:PutBucketVersioning"
         ],
         "Resource": [
            "arn:aws:s3:::{qualifier}-cdk-bucket"
         ]
      },
      {
         "Sid": "SSMPermissions",
         "Effect": "Allow",
         "Action": [
            "ssm:DeleteParameter",
            "ssm:AddTagsToResource",
            "ssm:GetParameters",
            "ssm:PutParameter"
         ],
         "Resource": "arn:aws:ssm:{aws-region}:{aws-account-number}:parameter/cdk-bootstrap/{qualifier}/version"
      }
   ]
}
  1. Create an IAM managed policy CoffeebeansCoreCdkExecutionAccess to be used by cdk-{qualifier}-cfn-exec-role-{aws-account-number}-{aws-region} which is gonna be created by CDK
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "S3Permissions",
         "Effect": "Allow",
         "Action": "s3:GetObject",
         "Resource": [
            "arn:aws:s3:::{qualifier}-cdk-bucket",
            "arn:aws:s3:::{qualifier}-cdk-bucket/*"
         ]
      },
      {
         "Sid": "AGWPermissions",
         "Effect": "Allow",
         "Action": [
            "apigateway:POST",
            "apigateway:DELETE",
            "apigateway:GET",
            "apigateway:PATCH",
            "apigateway:PUT"
         ],
         "Resource": [
            "arn:aws:apigateway:{aws-region}::/restapis",
            "arn:aws:apigateway:{aws-region}::/restapis/*",
            "arn:aws:apigateway:{aws-region}::/account"
         ]
      },
      {
         "Sid": "SNSPermissions",
         "Effect": "Allow",
         "Action": [
            "SNS:CreateTopic",
            "SNS:DeleteTopic",
            "SNS:Subscribe",
            "SNS:GetTopicAttributes",
            "SNS:ListSubscriptionsByTopic",
            "SNS:Unsubscribe",
            "SNS:TagResource",
            "SNS:UntagResource"
         ],
         "Resource": [
            "arn:aws:sns:{aws-region}:{aws-account-number}:spring-native-aws-lambda-function-dead-letter-topic"
         ]
      },
      {
         "Sid": "LambdaPermissions",
         "Effect": "Allow",
         "Action": [
            "lambda:GetFunction",
            "lambda:ListFunctions",
            "lambda:DeleteFunction",
            "lambda:CreateFunction",
            "lambda:TagResource",
            "lambda:AddPermission",
            "lambda:RemovePermission",
            "lambda:PutFunctionEventInvokeConfig",
            "lambda:DeleteFunctionEventInvokeConfig",
            "lambda:UpdateFunctionEventInvokeConfig",
            "lambda:UpdateFunctionCode",
            "lambda:ListTags",
            "lambda:UpdateFunctionConfiguration"
         ],
         "Resource": [
            "arn:aws:lambda:{aws-region}:{aws-account-number}:function:spring-native-aws-lambda-function",
            "arn:aws:lambda:{aws-region}:{aws-account-number}:function:spring-native-aws-lambda-function:$LATEST"
         ]
      },
      {
         "Sid": "SSMPermissions",
         "Effect": "Allow",
         "Action": [
            "ssm:GetParameters"
         ],
         "Resource": [
            "arn:aws:ssm:{aws-region}:{aws-account-number}:parameter/cdk-bootstrap/{qualifier}/version"
         ]
      },
      {
         "Sid": "IAMPermissions",
         "Effect": "Allow",
         "Action": [
            "iam:PassRole",
            "iam:GetRole",
            "iam:GetRolePolicy",
            "iam:CreateRole",
            "iam:PutRolePolicy",
            "iam:DeleteRole",
            "iam:DeleteRolePolicy",
            "iam:AttachRolePolicy",
            "iam:DetachRolePolicy"
         ],
         "Resource": [
            "arn:aws:iam::{aws-account-number}:role/spring-native-aws-lambda-springnativeawslambdafun-*",
            "arn:aws:iam::{aws-account-number}:role/spring-native-aws-lambda-springnativeawslambdares-4FVJBBHF9EL2",
            "arn:aws:iam::{aws-account-number}:role/spring-native-aws-lambda-function-rest-api/CloudWatchRole"
         ]
      },
      {
         "Sid": "CFNPermissions",
         "Effect": "Allow",
         "Action": "cloudformation:DescribeStacks",
         "Resource": "arn:aws:cloudformation:{aws-region}:{aws-account-number}:stack/{qualifier}-example-function-dev-stack/*"
      }
   ]
}
  1. Run the following command to bootstrap the CDK
cdk bootstrap aws://{aws-account-number}/{aws-region} --profile cdk \
  --role-arn arn:aws:iam::{aws-account-number}:role/CDKBootstrapForCoffeebeansCore \
  --cloudformation-execution-policies "arn:aws:iam::{aws-account-number}:policy/CoffeebeansCoreCdkExecutionAccess" \
  --toolkit-stack-name cdk-{qualifier}-toolkit \
  --toolkit-bucket-name {qualifier}-cdk-bucket \
  --qualifier {qualifier} \
  --tags COST_CENTRE=coffeebeans-core

NOTE: notice that the policy passed to --cloudformation-execution-policies option is the one we created in step 4

Building AWS Lambda Function from Zip

Now that the setup is done you can deploy to AWS.

  1. Create a new release in Github releases page, the github action will start and a deployment to AWS environment.
  2. Test via curl
    $ curl --location --request POST 'https://{api-id}.execute-api.ap-southeast-2.amazonaws.com/dev/name' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "name": "CoffeeBeans"
      }'
  3. Et voila! It runs with 500 ms for cold start.

spring-native-aws-lambda's People

Contributors

andrew2184 avatar dependabot[bot] avatar muhamadto avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

spring-native-aws-lambda's Issues

curl: (7) Failed to connect to localhost port 8080

Hello,when everything is ok,Aws lambda is ok too,Just about the local have problems
i have got the target/spring-native-aws-lambda,I also can start it ,but Crul not work
what shoud i do?

curl: (7) Failed to connect to localhost port 8080: Connection refused

andre@Ubuntu20-vm:~/Documents/spring-native-aws-lambda-java11$   target/spring-native-aws-lambda
2022-06-24 12:22:45.161  INFO 4041 --- [           main] o.s.nativex.NativeListener               : This application is bootstrapped with code generated with Spring AOT
2022-06-24 12:22:45.169  INFO 4041 --- [           main] c.c.s.SpringNativeAwsLambdaApplication   : Starting SpringNativeAwsLambdaApplication v0.0.1-SNAPSHOT using Java 11.0.15 on Ubuntu20-vm with PID 4041 (/home/andre/Documents/spring-native-aws-lambda-java11/target/spring-native-aws-lambda started by andre in /home/andre/Documents/spring-native-aws-lambda-java11)
2022-06-24 12:22:45.169  INFO 4041 --- [           main] c.c.s.SpringNativeAwsLambdaApplication   : No active profile set, falling back to default profiles: default
2022-06-24 12:22:45.188  INFO 4041 --- [           main] c.c.s.SpringNativeAwsLambdaApplication   : Started SpringNativeAwsLambdaApplication in 0.094 seconds (JVM running for 0.19)
andre@Ubuntu20-vm:~/Documents/spring-native-aws-lambda-java11$     curl --location --request POST 'http://localhost:8080/exampleFunction' \
>    --header 'Content-Type: application/json' \
>    --data-raw '{
>         "name": "CoffeeBeans"
>       }'
curl: (7) Failed to connect to localhost port 8080: Connection refused
andre@Ubuntu20-vm:~/Documents/spring-native-aws-lambda-java11$ sudo lsof -i:8080
[sudo] password for andre:
andre@Ubuntu20-vm:~/Documents/spring-native-aws-lambda-java11$ sudo lsof -i:8080

AWS Lambda invokes handler multiple times but finally failed with timeout.

Thanks for your previous jobs,
I have a problem with your sample.
Lambda handler is working fine but it does not exit normally.

Test
{ "key1": "value1", "key2": "value2", "key3": "value3" }

Logs
021-12-08 04:13:59.436 INFO 10 --- [ctor-http-nio-2] reactor.Mono.Peek.193 : onSubscribe(FluxPeek.PeekSubscriber) 2021-12-08 04:13:59.436 INFO 10 --- [ctor-http-nio-2] reactor.Mono.Peek.193 : request(32) 2021-12-08 04:13:59.436 INFO 10 --- [ctor-http-nio-2] reactor.Mono.Peek.193 : onNext(org.springframework.web.reactive.function.client.DefaultClientResponse@47663eee) 2021-12-08 04:13:59.436 INFO 10 --- [ctor-http-nio-2] reactor.Mono.Peek.193 : onComplete() 2021-12-08 04:13:59.436 INFO 10 --- [ctor-http-nio-2] reactor.Flux.MonoRepeatPredicate.1 : request(1) 2021-12-08 04:13:59.436 INFO 10 --- [ctor-http-nio-2] reactor.Flux.MonoRepeatPredicate.1 : onNext(GenericMessage [payload={"key1":"value1","key2":"value2","key3":"value3"}, headers={date=Wed, 08 Dec 2021 04:13:59 GMT, scf-sink-url=http://127.0.0.1:9001/2018-06-01/runtime/invocation/{{destination}}/response, scf-func-name=origin|exampleFunction, lambda-runtime-trace-id=Root=1-61b03103-70ef46b85a876a6677c31f90;Parent=57d75afa76c58dd5;Sampled=0, lambda-runtime-aws-request-id=215de680-9a67-4b55-8a27-30e6c3c8ae51, id=36f56cad-5f36-caf5-8e5b-3d3c4623577d, lambda-runtime-invoked-function-arn=arn:aws:lambda:ap-northeast-2:946105272283:function:graalVM, lambda-runtime-deadline-ms=1638936839450, timestamp=1638936839436}]) 2021-12-08 04:13:59.436 INFO 10 --- [ctor-http-nio-2] c.c.s.functions.ExampleFunction : Converting request into a response... 2021-12-08 04:13:59.436 INFO 10 --- [ctor-http-nio-2] c.c.s.functions.ExampleFunction : Converted request into a response. 2021-12-08 04:13:59.436 INFO 10 --- [ctor-http-nio-2] o.s.c.f.web.source.SupplierExporter : Posting to: origin 2021-12-08 04:13:59.436 INFO 10 --- [ctor-http-nio-2] reactor.Mono.Peek.194 : onSubscribe(FluxPeek.PeekSubscriber) 2021-12-08 04:13:59.436 INFO 10 --- [ctor-http-nio-2] reactor.Mono.Peek.194 : request(32) 2021-12-08 04:13:59.437 INFO 10 --- [ctor-http-nio-2] reactor.Mono.Peek.194 : onNext(org.springframework.web.reactive.function.client.DefaultClientResponse@27d87851) 2021-12-08 04:13:59.437 INFO 10 --- [ctor-http-nio-2] reactor.Mono.Peek.194 : onComplete() 2021-12-08 04:13:59.437 INFO 10 --- [ctor-http-nio-2] reactor.Flux.MonoRepeatPredicate.1 : request(1) 2021-12-08 04:13:59.437 INFO 10 --- [ctor-http-nio-2] reactor.Flux.MonoRepeatPredicate.1 : onNext(GenericMessage [payload={"key1":"value1","key2":"value2","key3":"value3"}, headers={date=Wed, 08 Dec 2021 04:13:59 GMT, scf-sink-url=http://127.0.0.1:9001/2018-06-01/runtime/invocation/{{destination}}/response, scf-func-name=origin|exampleFunction, lambda-runtime-trace-id=Root=1-61b03103-70ef46b85a876a6677c31f90;Parent=57d75afa76c58dd5;Sampled=0, lambda-runtime-aws-request-id=215de680-9a67-4b55-8a27-30e6c3c8ae51, id=db95584c-1387-b344-4506-6777072bb21a, lambda-runtime-invoked-function-arn=arn:aws:lambda:ap-northeast-2:946105272283:function:graalVM, lambda-runtime-deadline-ms=1638936839450, timestamp=1638936839437}]) 2021-12-08 04:13:59.437 INFO 10 --- [ctor-http-nio-2] c.c.s.functions.ExampleFunction : Converting request into a response... 2021-12-08 04:13:59.437 INFO 10 --- [ctor-http-nio-2] c.c.s.functions.ExampleFunction : Converted request into a response. 2021-12-08 04:13:59.437 INFO 10 --- [ctor-http-nio-2] o.s.c.f.web.source.SupplierExporter : Posting to: origin 2021-12-08 04:13:59.437 INFO 10 --- [ctor-http-nio-2] reactor.Mono.Peek.195 : onSubscribe(FluxPeek.PeekSubscriber) 2021-12-08 04:13:59.437 INFO 10 --- [ctor-http-nio-2] reactor.Mono.Peek.195 : request(32) END RequestId: 215de680-9a67-4b55-8a27-30e6c3c8ae51 REPORT RequestId: 215de680-9a67-4b55-8a27-30e6c3c8ae51 Duration: 3003.65 ms Billed Duration: 3580 ms Memory Size: 128 MB Max Memory Used: 125 MB Init Duration: 576.35 ms 2021-12-08T04:13:59.453Z 215de680-9a67-4b55-8a27-30e6c3c8ae51 Task timed out after 3.00 seconds

how to access dynamoDB

I try to access DynamoDB with Lambda ,but it failed

Caused by: com.amazonaws.SdkClientException: Unable to load partition metadata from com/amazonaws/partitions/endpoints.json

Error msg

2022-07-05 09:09:00.674 ERROR 9 --- [           main] o.s.boot.SpringApplication               : Application run failed
--
java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:794) ~[spring-native-aws-lambda:2.5.6]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:775) ~[spring-native-aws-lambda:2.5.6]

START RequestId: 58238b51-f2e4-4983-9955-895255220bed Version: $LATEST
--
2022-07-05 10:57:12.784  INFO 9 --- [           main] o.s.nativex.NativeListener               : This application is bootstrapped with code generated with Spring AOT
2022-07-05 10:57:12.804  INFO 9 --- [           main] o.s.c.f.a.aws.CustomRuntimeInitializer   : AWS Handler: exampleFunction
2022-07-05 10:57:12.810  INFO 9 --- [           main] c.c.s.SpringNativeAwsLambdaApplication   : Starting SpringNativeAwsLambdaApplication v0.0.1-SNAPSHOT using Java 11.0.11 on 169.254.206.69 with PID 9 (/var/task/spring-native-aws-lambda started by sbx_user1051 in /var/task)
2022-07-05 10:57:12.810  INFO 9 --- [           main] c.c.s.SpringNativeAwsLambdaApplication   : No active profile set, falling back to default profiles: default
2022-07-05 10:57:12.842  INFO 9 --- [           main] c.c.s.SpringNativeAwsLambdaApplication   : Started SpringNativeAwsLambdaApplication in 0.18 seconds (JVM running for 0.368)
2022-07-05 10:57:12.843  INFO 9 --- [           main] o.s.c.f.a.aws.CustomRuntimeEventLoop     : Starting spring-cloud-function CustomRuntimeEventLoop
2022-07-05 10:57:12.853  INFO 9 --- [           main] o.s.c.f.a.aws.CustomRuntimeEventLoop     : Entering event loop
2022-07-05 10:57:12.857  INFO 9 --- [           main] o.s.c.f.c.c.SimpleFunctionRegistry       : Located function: exampleFunction<class com.coffeebeans.springnativeawslambda.model.Request, class com.coffeebeans.springnativeawslambda.model.Response>
2022-07-05 10:57:12.858  INFO 9 --- [           main] o.s.c.f.a.aws.CustomRuntimeEventLoop     : Located function exampleFunction
2022-07-05 10:57:13.003  INFO 9 --- [           main] o.s.c.f.adapter.aws.AWSLambdaUtils       : Incoming JSON Event: {}
2022-07-05 10:57:13.142  INFO 9 --- [           main] o.s.c.f.adapter.aws.AWSLambdaUtils       : Incoming MAP: {}
2022-07-05 10:57:13.142  INFO 9 --- [           main] o.s.c.f.adapter.aws.AWSLambdaUtils       : Incoming request headers: {date=Tue, 05 Jul 2022 10:57:12 GMT, content-length=2, lambda-runtime-trace-id=Root=1-62c41907-49107e283c55fe060a1a7d1b;Parent=1185ecc24f956e19;Sampled=0, lambda-runtime-aws-request-id=58238b51-f2e4-4983-9955-895255220bed, id=9bbe0f33-253b-f795-dbd5-b6eb2b36753e, contentType=application/json, lambda-runtime-invoked-function-arn=arn:aws:lambda:ap-northeast-1:536824749084:function:PacFirstVersion, lambda-runtime-deadline-ms=1657018692857, timestamp=1657018633003}
2022-07-05 10:57:13.222  INFO 9 --- [           main] c.c.s.functions.ExampleFunction          : Converting request into a response...1
2022-07-05 10:57:13.284 ERROR 9 --- [           main] o.s.boot.SpringApplication               : Application run failed
java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:794) ~[spring-native-aws-lambda:2.5.6]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:775) ~[spring-native-aws-lambda:2.5.6]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:345) ~[spring-native-aws-lambda:2.5.6]
at org.springframework.cloud.function.context.FunctionalSpringApplication.run(FunctionalSpringApplication.java:88) ~[na:na]
at org.springframework.cloud.function.context.FunctionalSpringApplication.run(FunctionalSpringApplication.java:83) ~[na:na]
at com.coffeebeans.springnativeawslambda.SpringNativeAwsLambdaApplication.main(SpringNativeAwsLambdaApplication.java:18) ~[spring-native-aws-lambda:0.0.1-SNAPSHOT]
Caused by: com.amazonaws.AmazonClientException: Unable to load parition metadata from com/amazonaws/partitions/endpoints.json
at com.amazonaws.partitions.PartitionsLoader.build(PartitionsLoader.java:82) ~[na:na]
at com.amazonaws.regions.RegionMetadataFactory.create(RegionMetadataFactory.java:30) ~[na:na]
at com.amazonaws.regions.RegionUtils.initialize(RegionUtils.java:66) ~[na:na]
at com.amazonaws.regions.RegionUtils.getRegionMetadata(RegionUtils.java:54) ~[na:na]
at com.amazonaws.regions.RegionUtils.getRegion(RegionUtils.java:107) ~[na:na]
at com.amazonaws.client.builder.AwsClientBuilder.withRegion(AwsClientBuilder.java:233) ~[na:na]
at com.amazonaws.client.builder.AwsClientBuilder.withRegion(AwsClientBuilder.java:222) ~[na:na]
at com.coffeebeans.springnativeawslambda.functions.ExampleFunction.apply(ExampleFunction.java:30) ~[na:na]
at com.coffeebeans.springnativeawslambda.functions.ExampleFunction.apply(ExampleFunction.java:21) ~[na:na]
at org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry$FunctionInvocationWrapper.invokeFunctionAndEnrichResultIfNecessary(SimpleFunctionRegistry.java:842) ~[na:na]
at org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry$FunctionInvocationWrapper.invokeFunction(SimpleFunctionRegistry.java:798) ~[na:na]
at org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry$FunctionInvocationWrapper.doApply(SimpleFunctionRegistry.java:663) ~[na:na]
at org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry$FunctionInvocationWrapper.apply(SimpleFunctionRegistry.java:506) ~[na:na]
at org.springframework.cloud.function.adapter.aws.CustomRuntimeEventLoop.eventLoop(CustomRuntimeEventLoop.java:99) ~[spring-native-aws-lambda:3.1.4]
at org.springframework.cloud.function.adapter.aws.CustomRuntimeInitializer.lambda$null$0(CustomRuntimeInitializer.java:47) ~[na:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:791) ~[spring-native-aws-lambda:2.5.6]
... 5 common frames omitted
END RequestId: 58238b51-f2e4-4983-9955-895255220bed
REPORT RequestId: 58238b51-f2e4-4983-9955-895255220bed	Duration: 505.18 ms	Billed Duration: 1003 ms	Memory Size: 128 MB	Max Memory Used: 113 MB	Init Duration: 497.74 ms
RequestId: 58238b51-f2e4-4983-9955-895255220bed Error: Runtime exited with error: exit status 1Runtime.ExitError
2022-07-05 10:57:14.040  INFO 9 --- [           main] o.s.nativex.NativeListener               : This application is bootstrapped with code generated with Spring AOT
2022-07-05 10:57:14.155  INFO 9 --- [           main] o.s.c.f.a.aws.CustomRuntimeInitializer   : AWS Handler: exampleFunction
2022-07-05 10:57:14.161  INFO 9 --- [           main] c.c.s.SpringNativeAwsLambdaApplication   : Starting SpringNativeAwsLambdaApplication v0.0.1-SNAPSHOT using Java 11.0.11 on 169.254.206.69 with PID 9 (/var/task/spring-native-aws-lambda started by sbx_user1051 in /var/task)
2022-07-05 10:57:14.161  INFO 9 --- [           main] c.c.s.SpringNativeAwsLambdaApplication   : No active profile set, falling back to default profiles: default
2022-07-05 10:57:14.289  INFO 9 --- [           main] c.c.s.SpringNativeAwsLambdaApplication   : Started SpringNativeAwsLambdaApplication in 0.561 seconds (JVM running for 0.731)
2022-07-05 10:57:14.390  INFO 9 --- [           main] o.s.c.f.a.aws.CustomRuntimeEventLoop     : Starting spring-cloud-function CustomRuntimeEventLoop
2022-07-05 10:57:14.400  INFO 9 --- [           main] o.s.c.f.a.aws.CustomRuntimeEventLoop     : Entering event loop

my source

public class ExampleFunction implements Function<Request, Response> {
  private static AmazonDynamoDB amazonDynamoDBClient = null;
  private static Table table = null;
  @Override
  public Response apply(final Request request) {
    log.info("Converting request into a response...");
    //mysource
    amazonDynamoDBClient = AmazonDynamoDBClientBuilder.standard().withCredentials(new DefaultAWSCredentialsProviderChain()).withRegion(Regions.AP_NORTHEAST_1).build();
    table = new DynamoDB(amazonDynamoDBClient).getTable(DynamoConstants.TABLE_NAME);
......

mvn dependency

    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk-dynamodb</artifactId>
      <version>1.11.46</version>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>amazon-kinesis-client</artifactId>
      <version>1.2.1</version>
      <scope>compile</scope>
    </dependency>

Create deployment pipeline

Is your feature request related to a problem? Please describe.
To automate the deployment into AWS

Describe the solution you'd like
create a cdk module and github action to deploy to AWS

Describe alternatives you've considered
CDK โ€” good since it will be also in java

Additional context
None

Create a branch for java17

Is your feature request related to a problem? Please describe.
Create a branch for spring native with java17

Describe the solution you'd like

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Add Spring 3 support

Is your feature request related to a problem? Please describe.
No Problem, just enhancement and continued maintenance.

Describe the solution you'd like
Spring 3 added major upgrades for Spring Native. It would make the config considerably smaller to adopt Spring 3.

Describe alternatives you've considered
None

Additional context
None

docker build Error

When i Do the

docker build --no-cache \
--tag spring-native-aws-lambda:0.0.1-SNAPSHOT \
--file Dockerfile .

I get Error,i want solve it .how to do .

Error: Image build request failed with exit status 137
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 25:07 min
[INFO] Finished at: 2022-06-23T04:57:58Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.graalvm.nativeimage:native-image-maven-plugin:21.2.0:native-image (default) on project spring-native-aws-lambda: Execution of /app/graalvm-ce-java11-21.1.0/lib/svm/bin/native-image -cp /root/.m2/repository/org/springframework/experimental/spring-native/0.10.5/spring-native-0.10.5.jar:/root/.m2/repository/org/springframework/boot/spring-boot-starter-webflux/2.5.6/spring-boot-starter-webflux-2.5.6.jar:/root/.m2/repository/org/springframework/boot/spring-boot-starter/2.5.6/spring-boot-starter-2.5.6.jar:/root/.m2/repository/org/springframework/boot/spring-boot/2.5.6/spring-boot-2.5.6.jar:/root/.m2/repository/org/springframework/spring-context/5.3.12/spring-context-5.3.12.jar:/root/.m2/repository/org/springframework/spring-aop/5.3.12/spring-aop-5.3.12.jar:/root/.m2/repository/org/springframework/spring-expression/5.3.12/spring-expression-5.3.12.jar:/root/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.5.6/spring-boot-autoconfigure-2.5.6.jar:/root/.m2/repository/org/springframework/boot/spring-boot-starter-logging/2.5.6/spring-boot-starter-logging-2.5.6.jar:/root/.m2/repository/ch/qos/logback/logback-classic/1.2.6/logback-classic-1.2.6.jar:/root/.m2/repository/ch/qos/logback/logback-core/1.2.6/logback-core-1.2.6.jar:/root/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.14.1/log4j-to-slf4j-2.14.1.jar:/root/.m2/repository/org/apache/logging/log4j/log4j-api/2.14.1/log4j-api-2.14.1.jar:/root/.m2/repository/org/slf4j/jul-to-slf4j/1.7.32/jul-to-slf4j-1.7.32.jar:/root/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar:/root/.m2/repository/org/yaml/snakeyaml/1.28/snakeyaml-1.28.jar:/root/.m2/repository/org/springframework/boot/spring-boot-starter-json/2.5.6/spring-boot-starter-json-2.5.6.jar:/root/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.12.5/jackson-databind-2.12.5.jar:/root/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.12.5/jackson-datatype-jdk8-2.12.5.jar:/root/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.12.5/jackson-datatype-jsr310-2.12.5.jar:/root/.m2/repository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.12.5/jackson-module-parameter-names-2.12.5.jar:/root/.m2/repository/org/springframework/boot/spring-boot-starter-reactor-netty/2.5.6/spring-boot-starter-reactor-netty-2.5.6.jar:/root/.m2/repository/io/projectreactor/netty/reactor-netty-http/1.0.12/reactor-netty-http-1.0.12.jar:/root/.m2/repository/io/netty/netty-codec-http/4.1.69.Final/netty-codec-http-4.1.69.Final.jar:/root/.m2/repository/io/netty/netty-common/4.1.69.Final/netty-common-4.1.69.Final.jar:/root/.m2/repository/io/netty/netty-buffer/4.1.69.Final/netty-buffer-4.1.69.Final.jar:/root/.m2/repository/io/netty/netty-transport/4.1.69.Final/netty-transport-4.1.69.Final.jar:/root/.m2/repository/io/netty/netty-codec/4.1.69.Final/netty-codec-4.1.69.Final.jar:/root/.m2/repository/io/netty/netty-handler/4.1.69.Final/netty-handler-4.1.69.Final.jar:/root/.m2/repository/io/netty/netty-codec-http2/4.1.69.Final/netty-codec-http2-4.1.69.Final.jar:/root/.m2/repository/io/netty/netty-resolver-dns/4.1.69.Final/netty-resolver-dns-4.1.69.Final.jar:/root/.m2/repository/io/netty/netty-resolver/4.1.69.Final/netty-resolver-4.1.69.Final.jar:/root/.m2/repository/io/netty/netty-codec-dns/4.1.69.Final/netty-codec-dns-4.1.69.Final.jar:/root/.m2/repository/io/netty/netty-resolver-dns-native-macos/4.1.69.Final/netty-resolver-dns-native-macos-4.1.69.Final-osx-x86_64.jar:/root/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.69.Final/netty-transport-native-unix-common-4.1.69.Final.jar:/root/.m2/repository/io/netty/netty-transport-native-epoll/4.1.69.Final/netty-transport-native-epoll-4.1.69.Final-linux-x86_64.jar:/root/.m2/repository/io/projectreactor/netty/reactor-netty-core/1.0.12/reactor-netty-core-1.0.12.jar:/root/.m2/repository/io/netty/netty-handler-proxy/4.1.69.Final/netty-handler-proxy-4.1.69.Final.jar:/root/.m2/repository/io/netty/netty-codec-socks/4.1.69.Final/netty-codec-socks-4.1.69.Final.jar:/root/.m2/repository/org/springframework/spring-web/5.3.12/spring-web-5.3.12.jar:/root/.m2/repository/org/springframework/spring-beans/5.3.12/spring-beans-5.3.12.jar:/root/.m2/repository/org/springframework/spring-webflux/5.3.12/spring-webflux-5.3.12.jar:/root/.m2/repository/io/projectreactor/reactor-core/3.4.11/reactor-core-3.4.11.jar:/root/.m2/repository/org/springframework/cloud/spring-cloud-function-web/3.1.4/spring-cloud-function-web-3.1.4.jar:/root/.m2/repository/org/springframework/cloud/spring-cloud-function-context/3.1.4/spring-cloud-function-context-3.1.4.jar:/root/.m2/repository/net/jodah/typetools/0.6.2/typetools-0.6.2.jar:/root/.m2/repository/org/springframework/cloud/spring-cloud-function-core/3.1.4/spring-cloud-function-core-3.1.4.jar:/root/.m2/repository/org/springframework/spring-messaging/5.3.12/spring-messaging-5.3.12.jar:/root/.m2/repository/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar:/root/.m2/repository/org/springframework/cloud/spring-cloud-function-adapter-aws/3.1.4/spring-cloud-function-adapter-aws-3.1.4.jar:/root/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-joda/2.12.5/jackson-datatype-joda-2.12.5.jar:/root/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.12.5/jackson-annotations-2.12.5.jar:/root/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.12.5/jackson-core-2.12.5.jar:/root/.m2/repository/org/springframework/boot/spring-boot-starter-validation/2.5.6/spring-boot-starter-validation-2.5.6.jar:/root/.m2/repository/org/apache/tomcat/embed/tomcat-embed-el/9.0.54/tomcat-embed-el-9.0.54.jar:/root/.m2/repository/org/hibernate/validator/hibernate-validator/6.2.0.Final/hibernate-validator-6.2.0.Final.jar:/root/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar:/root/.m2/repository/org/jboss/logging/jboss-logging/3.4.2.Final/jboss-logging-3.4.2.Final.jar:/root/.m2/repository/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar:/root/.m2/repository/com/amazonaws/aws-lambda-java-events/3.10.0/aws-lambda-java-events-3.10.0.jar:/root/.m2/repository/joda-time/joda-time/2.6/joda-time-2.6.jar:/root/.m2/repository/org/reactivestreams/reactive-streams/1.0.0/reactive-streams-1.0.0.jar:/root/.m2/repository/org/projectlombok/lombok/1.18.20/lombok-1.18.20.jar:/root/.m2/repository/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar:/root/.m2/repository/org/springframework/spring-core/5.3.12/spring-core-5.3.12.jar:/root/.m2/repository/org/springframework/spring-jcl/5.3.12/spring-jcl-5.3.12.jar:/app/target/spring-native-aws-lambda-0.0.1-SNAPSHOT.jar --enable-url-protocols=http -H:+AddAllCharsets -H:Name=spring-native-aws-lambda returned non-zero result -> [Help 1]

create a leightweight even "spring boot less" deployment

Using API Gateway + AWS Lambda + Spring Boot is duplicating responsibilities. In the world before Serverless you would have used Spring Boot alone to handle HTTP requests and implement your business logic. Now the combination of API Gateway and AWS Lambda is replacing it. Even more than that, it enables you to have better scalability because of this separation of concerns from an operational aspect. This means you can put a big question mark on the idea of running Spring Boot inside AWS Lambda.
Also spring boot add a lot more byte sinto your package and later the image. So why use spring boot at all? It shall be possible to run the function without any http context by using aws native message communication
Deploymh behind a api AWS API Gateway or even AWS Kinesis Stream shall allow us finally to get rid of as much as dependencies as possibe.

https://docs.spring.io/spring-cloud-function/docs/current/reference/html/aws.html#_custom_runtime
https://github.com/spring-cloud/spring-cloud-function/blob/main/spring-cloud-function-samples/function-sample-aws-custom-bean/pom.xml

Investigate the usage of buildpack

Is your feature request related to a problem? Please describe.
No problem

Describe the solution you'd like
A clear and concise description of what you want to happen.
Currently this project uses dockerfile for building and extracting the jar to be deployed.
AWS allows creating lambda from a docker image. Spring native allows devs to build an docker image via buildpack but the images are not based on amazon linux 2โ€” which is required for AWS lambda env.

Check if there is away to make buildpack create an image based on amazon linux 2 then create an image and deploy it to aws lambda.

Add JSON logging

Is your feature request related to a problem? Please describe.
Logging to help operations find and fix problems

Describe the solution you'd like
Add JSON logging with the following fields

  1. function name
  2. class/logger name
  3. level
  4. message

Describe alternatives you've considered
Either use log4j2 json layout or create custom one

Additional context
None

Dependency updates / Question regarding spring cloud version

Hi,

first of all a big thank you. Your example is the only one working out of the box. After a first deployment of the original version I tried to update some of the dependencies (sb,spring-native,spring cloud). Everything seems to work unless I update spring cloud. The task just times out and it looks like it loops endless.

Do you know by any chance what might be the reason for this? I tried 2020.0.3 and 2020.0.4 with the same result.

Thank you very much ๐Ÿ‘

./mvnw -ntp clean package -Pnative-image

when i do the ./mvnw -ntp clean package -Pnative-image
i get Error,How should i do

andre@Ubuntu20-vm:~/Documents/spring-native-aws-lambda-java11$ ./mvnw -ntp clean package -Pnative-image target/spring-native-aws-lambda
[INFO] Scanning for projects...
[INFO]
[INFO] --------------< com.coffeebeans:spring-native-aws-lambda >--------------
[INFO] Building spring-native-aws-lambda 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.330 s
[INFO] Finished at: 2022-06-23T14:19:24+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Unknown lifecycle phase "target/spring-native-aws-lambda". You must specify a valid lifecycle phase or a goal in the format : or :[:]:. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/LifecyclePhaseNotFoundException

Request to add cloud formation template .

i have been trying the same steps. The lambda is also successfully created, but while testing the actual functions doesnt get invoked.

2022-01-05 17:26:11.442 INFO 9 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2022-01-05 17:26:11.443 INFO 9 --- [ main] com.graalvm.demo.DemoApplication : Started DemoApplication in 0.777 seconds (JVM running for 1.062) END RequestId: ee0b78ff-4521-4644-9feb-d8ef43434791 REPORT RequestId: ee0b78ff-4521-4644-9feb-d8ef43434791 Duration: 10010.46 ms Billed Duration: 10000 ms Memory Size: 512 MB Max Memory Used: 89 MB 2022-01-05T17:26:20.149Z ee0b78ff-4521-4644-9feb-d8ef43434791 Task timed out after 10.01 seconds

can you share the CFT or serverless template to test the lambda with an API GW Trigger.

Investigate logging with Powertools

Is your feature request related to a problem? Please describe.
AWS has Powertools for observability, its logging lib is currently blocked for Spring Native as it uses Log4J2 which is not playing nice with GraalVM. More can be found in this issue

Additional context

  • Reverse this PR #51

Consideration

  • Logback seems to be faster than Log4j2 due to static initialization in Log4j2. Make sure to compare start-up time.

how can i access with String[]

I try to Make a call by follow parameter
and i also changed my source to String[ ]

but faild.what shoud i do

parameter:

{
  "name": "CoffeeBeans",
  "aaaList": [
    "A234567890ABC",
    "B234567890ABC",
    "C234567890ABC",
    "D234567890ABC",
    "E234567890ABC"
  ]
}

src

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Request implements Serializable {

  @NotBlank
  private String name;

  @NotBlank
  private String[] aaaList;
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.