javaamazon-web-servicesaws-lambdalocalstack

How to local test a java AWS lambda function using LocalStack


I was following the article baeldung site

I did the step

docker run \
    --rm -it \
    -p 127.0.0.1:4566:4566 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v ./target:/opt/code/localstack/target \
    localstack/localstack

docker shell

$ winpty docker exec -it 6efc21b9a53b bash

and trying to execute

awslocal lambda create-function \
    --function-name baeldung-lambda-function \
    --runtime java21 \
    --handler com.baeldung.lambda.LambdaHandler\
    --role arn:aws:iam::000000000000:role/lambda-role \
    --zip-file fileb:///opt/code/localstack/target/java-lambda-function-0.0.1.jar

Error:

Error parsing parameter '--zip-file': Unable to load paramfile fileb:///opt/code/localstack/target/snslambda-1.0-SNAPSHOT.jar: [Errno 2] No such file or directory: '/opt/code/localstack/target/snslamb da-1.0-SNAPSHOT.jar'

my jar file name is correct. agreed -v ./target:/opt/code/localstack/target is the volume and so used in zip-file. But how is the file mapped ? I don't see any file in localstack target folder

I am not sure on what path I have to run any commands. Please can I ask what are the check points and how to solve?

EDIT:

Test

awslocal lambda invoke --function-name sns-lambda-function --payload '{{ "Records": [ { "Sns": { "Message": "Hello from SNS!", "MessageId": "12345", "Timestamp": "2025-02-23T12:34:56.000Z" } } ] }' output.txt


Solution

  • I have solved it following these steps

    Run localstack >> open a docker shell >> create a topic >> create a lambda function that can respond to SNSEvent >> create a subscription >> and Test

    1. docker run --rm -it -p 127.0.0.1:4566:4566 -v /var/run/docker.sock:/var/run/docker.sock -v ${PWD}/target:/opt/code/localstack/target localstack/localstack

    2. docker exec -it containerid bash

    3. awslocal sns create-topic --name user-account-created

    4. awslocal lambda create-function --function-name sns-lambda-function --runtime java21 --handler com.example.SNSEventHandler --role arn:aws:iam::000000000000:role/lambda-role --zip-file fileb:///opt/code/localstack/target/java-lambda-function.jar

    5. awslocal sns subscribe --topic-arn arn:aws:sns:us-east-1:000000000000:user-account-created --protocol lambda --notification-endpoint arn:aws:lambda:us-east-1:000000000000:function:sns-lambda-function

    6. Test using below and check the logs of the lambda function container

    awslocal sns publish --topic-arn arn:aws:sns:us-east-1:000000000000:user-account-created --message "Hello from LocalStack SNS!"