amazon-web-services - 使用来自 docker 镜像的 lambda 的 aws localstack,调用时出错错误 : No such container:

标签 amazon-web-services docker aws-lambda localstack

我正在努力让 localstack 与 lambda 一起使用,希望这里有人可以帮助我。

在我的机器上: -Windows 10 -Docker桌面

我构建了一个简单的 python 3.8 应用程序,它将地址作为事件负载,并返回一些 GPS 数据。

  • 当尝试在 Docker 中本地运行它并通过 API 调用它时 --> 有效
  • 当我尝试将其作为 Docker 镜像部署到云 Lambda 中时 --> 它可以工作

所以我想在本地拥有一个开发环境并尝试使用 localstack image

我用这样的组合构建我的堆栈。

 version: '3.3'
services:
  localstack:
    image: localstack/localstack:0.12.15
    ports:
      - "53:53"
      - "443:443"
      - "4566-4583:4566-4583"
    environment:
      - DATA_DIR=/tmp/localstack/data
      - DEBUG=1
      - DEFAULT_REGION=eu-west-1
      - DOCKER_HOST=unix:///var/run/docker.sock
      - LAMBDA_EXECUTOR=docker
      - LAMBDA_REMOVE_CONTAINERS=true
      - LAMBDA_REMOTE_DOCKER=true
      - SERVICES=lambda,s3
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "E:/Sources/container_Lambda/storage_localstack:/tmp/localstack"
    networks:
      - localstacknet
  
  test-lambda:
    image: tes-lambda1:latest
    build:
      context: ./
    networks :
      - localstacknet
networks:
  localstacknet:
    external: false
    driver : bridge
    name: localstacknet

启动时 https://localhost:4566/health healthcheck 很好

  "services": {
    "lambda": "running",
    "logs": "running",
    "s3": "running",
    "cloudwatch": "running"
  },
  "features": {
    "persistence": "initialized",
    "initScripts": "initialized"
  }
}

现在我使用以下命令创建 lambda 函数

aws --endpoint-url http://localhost:4566 lambda create-function --function-name test-lambda --code ImageUri=tes-lambda1:latest --role arn:aws:iam::000000000:role/lambda-ex

这让我获得了成功的创作

{
    "FunctionName": "test-lambda",
    "FunctionArn": "arn:aws:lambda:eu-west-1:000000000000:function:test-lambda",
    "Role": "arn:aws:iam::000000000:role/lambda-ex",
    "Handler": "handler.handler",
    "Description": "",
    "Timeout": 3,
    "LastModified": "2021-08-11T08:23:32.406+0000",
    "Version": "$LATEST",
    "VpcConfig": {},
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "50455ed8-737d-4e79-a6ab-93bd31b89d0d",
    "State": "Active",
    "LastUpdateStatus": "Successful",
    "PackageType": "Zip"
}

但是当我想调用我的 lambda 时

aws --endpoint-url http://localhost:4566 lambda invoke --function-name arn:aws:lambda:eu-west-1:000000000000:function:test-lambda response.json

我收到以下回复

{
    "StatusCode": 200,
    "FunctionError": "Unhandled",
    "LogResult": "",
    "ExecutedVersion": "$LATEST"
}

并将跟踪日志记录到 localstack 容器提示符中,如下所示。

