When running a docker-compose with an image that is using sam to run a local api, the api can never get a response from the lambda container. Everything works correctly when run locally not in a container.
I have read through all the answers in 2492 and tried the various permutations suggested, nothing has worked. There appeared to be no subsequent documentation follow up for getting this setup to work with docker.
FROM python:alpine
RUN apk add --no-cache --virtual build-deps build-base=0.5-r2 gcc=10.2.1_pre1-r3 bash=5.1.0-r0 && \
pip install aws-sam-cli==1.23.0 && \
apk del build-deps
COPY ./sam_entrypoint.sh /bin/sam_entrypoint.sh
RUN chmod +x /bin/sam_entrypoint.sh
WORKDIR /app
COPY ./node_modules /app/node_modules
COPY ./package.json /app/package.json
COPY ./template.yml /app/template.yml
COPY ./dist /app/dist
EXPOSE 3000
ENTRYPOINT ["sh","/bin/sam_entrypoint.sh"]
#!/bin/bash
set -o errexit
/usr/local/bin/sam local start-api --debug \
--template ./template.yml \
--host 0.0.0.0 \
--container-host host.docker.internal \
--container-host-interface 127.0.0.1 \
--docker-network host
AWSTemplateFormatVersion: "2010-09-09"
Transform: "AWS::Serverless-2016-10-31"
Description: "Automated lambda setup for api gateway"
Resources:
res0:
Type: "AWS::Serverless::Function"
Properties:
CodeUri: "./"
Handler: "dist/index.handler"
Runtime: "nodejs12.x"
Timeout: 10
Events:
CatchAll:
Type: "Api"
Properties:
Path: "/"
Method: ANY
res1:
Type: "AWS::Serverless::Function"
Properties:
CodeUri: "./"
Handler: "dist/index.handler"
Runtime: "nodejs12.x"
Timeout: 10
Events:
CatchAll:
Type: "Api"
Properties:
Path: "/{proxy+}"
Method: ANY
version: '3.6'
services:
sam_app:
build:
context: .
dockerfile: Dockerfile.test
ports:
- "3000:3000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
extra_hosts:
- "host.docker.internal:host-gateway"
sam_app_1 |
sam_app_1 | SAM CLI now collects telemetry to better understand customer needs.
sam_app_1 |
sam_app_1 | You can OPT OUT and disable telemetry collection by setting the
sam_app_1 | environment variable SAM_CLI_TELEMETRY=0 in your shell.
sam_app_1 | Thanks for your help!
sam_app_1 |
sam_app_1 | Learn More: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-telemetry.html
sam_app_1 |
sam_app_1 | 2021-04-28 17:40:50,630 | Telemetry endpoint configured to be https://aws-serverless-tools-telemetry.us-west-2.amazonaws.com/metrics
sam_app_1 | 2021-04-28 17:40:50,630 | Using config file: samconfig.toml, config environment: default
sam_app_1 | 2021-04-28 17:40:50,631 | Expand command line arguments to:
sam_app_1 | 2021-04-28 17:40:50,631 | --template_file=/app/template.yml --host=0.0.0.0 --port=3000 --static_dir=public --layer_cache_basedir=/root/.aws-sam/layers-pkg --container_host=localhost --container_host_interface=127.0.0.1
sam_app_1 | 2021-04-28 17:40:50,704 | local start-api command is called
sam_app_1 | 2021-04-28 17:40:50,709 | No Parameters detected in the template
sam_app_1 | 2021-04-28 17:40:50,732 | 3 stacks found in the template
sam_app_1 | 2021-04-28 17:40:50,732 | No Parameters detected in the template
sam_app_1 | 2021-04-28 17:40:50,753 | 3 resources found in the stack
sam_app_1 | 2021-04-28 17:40:50,753 | No Parameters detected in the template
sam_app_1 | 2021-04-28 17:40:50,773 | Found Serverless function with name='res0' and CodeUri='./'
sam_app_1 | 2021-04-28 17:40:50,773 | --base-dir is not presented, adjusting uri ./ relative to /app/template.yml
sam_app_1 | 2021-04-28 17:40:50,773 | Found Serverless function with name='res1' and CodeUri='./'
sam_app_1 | 2021-04-28 17:40:50,773 | --base-dir is not presented, adjusting uri ./ relative to /app/template.yml
sam_app_1 | 2021-04-28 17:40:50,777 | No Parameters detected in the template
sam_app_1 | 2021-04-28 17:40:50,798 | No Parameters detected in the template
sam_app_1 | 2021-04-28 17:40:50,819 | Found '1' API Events in Serverless function with name 'res0'
sam_app_1 | 2021-04-28 17:40:50,819 | Found '1' API Events in Serverless function with name 'res1'
sam_app_1 | 2021-04-28 17:40:50,819 | Detected Inline Swagger definition
sam_app_1 | 2021-04-28 17:40:50,819 | Lambda function integration not found in Swagger document at path='/' method='x-amazon-apigateway-any-method'
sam_app_1 | 2021-04-28 17:40:50,819 | Lambda function integration not found in Swagger document at path='/{proxy+}' method='x-amazon-apigateway-any-method'
sam_app_1 | 2021-04-28 17:40:50,819 | Found '0' APIs in resource 'ServerlessRestApi'
sam_app_1 | 2021-04-28 17:40:50,819 | Removed duplicates from '0' Explicit APIs and '2' Implicit APIs to produce '2' APIs
sam_app_1 | 2021-04-28 17:40:50,819 | 2 APIs found in the template
sam_app_1 | 2021-04-28 17:40:50,825 | Mounting res0 at http://0.0.0.0:3000/ [DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT]
sam_app_1 | 2021-04-28 17:40:50,825 | Mounting res1 at http://0.0.0.0:3000/{proxy+} [DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT]
sam_app_1 | 2021-04-28 17:40:50,826 | You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You
only need to restart SAM CLI if you update your AWS SAM template
sam_app_1 | 2021-04-28 17:40:50,826 | Localhost server is starting up. Multi-threading = True
sam_app_1 | 2021-04-28 17:40:50 * Running on http://0.0.0.0:3000/ (Press CTRL+C to quit)
sam_app_1 | 2021-04-28 17:41:20,791 | Constructed String representation of Event to invoke Lambda. Event: {"body": null, "headers": {"Accept": "*/*", "Host": "127.0.0.1:3000", "User-Agent": "insomnia/2021.2.2", "X-Forwarded-Port": "3000", "X-Forwarded-Proto": "http"}, "httpMethod": "GET", "isBase64Encoded": false, "multiValueHeaders": {"Accept": ["*/*"], "Host": ["127.0.0.1:3000"], "User-Agent": ["insomnia/2021.2.2"], "X-Forwarded-Port": ["3000"], "X-Forwarded-Proto":
["http"]}, "multiValueQueryStringParameters": null, "path": "/v1/openapi.json", "pathParameters": {"proxy": "v1/openapi.json"}, "queryStringParameters": null, "requestContext": {"accountId": "123456789012", "apiId": "1234567890", "domainName": "127.0.0.1:3000", "extendedRequestId": null, "httpMethod": "GET", "identity": {"accountId": null, "apiKey": null, "caller": null, "cognitoAuthenticationProvider": null, "cognitoAuthenticationType": null, "cognitoIdentityPoolId": null, "sourceIp": "172.24.0.1", "user": null, "userAgent": "Custom User Agent String", "userArn": null}, "path": "/{proxy+}", "protocol": "HTTP/1.1", "requestId": "d9c5fa20-2328-43f7-b4d2-5a35028dfab1", "requestTime": "28/Apr/2021:17:40:50 +0000", "requestTimeEpoch": 1619631650, "resourceId": "123456", "resourcePath": "/{proxy+}", "stage": "Prod"}, "resource": "/{proxy+}", "stageVariables": null, "version": "1.0"}
sam_app_1 | 2021-04-28 17:41:20,791 | Found one Lambda function with name 'res1'
sam_app_1 | 2021-04-28 17:41:20,791 | Invoking dist/index.handler (nodejs12.x)
sam_app_1 | 2021-04-28 17:41:20,791 | Environment variables overrides data is standard format
sam_app_1 | 2021-04-28 17:41:20,791 | Loading AWS credentials from session with profile 'None'
sam_app_1 | 2021-04-28 17:41:20,803 | Resolving code path. Cwd=/app, CodeUri=/app
sam_app_1 | 2021-04-28 17:41:20,803 | Resolved absolute path to code is /app
sam_app_1 | 2021-04-28 17:41:20,803 | Code /app is not a zip/jar file
sam_app_1 | 2021-04-28 17:41:20,817 | Skip pulling image and use local one: amazon/aws-sam-cli-emulation-image-nodejs12.x:rapid-1.23.0.
sam_app_1 |
sam_app_1 | 2021-04-28 17:41:20,817 | Mounting /app as /var/task:ro,delegated inside runtime container
sam_app_1 | 2021-04-28 17:41:21,124 | Starting a timer for 10 seconds for function 'res1'
sam_app_1 | 2021-04-28 17:41:22,075 | Cleaning all decompressed code dirs
sam_app_1 | 2021-04-28 17:41:22,075 | No response from invoke container for res1
sam_app_1 | 2021-04-28 17:41:22,075 | Invalid lambda response received: Lambda response must be valid json
sam_app_1 | 2021-04-28 17:41:22 172.24.0.1 - - [28/Apr/2021 17:41:22] "GET /v1/openapi.json HTTP/1.1" 502 -
That the lambda can be executed correctly and a response received.
Description:
Related to #2492
When running a docker-compose with an image that is using sam to run a local api, the api can never get a response from the lambda container. Everything works correctly when run locally not in a container.
I have read through all the answers in 2492 and tried the various permutations suggested, nothing has worked. There appeared to be no subsequent documentation follow up for getting this setup to work with docker.
Steps to reproduce:
DockerFile
sam_entrypoint.sh
Template.yml
Docker-compose
Observed result:
Expected result:
That the lambda can be executed correctly and a response received.
Additional environment details (Ex: Windows, Mac, Amazon Linux etc)
sam --version: 1.23.0