【问题标题】:UnrecognizedClientException when invoking a lambda from another lambda using localstack使用 localstack 从另一个 lambda 调用 lambda 时出现 UnrecognizedClientException
【发布时间】:2019-11-06 18:21:10
【问题描述】:

我正在使用此 docker-compose.yml 文件在 docker 容器内运行 localstack。

version: '2.1'

services:
  localstack:
    image: localstack/localstack
    ports:
      - "4567-4597:4567-4597"
      - "${PORT_WEB_UI-8080}:${PORT_WEB_UI-8080}"
    environment:
      - SERVICES=${SERVICES- }
      - DEBUG=1
      - DATA_DIR=${DATA_DIR- }
      - PORT_WEB_UI=${PORT_WEB_UI- }
      - LAMBDA_EXECUTOR=docker
      - KINESIS_ERROR_PROBABILITY=${KINESIS_ERROR_PROBABILITY- }
      - DOCKER_HOST=unix:///var/run/docker.sock
    volumes:
      - "${TMPDIR:-/tmp/localstack}:/tmp/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"

要启动 localstack,我运行 TMPDIR=/private$TMPDIR docker-compose up

我创建了两个 lambda。当我运行aws lambda list-functions --endpoint-url http://localhost:4574 --region=us-east-1 时,这是输出。

{
"Functions": [
    {
        "TracingConfig": {
            "Mode": "PassThrough"
        },
        "Version": "$LATEST",
        "CodeSha256": "qmDiumefhM0UutYv32By67cj24P/NuHIhKHgouPkDBs=",
        "FunctionName": "handler",
        "LastModified": "2019-08-08T17:56:58.277+0000",
        "RevisionId": "ffea379b-4913-420b-9444-f1e5d51b5908",
        "CodeSize": 5640253,
        "FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:handler",
        "Environment": {
            "Variables": {
                "DB_NAME": "somedbname",
                "IS_PRODUCTION": "FALSE",
                "SERVER": "xxx.xxx.xx.xxx",
                "DB_PASS": "somepass",
                "DB_USER": "someuser",
                "PORT": "someport"
            }
        },
        "Handler": "handler",
        "Role": "r1",
        "Timeout": 3,
        "Runtime": "go1.x",
        "Description": ""
    },
    {
        "TracingConfig": {
            "Mode": "PassThrough"
        },
        "Version": "$LATEST",
        "CodeSha256": "wbT8YzTsYW4sIOAXLtjprrveq5NBMVUaa2srNvwLxM8=",
        "FunctionName": "paymentenginerouter",
        "LastModified": "2019-08-08T18:00:28.923+0000",
        "RevisionId": "bd79cb2e-6531-4987-bdfc-25a5d87e93f4",
        "CodeSize": 6602279,
        "FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:paymentenginerouter",
        "Environment": {
            "Variables": {
                "DB_QUERY_LAMBDA": "handler",
                "AWS_REGION": "us-east-1"
            }
        },
        "Handler": "handler",
        "Role": "r1",
        "Timeout": 3,
        "Runtime": "go1.x",
        "Description": ""
    }
]

}

paymentenginerouter 代码中,我尝试通过以下方式调用handler lambda:

    lambdaParams := &invoke.InvokeInput{
    FunctionName:   aws.String(os.Getenv("DB_QUERY_LAMBDA")),
    InvocationType: aws.String("RequestResponse"),
    LogType:        aws.String("Tail"),
    Payload:        payload,
}
result, err := svc.Invoke(lambdaParams)
if err != nil {
    resp.StatusCode = 500
    log.Fatal("Error while invoking lambda:\n", err.Error())
}

invoke 是一个导入:invoke "github.com/aws/aws-sdk-go/service/lambda"

当我通过以下方式运行paymentenginerouter lambda 时:

aws lambda invoke --function paymentenginerouter --payload  '{ "body": "{\"id\":\"12\",\"internalZoneCode\":\"xxxxxx\",\"vehicleId\":\"xxxxx\",\"vehicleVrn\":\"vehicleVrn\",\"vehicleVrnState\":\"vehicleVrnState\",\"durationInMinutes\":\"120\",\"verification\":{\"Token\":null,\"lpn\":null,\"ZoneCode\":null,\"IsExtension\":null,\"ParkingActionId\":null},\"selectedBillingMethodId\":\"xxxxxx\",\"startTimeLocal\":\"2019-07-29T11:36:47\",\"stopTimeLocal\":\"2019-07-29T13:36:47\",\"vehicleVin\":null,\"orderId\":\"1\",\"parkingActionType\":\"OnDemand\",\"digitalPayPaymentInfo\":{\"Provider\":\"<string>\",\"ChasePayData\":{\"ConsumerIP\":\"xxxx\",\"DigitalSessionID\":\"xxxx\",\"TransactionReferenceKey\":\"xxxx\"}}}"
}' --endpoint-url=http://localhost:4574 --region=us-east-1 out --debug

我收到此错误:

localstack_1  | 2019/08/08 20:02:28 Error while invoking lambda:
localstack_1  | UnrecognizedClientException: The security token included in the request is invalid.
localstack_1  |     status code: 403, request id: bd4e3c15-47ae-44a2-ad6a-376d78d8fd92

注意

可以通过 cli 直接调用 handler lambda,而不会出错:

aws lambda invoke --function handler --payload '{"body": "SELECT TOKEN, NAME, CREATED, ENABLED, TIMESTAMP FROM dbo.PAYMENT_TOKEN WHERE BILLING_METHOD_ID='xxxxxxx'"}' --endpoint-url=http://localhost:4574 --region=us-east-1 out --debug

我认为 AWS 凭证是根据 localstack 中的环境变量设置的,但我可能弄错了。知道如何解决这个问题吗?

我对 AWS lambdas 还很陌生,而且在 localstack 方面绝对是菜鸟,所以如果您需要它们,请询问更多详细信息。我的描述中可能遗漏了一条关键信息。

【问题讨论】:

    标签: amazon-web-services aws-lambda invoke localstack


    【解决方案1】:

    您收到The security token included in the request is invalid. 的错误意味着您的 lambda 正在尝试使用无效凭据调用真正的 AWS,而不是转到 Localstack。

    在 localstack 中运行 lambda 并且 lambda 代码本身必须调用 localstack 中托管的任何 AWS 服务时,您需要确保使用的任何端点都重定向到 localstack。

    要做到这一点,请在此处找到 localstack 中的文档功能:

    https://github.com/localstack/localstack#configurations

    LOCALSTACK_HOSTNAME:LocalStack 服务可用的主机名。 这是从您的 Lambda 函数中访问服务所必需的 (例如,将项目从 Lambda 存储到 DynamoDB 或 S3)。变量 LOCALSTACK_HOSTNAME 可用于本地 Lambda 执行 (LAMBDA_EXECUTOR=local) 并在单独的 Docker 容器中执行 (LAMBDA_EXECUTOR=docker)。

    在您的 lambda 代码中,确保使用此环境变量来设置主机名(以 http:// 开头并以本地堆栈中该服务的端口号为后缀,例如 :4569 用于 dynamodb)。这将确保呼叫转到正确的位置。

    Go 代码 sn-p 中的示例将添加到您的 lambda 中,您将在其中调用 DynamoDB:

    awsConfig.WithEndpoint("http://" + os.Getenv("LOCALSTACK_HOSTNAME") + ":4569")
    

    【讨论】:

    • 好的。但是,如果我真的想从我的 localstack lambda 调用真正的 AWS 服务怎么办。可能是我不想模拟我所有的 AWS 服务,所以想访问我账户上的一些实时服务。
    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 2021-05-12
    • 2016-12-31
    • 1970-01-01
    • 2019-05-22
    • 2018-08-21
    • 2022-12-05
    • 2021-11-04
    相关资源
    最近更新 更多