localstack_1   | 2021-08-11 08:31:01,715 CRIT Supervisor is running as root.  Privileges were not dropped because no user is specified in the config file.  If you intend to run as root, you can set user=root in the config file to avoid this message.
localstack_1   | 2021-08-11 08:31:01,718 INFO supervisord started with pid 14
localstack_1   | 2021-08-11 08:31:02,722 INFO spawned: 'dashboard' with pid 20
localstack_1   | 2021-08-11 08:31:02,725 INFO spawned: 'infra' with pid 21
localstack_1   | 2021-08-11 08:31:02,732 INFO success: dashboard entered RUNNING state, process has stayed up for > than 0 seconds (startsecs)
localstack_1   | 2021-08-11 08:31:02,732 INFO exited: dashboard (exit status 0; expected)
localstack_1   | (. .venv/bin/activate; exec bin/localstack start --host)
localstack_1   | 2021-08-11 08:31:03,736 INFO success: infra entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
localstack_1   | Starting local dev environment. CTRL-C to quit.
localstack_1   | Waiting for all LocalStack services to be ready
localstack_1   |
localstack_1   | LocalStack version: 0.12.15
localstack_1   | LocalStack Docker container id: d0d3ad8027ce
localstack_1   | LocalStack build date: 2021-07-07
localstack_1   | LocalStack build git hash: 46171094
localstack_1   |
localstack_1   | Starting edge router (https port 4566)...
localstack_1   | Starting mock CloudWatch service on http port 4566 ...
localstack_1   | 2021-08-11T08:31:10:DEBUG:bootstrap.py: Loading plugins - scope "services", module "localstack": <function register_localstack_plugins at 0x7f4421007dd0>
localstack_1   | 2021-08-11T08:31:10:INFO:localstack.multiserver: Starting multi API server process on port 59277
localstack_1   | [2021-08-11 08:31:10 +0000] [22] [INFO] Running on http://0.0.0.0:59277 (CTRL + C to quit)
localstack_1   | [2021-08-11 08:31:10 +0000] [22] [INFO] Running on https://0.0.0.0:4566 (CTRL + C to quit)
localstack_1   | 2021-08-11T08:31:10:INFO:hypercorn.error: Running on http://0.0.0.0:59277 (CTRL + C to quit)
localstack_1   | 2021-08-11T08:31:10:INFO:hypercorn.error: Running on https://0.0.0.0:4566 (CTRL + C to quit)
localstack_1   | Starting mock Lambda service on http port 4566 ...
localstack_1   | Starting mock CloudWatch Logs service on http port 4566 ...
localstack_1   | Starting mock S3 service on http port 4566 ...
localstack_1   | 2021-08-11 08:31:11,963:API:  * Running on all addresses.
localstack_1   |    WARNING: This is a development server. Do not use it in a production deployment.
localstack_1   | 2021-08-11 08:31:11,964:API:  * Running on http://172.21.0.3:38593/ (Press CTRL+C to quit)
localstack_1   | 2021-08-11 08:31:11,992:API:  * Running on all addresses.
localstack_1   |    WARNING: This is a development server. Do not use it in a production deployment.
localstack_1   | 2021-08-11 08:31:11,995:API:  * Running on http://172.21.0.3:47301/ (Press CTRL+C to quit)
localstack_1   | Waiting for all LocalStack services to be ready
localstack_1   | Waiting for all LocalStack services to be ready
localstack_1   | Ready.
localstack_1   | 2021-08-11 08:31:24,472:API: 127.0.0.1 - - [11/Aug/2021 08:31:24] "GET / HTTP/1.1" 200 -
localstack_1   | 2021-08-11T08:31:24:INFO:localstack.utils.analytics.profiler: Execution of "start_api_services" took 13630.11ms
localstack_1   | 2021-08-11 08:31:42,295:API: 127.0.0.1 - - [11/Aug/2021 08:31:42] "POST /2015-03-31/functions HTTP/1.1" 200 -
localstack_1   | 2021-08-11T08:32:07:INFO:localstack.services.awslambda.lambda_executors: Empty event body specified for invocation of Lambda "arn:aws:lambda:eu-west-1:000000000000:function:test-lambda"
localstack_1   | 2021-08-11T08:32:07:INFO:localstack.services.awslambda.lambda_executors: Determined main container target IP: 172.21.0.3
localstack_1   | 2021-08-11T08:32:07:INFO:localstack.services.awslambda.lambda_executors: Running lambda cmd: CONTAINER_ID="$(docker create -i   -e AWS_REGION="$AWS_REGION" -e DOCKER_LAMBDA_USE_STDIN="$DOCKER_LAMBDA_USE_STDIN" -e LOCALSTACK_HOSTNAME="$LOCALSTACK_HOSTNAME" -e EDGE_PORT="$EDGE_PORT" -e _HANDLER="$_HANDLER" -e AWS_LAMBDA_FUNCTION_TIMEOUT="$AWS_LAMBDA_FUNCTION_TIMEOUT" -e AWS_LAMBDA_FUNCTION_NAME="$AWS_LAMBDA_FUNCTION_NAME" -e AWS_LAMBDA_FUNCTION_VERSION="$AWS_LAMBDA_FUNCTION_VERSION" -e AWS_LAMBDA_FUNCTION_INVOKED_ARN="$AWS_LAMBDA_FUNCTION_INVOKED_ARN" -e AWS_LAMBDA_COGNITO_IDENTITY="$AWS_LAMBDA_COGNITO_IDENTITY"    --rm "lambci/lambda:" "handler.handler")"; docker start -ai "$CONTAINER_ID";
localstack_1   | 2021-08-11T08:32:07:DEBUG:localstack.services.awslambda.lambda_executors: Lambda arn:aws:lambda:eu-west-1:000000000000:function:test-lambda result / log output:
localstack_1   |
localstack_1   | > invalid reference format
localstack_1   | > Error: No such container:
localstack_1   | 2021-08-11 08:32:07,498:API: 127.0.0.1 - - [11/Aug/2021 08:32:07] "POST / HTTP/1.1" 200 -
localstack_1   | 2021-08-11 08:32:07,526:API: 127.0.0.1 - - [11/Aug/2021 08:32:07] "POST / HTTP/1.1" 200 -
localstack_1   | 2021-08-11 08:32:07,556:API: 127.0.0.1 - - [11/Aug/2021 08:32:07] "POST / HTTP/1.1" 200 -
localstack_1   | 2021-08-11 08:32:07,598:API: 127.0.0.1 - - [11/Aug/2021 08:32:07] "POST / HTTP/1.1" 200 -
localstack_1   | 2021-08-11 08:32:07,632:API: 127.0.0.1 - - [11/Aug/2021 08:32:07] "POST / HTTP/1.1" 200 -
localstack_1   | 2021-08-11 08:32:07,664:API: 127.0.0.1 - - [11/Aug/2021 08:32:07] "POST / HTTP/1.1" 200 -
localstack_1   | 2021-08-11T08:32:07:INFO:localstack.services.awslambda.lambda_api: Error executing Lambda function arn:aws:lambda:eu-west-1:000000000000:function:test-lambda: Lambda process returned error status code: 1. Result: . Output:
localstack_1   | invalid reference format
localstack_1   | Error: No such container: Traceback (most recent call last):
localstack_1   |   File "/opt/code/localstack/localstack/services/awslambda/lambda_api.py", line 734, in run_lambda
localstack_1   |     callback=callback,
localstack_1   |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 224, in execute
localstack_1   |     return do_execute()
localstack_1   |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 214, in do_execute
localstack_1   |     return _run(func_arn=func_arn)
localstack_1   |   File "/opt/code/localstack/localstack/utils/cloudwatch/cloudwatch_util.py", line 157, in wrapped
localstack_1   |     raise e
localstack_1   |   File "/opt/code/localstack/localstack/utils/cloudwatch/cloudwatch_util.py", line 153, in wrapped
localstack_1   |     result = func(*args, **kwargs)
localstack_1   |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 201, in _run
localstack_1   |     raise e
localstack_1   |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 189, in _run
localstack_1   |     result = self._execute(func_arn, func_details, event, context, version)
localstack_1   |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 451, in _execute
localstack_1   |     cmd, event=stdin, env_vars=environment, func_details=func_details
localstack_1   |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 342, in run_lambda_executor
localstack_1   |     result,
localstack_1   | localstack.services.awslambda.lambda_executors.InvocationException: Lambda process returned error status code: 1. Result: . Output:
localstack_1   | invalid reference format
localstack_1   | Error: No such container:

