MJV
MJV

Reputation: 1882

How to both run an AWS SAM template locally and deploy it to AWS successfully (with Java Lambdas)?

I'm trying to build an AWS application using SAM (Serverless Application Model) with the Lambdas written in Java.

I was able to get it running locally by using a resource definition like this in the template:

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: HelloWorldFunction
      Handler: helloworld.App::handleRequest
      Runtime: java8
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get

But to get the sam package phase to upload only the actual code (and not the whole project directory) to S3 I had to change it to this:

    ...
    Properties:
      CodeUri: HelloWorldFunction/target/HelloWorld-1.0.jar
    ...

as documented in the AWS SAM example project README.

However, this breaks the ability to run the application locally with sam build followed by sam local start-api.

I tried to get around this by giving the CodeUri value as a parameter (with --parameter-overrides) and this works locally but breaks the packaging phase because of a known issue with the SAM translator.

Is there a way to make both the local build and the real AWS deployment working, preferably with the same template file?

Upvotes: 3

Views: 1278

Answers (1)

MJV
MJV

Reputation: 1882

The only workaround I've come up myself with so far is to use different template files for local development and actual packaging and deployment.

To avoid maintaining two almost equal template files I wrote a script for running the service locally:

#!/bin/bash

echo "Copying template..."
sed 's/CodeUri: .*/CodeUri: HelloWorldFunction/' template.yaml > template-local.yaml

echo "Building..."
if sam build -t template-local.yaml
then
  echo "Serving local API..."
  sam local start-api
else
  echo "Build failed, not running service."
fi

This feels less than optimal but does the trick. Would love to hear better alternatives, still.

Another idea that came to mind was extending a mutual base template with separate CodeUri values for these cases but I don't think SAM templates support anything like that.

Upvotes: 3

Related Questions