5

Im using Serverless Framework to deploy a Docker image running R to an AWS Lambda.

service: r-lambda

provider:
  name: aws
  region: eu-west-1
  timeout: 60
  environment:
    stage: ${sls:stage}
    R_AWS_REGION: ${aws:region}
  ecr:
    images:
      r-lambda:
        path: ./

functions:
  r-lambda-hello:
    image:
      name: r-lambda
      command:
        - functions.hello

This works fine and I can log into AWS and invoke the lambda function. But I also want to invoke by doing a curl to it, so I added an "events" property to the functions section:

functions:
  r-lambda-hello:
    image:
      name: r-lambda
      command:
        - functions.hello
    events:
      - http: GET r-lambda-hello

However, when I deploy with serverless, it does not output the API endpoint. And when I go to API Gateway in AWS, I dont see any APIs here. What am I doing wrong?

EDIT

As per Rovelcio Junior's answer, I went to AWS CloudFormation > Stacks > r-lambda-dev > Resources. But there is now Api Gateway listed in the resources...

EDIT

Heres my DockerFile:

FROM public.ecr.aws/lambda/provided:al2.2021.09.13.11

ENV R_VERSION=4.0.3

RUN yum -y install wget tar openssl-devel libxml2-devel

RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
    && wget https://cdn.rstudio.com/r/centos-7/pkgs/R-${R_VERSION}-1-1.x86_64.rpm \
    && yum -y install R-${R_VERSION}-1-1.x86_64.rpm \
    && rm R-${R_VERSION}-1-1.x86_64.rpm

ENV PATH="${PATH}:/opt/R/${R_VERSION}/bin/"

RUN Rscript -e "install.packages(c('httr', 'jsonlite', 'logger', 'paws.storage', 'paws.database', 'readr', 'BiocManager'), repos = 'https://cloud.r-project.org/')"

COPY runtime.R functions.R ${LAMBDA_TASK_ROOT}/

RUN chmod 755 -R ${LAMBDA_TASK_ROOT}/

RUN printf '#!/bin/sh\ncd $LAMBDA_TASK_ROOT\nRscript runtime.R' > /var/runtime/bootstrap \
    && chmod +x /var/runtime/bootstrap

And the output when I deploy:

Serverless: Packaging service...
#1 [internal] load build definition from Dockerfile
#1 sha256:730ec5a8380df019470bdbb6091e9a29cd62f4ef4443be0c14ec2c4979da26ea
#1 transferring dockerfile: 37B 0.0s done
#1 DONE 0.0s

#2 [internal] load .dockerignore
#2 sha256:553479c1392984ccf98fd0cf873e2e2da149ff9a1bc98a0abee6b3e558545181
#2 transferring context: 2B done
#2 DONE 0.0s

#3 [internal] load metadata for public.ecr.aws/lambda/provided:al2.2021.09.13.11
#3 sha256:8c254bed2a05020fafbb65f8dbd8b7925d24019ab56ee85272c4559290756324
#3 DONE 4.7s

#4 [ 1/8] FROM public.ecr.aws/lambda/provided:al2.2021.09.13.11@sha256:9628c6a5372a04289000f7cb9cb9aeb273d7381bdbe1283a07fb86981a06ac07
#4 sha256:2082eea955a6ae3398939e60fe10c5c7b34b262c2e5b82421ece4a9127883f58
#4 DONE 0.0s

#10 [internal] load build context
#10 sha256:8b61403d9fd75cf8a55c7294afa45fe717dc75c5783b7b749c304687556372c6
#10 transferring context: 108B done
#10 DONE 0.0s

#6 [ 3/8] RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm     && wget https://cdn.rstudio.com/r/centos-7/pkgs/R-4.0.3-1-1.x86_64.rpm     && yum -y install R-4.0.3-1-1.x86_64.rpm     && rm R-4.0.3-1-1.x86_64.rpm
#6 sha256:22644d17f1156ee8911a76c1f9af4c3894f22f41e347e611f4d382da3bf54356
#6 CACHED