真的希望得到一些帮助才能使其发挥作用。 非常感谢

最佳答案

更新: 我终于找到了解决容器丢失问题的方法。 您必须将特权:true 添加到您的组合中,以便允许本地堆栈生成新容器。 我仍然遇到问题,但出现错误:没有这样的容器:已解决

我的 docker compose 现在就像

version: '3.3'
services:
  localstack:
    image: localstack/localstack:0.12.15
    
    ports:
      - "53:53"
      - "443:443"
      - "4566-4583:4566-4583"
    environment:
      - DATA_DIR=/tmp/localstack/data
      - DEBUG=1
      - DEFAULT_REGION=eu-west-1
      - DOCKER_HOST=unix:///var/run/docker.sock
      - HOST_TMP_FOLDER= E:/Sources/container_Lambda/storage_localstack
      - LAMBDA_EXECUTOR=docker-reuse
      - LAMBDA_REMOVE_CONTAINERS=true
      - LAMBDA_REMOTE_DOCKER=false
      - SERVICES=lambda,s3,iam,cloudwatch,dynamodb
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "E:/Sources/container_Lambda/storage_localstack/TMP:/tmp/localstack"
    networks:
      - localstacknet
    
    privileged: true
  
networks:
  localstacknet:
    external: false
    driver : bridge
    name: localstacknet

