GitHub - mjm461/serverless-dynamodb-java

Sample Project for AWS Lambda with DynamoDB

Development

Prerequisites

Jars that are built

game-core: Includes only the Spring endpoints and the DynamodBD storage game-boot: Runs the project in Spring Boot game-lambda: Builds the jar that is deployable to AWS Lambda (SAM Local in this case)

Build

For deployment we follow the SAM documentation

To build the project use gradlew

Start an instance of DynamoDB Local

java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb

Test with Spring Boot

Run with SAM local and environment variables

sam local start-api -n env.json

Curl examples

$ curl localhost:3000/game?create=true
[]

$ curl localhost:3000/game -X POST  -H "Content-Type: application/json" -d '{"playerId": "mark", "opponentId": "dave", "winnerId": "mark"}' | python -m json.tool0 
{
    "gameModelId": {
        "playerId": "mark",
        "createdTime": "2018-02-22T16:42:33.966Z"
    },
    "opponentId": "dave",
    "winnerId": "mark",
    "notes": null,
    "createdTime": "2018-02-22T16:42:33.966Z",
    "playerId": "mark"
}

$ curl localhost:3000/game -X POST  -H "Content-Type: application/json" -d '{"playerId": "mark", "opponentId": "dave", "winnerId": "dave"}' | python -m json.tool
{
    "gameModelId": {
        "playerId": "mark",
        "createdTime": "2018-02-22T16:42:48.781Z"
    },
    "opponentId": "dave",
    "winnerId": "dave",
    "notes": null,
    "createdTime": "2018-02-22T16:42:48.781Z",
    "playerId": "mark"
}

$ curl localhost:3000/game -X POST  -H "Content-Type: application/json" -d '{"playerId": "mark", "opponentId": "bob", "winnerId": "mark"}' | python -m json.tool
{
    "gameModelId": {
        "playerId": "mark",
        "createdTime": "2018-02-22T16:43:06.422Z"
    },
    "opponentId": "bob",
    "winnerId": "mark",
    "notes": null,
    "createdTime": "2018-02-22T16:43:06.422Z",
    "playerId": "mark"
}

$ curl localhost:3000/game/mark?opponentId=dave | python -m json.tool
[
    {
        "gameModelId": {
            "playerId": "mark",
            "createdTime": "2018-02-22T16:42:48.781Z"
        },
        "opponentId": "dave",
        "winnerId": "dave",
        "notes": null,
        "createdTime": "2018-02-22T16:42:48.781Z",
        "playerId": "mark"
    },
    {
        "gameModelId": {
            "playerId": "mark",
            "createdTime": "2018-02-22T16:42:33.966Z"
        },
        "opponentId": "dave",
        "winnerId": "mark",
        "notes": null,
        "createdTime": "2018-02-22T16:42:33.966Z",
        "playerId": "mark"
    }
]

$ curl http://localhost:3000/game/mark?winner=true | python -m json.tool
[
    {
        "gameModelId": {
            "playerId": "mark",
            "createdTime": "2018-02-22T16:42:33.966Z"
        },
        "opponentId": "dave",
        "winnerId": "mark",
        "notes": null,
        "createdTime": "2018-02-22T16:42:33.966Z",
        "playerId": "mark"
    },
    {
        "gameModelId": {
            "playerId": "mark",
            "createdTime": "2018-02-22T16:43:06.422Z"
        },
        "opponentId": "bob",
        "winnerId": "mark",
        "notes": null,
        "createdTime": "2018-02-22T16:43:06.422Z",
        "playerId": "mark"
    }
]

Remote debbugging SAM Local

  • Start SAM Local with a debug port
sam local start-api -n -d 5005 env.json
  • Connect to port 5005 with your remote debugger