Cube.js 在无服务器环境中超时

Cube.js timing out in serverless environment

我一直在按照 https://cube.dev/docs/deployment#express-with-basic-passport-authentication 上的指南将 Cube.js 部署到 Lambda。我让它与 Athena 数据库一起工作,使得 /meta 端点成功运行并且 returns 模式。

但是,当尝试在 Lambda 中查询 Athena 数据时,所有请求都会导致 504 网关超时。检查 CloudWatch 日志我看到一个一致的错误:

/bin/sh: hostname: command not found

知道这可能是什么吗?

这是我的 server.yml:

service: tw-cubejs

provider:
  name: aws
  runtime: nodejs12.x
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "sns:*"
        # Athena permissions
        - "athena:*"
        - "s3:*"
        - "glue:*"
      Resource:
        - "*"
  # When you uncomment vpc please make sure lambda has access to internet: https://medium.com/@philippholly/aws-lambda-enable-outgoing-internet-access-within-vpc-8dd250e11e12
  vpc:
    securityGroupIds:
      # Your DB and Redis security groups here
      - ########
    subnetIds:
      # Put here subnet with access to your DB, Redis and internet. For internet access 0.0.0.0/0 should be routed through NAT only for this subnet!
      - ########
      - ########
      - ########
      - ########
  environment:
    CUBEJS_AWS_KEY: ########
    CUBEJS_AWS_SECRET: ########
    CUBEJS_AWS_REGION: ########
    CUBEJS_DB_TYPE: athena
    CUBEJS_AWS_S3_OUTPUT_LOCATION: ########
    CUBEJS_JDBC_DRIVER: athena
    REDIS_URL: ########
    CUBEJS_API_SECRET: ########
    CUBEJS_APP: "${self:service.name}-${self:provider.stage}"
    NODE_ENV: production
    AWS_ACCOUNT_ID:
      Fn::Join:
        - ""
        - - Ref: "AWS::AccountId"

functions:
  cubejs:
    handler: cube.api
    timeout: 30
    events:
      - http:
          path: /
          method: GET
      - http:
          path: /{proxy+}
          method: ANY
  cubejsProcess:
    handler: cube.process
    timeout: 630
    events:
      - sns: "${self:service.name}-${self:provider.stage}-process"

plugins:
  - serverless-express

根据变更日志this issue should have been fixed in 0.10.59检查您正在使用的 cube.js 版本。

这很可能取决于 cube.js 的依赖性,假设它将 运行 所在的所有环境都能够 运行 hostname shell命令(看起来它正在使用 node-machine-id.

即使这个 hostname 错误消息也在日志中,但这不是问题的原因。 您很可能遇到 .

中描述的问题

@cubejs-backend/serverless 使用互联网连接访问消息传递 API 以及 VPC 内的 Redis 以管理队列和缓存。 其中之一在您的环境中不起作用。

此类超时通常意味着 internet connection or with Redis connection 存在问题。如果是 Redis,您通常会在 cubejscubejsProcess 函数中看到 5 分钟左右的超时。如果是互联网连接,您将永远不会在 cubejsProcess 函数中看到任何查询处理日志。