我的新问题是这样的。

 2021-08-12T07:31:23:INFO:localstack.services.awslambda.lambda_api: Error executing Lambda function arn:aws:lambda:eu-west-1:000000000000:function:testlambda3: expected string or bytes-like object Traceback (most recent call last):
localstack_1  |   File "/opt/code/localstack/localstack/services/awslambda/lambda_api.py", line 734, in run_lambda
localstack_1  |     callback=callback,
localstack_1  |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 224, in execute
localstack_1  |     return do_execute()
localstack_1  |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 214, in do_execute
localstack_1  |     return _run(func_arn=func_arn)
localstack_1  |   File "/opt/code/localstack/localstack/utils/cloudwatch/cloudwatch_util.py", line 157, in wrapped
localstack_1  |     raise e
localstack_1  |   File "/opt/code/localstack/localstack/utils/cloudwatch/cloudwatch_util.py", line 153, in wrapped
localstack_1  |     result = func(*args, **kwargs)
localstack_1  |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 201, in _run
localstack_1  |     raise e
localstack_1  |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 189, in _run
localstack_1  |     result = self._execute(func_arn, func_details, event, context, version)
localstack_1  |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 535, in _execute
localstack_1  |     return super(LambdaExecutorReuseContainers, self)._execute(func_arn, *args, **kwargs)
localstack_1  |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 441, in _execute
localstack_1  |     cmd = self.prepare_execution(func_details, environment, command)
localstack_1  |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 497, in prepare_execution
localstack_1  |     container_info = self.prime_docker_container(func_details, env_vars, lambda_cwd)
localstack_1  |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 577, in prime_docker_container
localstack_1  |     cmd = self.get_container_startup_command(func_details, env_vars, lambda_cwd)
localstack_1  |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 632, in get_container_startup_command
localstack_1  |     lambda_cwd_on_host = Util.get_host_path_for_path_in_docker(lambda_cwd)
localstack_1  |   File "/opt/code/localstack/localstack/services/awslambda/lambda_executors.py", line 1072, in get_host_path_for_path_in_docker
localstack_1  |     return re.sub(r"^%s/(.*)$" % config.TMP_FOLDER, r"%s/\1" % config.HOST_TMP_FOLDER, path)
localstack_1  |   File "/usr/lib/python3.7/re.py", line 194, in sub
localstack_1  |     return _compile(pattern, flags).sub(repl, string, count)
localstack_1  | TypeError: expected string or bytes-like object

关于amazon-web-services - 使用来自 docker 镜像的 lambda 的 aws localstack,调用时出错错误 : No such container:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68738868/

相关文章:

node.js - Nodejs - 从另一个 lambda 函数中调用 AWS.Lambda 函数

tomcat - 亚马逊 ec2 网站发布

amazon-web-services - 带有 docker 容器的 Amazon Elastic Beanstalk 与 EC2 实例

ubuntu - 我需要在 Ubuntu 上使用 Virtual Box 来创建 docker 机器吗?

c# - 从 MVC Controller 调用 AWS Lambda 函数

amazon-web-services - 为什么 AWS Lambda CFN S3 响应在删除事件时返回 403?

javascript - 如何使用nginx在express上自动访问https协议(protocol)

docker - 如何将docker-compose设置转换为docker镜像?

amazon-web-services - AWS Lambda 与 Heroku : what are the key differences?

node.js - 如何通过 NodeJS 调用 elasticsearch api?