#11 [ 4/8] COPY runtime.R functions.R /var/task/
#11 sha256:163032f10dc70da4ceb3d6a8824b7f81def9dda7d75e745074f7fdd2c639253e
#11 CACHED

#13 [ 5/8] RUN chmod 755 -R /var/task/
#13 sha256:606c9651f2ba1aadde5e6928c1fffa5e6a397762ef1abdf14aeea2940c16cfd8
#13 CACHED

#5 [ 6/8] RUN yum -y install wget tar openssl-devel libxml2-devel
#5 sha256:a5bb99c3107595ebcce135aec74510b7d5438acc6900e4bd5db1bec97f9c61b5
#5 CACHED

#7 [ 7/8] RUN Rscript -e "install.packages(c('httr', 'jsonlite', 'logger', 'paws.storage', 'paws.database', 'readr', 'BiocManager'), repos = 'https://cloud.r-project.org/')"
#7 sha256:465b4b4ff27a57cacb401f8b0c9335fadca31fa68081cd5f56f22c9b14e9c17a
#7 CACHED

#14 [8/8] RUN printf '#!/bin/sh\ncd $LAMBDA_TASK_ROOT\nRscript runtime.R' > /var/runtime/bootstrap     && chmod +x /var/runtime/bootstrap
#14 sha256:74b7d704dc21ccab7da6fd953240a5331d75229af210def5351bd5c5bf943eed
#14 CACHED

#15 exporting to image
#15 sha256:e8c613e07b0b7ff33893b694f7759a10d42e180f2b4dc349fb57dc6b71dcab00
#15 exporting layers done
#15 writing image sha256:9fabde8e59e85c4ffe09ec70550b3baeba6dd422cd54f05e17e5fac6c9c9db32 done
#15 naming to docker.io/library/serverless-r-lambda-dev:r-lambda done
#15 DONE 0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
Serverless: Login to Docker succeeded!
0

3 Answers 3

1

The way your events.http is configured looks wrong. Try replacing it with:

- http:
      path: r-lambda-hello
      method: get     

This might be helpful as well: https://github.com/serverless/examples
I also found this blog useful: Build a serverless API with Amazon Lambda and API Gateway

Sign up to request clarification or add additional context in comments.

1 Comment

Tried that, still not seeing any API Gateway, checking under AWS CloudFormation > Stacks > r-lambda-dev > Resources
0
+500

The way your event is configured looks right. Just add a forward slash to your endpoint: GET /r-lambda-hello (to suppress the warning, isn't related to the issue at all).

I tested your serverless.yml with the hello world template (without the Docker image) and it generated the APIs accordingly on the first run, but didn't output API endpoints on subsequent builds.

Please make sure you are in the correct AWS Region eu-west-1.

Additionally, you can access AWS CloudFormation > Stacks > r-lambda-dev > Resources to locate AWS::ApiGateway::RestApi, AWS::ApiGateway::Resource, AWS::ApiGateway::Method and AWS::ApiGateway::Deployment.

3 Comments

Thanks. So I should be able to see AWS::ApiGateway::Deployment under Resources? Unfortunately its not there....
@Mark just curious: did this solve your problem? You marked the answer as accepted but your comment seems to indicate that you don't see the API gateway yet? Also from your updated question: you only shared the packaging service part, did you get any service information output where the endpoint is listed?
Yes I marked as accepted because when I deleted the stack, and created again, it outputted the url first time, but not on subsequent deploys. Also, when _ re-created, somehow it now has an API Gateway.
0

(wanted to post this as a comment, but comments don't allow code blocks)

Your code looks fine.

I tried a similar setup:

functions:
  test-r2:
    image:
      name: r_lambda
      command:
        - functions.hello
    events:
      - http: GET /test-r

Which outputs:

Service Information
service: r-test
stage: dev
region: eu-west-1
stack: r-test-dev
resources: 11
api keys:
  None

endpoints:
  GET - https://8...2.execute-api.eu-west-1.amazonaws.com/dev/test-r
functions:
  test-r2: r-test-dev-test-r2

On which version of serverless are you? Have you tried using the latest version?

1 Comment

Im using 2.69.1, which is the latest

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.