【问题标题】:Serverless Offline & DynamoDB throws Local UnknownEndpoint: Inaccessible host: localhost at port 8000 Service may not be available in localhost regionServerless Offline & DynamoDB 抛出 Local UnknownEndpoint: Inaccessible host: localhost at port 8000 Service may not available in localhost region
【发布时间】:2023-01-09 22:47:03
【问题描述】:

我正在玩 Serverless,我没有运气让 serverless-offlineserverless-dynamodb-local 一起工作。 我的设置非常少,重现需要 3 分钟,我是这样做的:

  1. 生成一个 TS Serverless 项目,如 - sls create -t aws-nodejs-typescript --path folder-name
  2. 安装依赖npm i
  3. 本地添加DynamoDBnpm install --save serverless-dynamodb-local
  4. 添加无服务器离线npm install serverless-offline --save-dev
  5. 安装dynamodb sls dynamodb install


    现在我更新serverless.ts文件

    1. 以正确的顺序包含已安装的插件
        plugins: [
          'serverless-esbuild',
          'serverless-dynamodb-local',
          'serverless-offline'
        ],
      
      1. custom 添加 DynamoDB 配置
        custom: {
          esbuild: { ... },
          dynamodb: {
            stages: ['dev'],
            start: {
              migrate: true
            }
          }
      
      1. 最后一步是在资源中添加 DynamoDB
        resources: {
          Resources: {
            usersTable: {
              Type: 'AWS::DynamoDB::Table',
              Properties: {
                TableName: 'firstTable',
                AttributeDefinitions: [{
                  AttributeName: 'id',
                  AttributeType: 'S',
                }],
                KeySchema: [{
                  AttributeName: 'id',
                  KeyType: 'HASH'
                }],
                ProvisionedThroughput: {
                  ReadCapacityUnits: 1,
                  WriteCapacityUnits: 1
                }
              }
            }
          }
        }
      

      现在我尝试通过运行sls offline start -s dev 来启动它,它在下面抛出错误(执行不会停止)
      (如果我从 serverless.ts 中删除 migrate: true,逻辑上不会抛出此错误)

      Dynamodb Local Started, Visit: http://localhost:8000/shell
      UnknownEndpoint: Inaccessible host: `localhost' at port `8000'. This service may not be available in the `localhost' region.: DynamoDB - Error - 
      Environment: darwin, node 17.3.1, framework 3.12.0 (local), plugin 6.2.1, SDK 4.3.2
      Docs:        docs.serverless.com
      Support:     forum.serverless.com
      Bugs:        github.com/serverless/serverless/issues
      
      Error:
      UnknownEndpoint: Inaccessible host: `localhost' at port `8000'. This service may not be available in the `localhost' region.
      at Request.ENOTFOUND_ERROR (...node_modules/aws-sdk/lib/event_listeners.js:529:46)
      at Request.callListeners (...node_modules/aws-sdk/lib/sequential_executor.js:106:20)
      at Request.emit (...node_modules/aws-sdk/lib/sequential_executor.js:78:10)
      at Request.emit (...node_modules/aws-sdk/lib/request.js:686:14)
      at error (...node_modules/aws-sdk/lib/event_listeners.js:361:22)
      at ClientRequest.<anonymous> (...node_modules/aws-sdk/lib/http/node.js:99:9)
      at ClientRequest.emit (node:events:390:28)
      at ClientRequest.emit (node:domain:475:12)
      at Socket.socketErrorListener (node:_http_client:442:9)
      at Socket.emit (node:events:390:28)
      at Socket.emit (node:domain:475:12)
      at emitErrorNT (node:internal/streams/destroy:164:8)
      at emitErrorCloseNT (node:internal/streams/destroy:129:3)
      at processTicksAndRejections (node:internal/process/task_queues:83:21)
      

      即使抛出错误,我仍然能够成功执行

      > aws dynamodb list-tables --endpoint-url http://localhost:8000 --region localhost
      {
          "TableNames": []
      }
      



      除了上面描述的之外,我没有更改任何其他代码。我猜这将是一些非常基本的东西,比如我缺少一些配置或某处的东西,但我在文档或其他帖子中找不到任何有用的东西。 欢迎任何想法。

      ...而且因为我知道某些版本过去有问题这里是package.json我正在运行

        "engines": {
          "node": ">=14.15.0"
        },
        "dependencies": {
          "@middy/core": "^2.5.3",
          "@middy/http-json-body-parser": "^2.5.3",
          "serverless-dynamodb-local": "^0.2.40"
        },
        "devDependencies": {
          "@serverless/typescript": "^3.0.0",
          "@types/aws-lambda": "^8.10.71",
          "@types/node": "^14.14.25",
          "esbuild": "^0.14.11",
          "json-schema-to-ts": "^1.5.0",
          "serverless": "^3.0.0",
          "serverless-esbuild": "^1.23.3",
          "serverless-offline": "^8.5.0",
          "ts-node": "^10.4.0",
          "tsconfig-paths": "^3.9.0",
          "typescript": "^4.1.3"
        },
      

      如果有帮助,这里是完整的serverless.ts

      const serverlessConfiguration: AWS = {
        service: 'aws-onboarding-api',
        frameworkVersion: '3',
        plugins: [
          'serverless-esbuild',
          'serverless-dynamodb-local',
          'serverless-offline'
        ],
        provider: {
          name: 'aws',
          runtime: 'nodejs14.x',
          apiGateway: {
            minimumCompressionSize: 1024,
            shouldStartNameWithService: true,
          },
          environment: {
            AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
            NODE_OPTIONS: '--enable-source-maps --stack-trace-limit=1000',
          },
        },
        // import the function via paths
        functions: { hello },
        package: { individually: true },
        custom: {
            esbuild: {
            bundle: true,
            minify: false,
            sourcemap: true,
            exclude: ['aws-sdk'],
            target: 'node14',
            define: { 'require.resolve': undefined },
            platform: 'node',
            concurrency: 10,
          },
          dynamodb: {
            stages: ['dev'],
            start: {
              migrate: true
            }
          }
        },
        resources: {
          Resources: {
            usersTable: {
              Type: 'AWS::DynamoDB::Table',
              Properties: {
                TableName: 'firstTable',
                AttributeDefinitions: [{
                  AttributeName: 'id',
                  AttributeType: 'S',
                }],
                KeySchema: [{
                  AttributeName: 'id',
                  KeyType: 'HASH'
                }],
                ProvisionedThroughput: {
                  ReadCapacityUnits: 1,
                  WriteCapacityUnits: 1
                }
              }
            }
          }
        }
      };
      

【问题讨论】:

    标签: typescript serverless serverless-framework serverless-offline amazon-dynamodb-local


    【解决方案1】:

    结果是我的节点版本有问题,我正在运行v17.3.1。切换到v16.4.0后,它就像一个魅力。 ?

    【讨论】:

    • 这次真是万分感谢!我正在运行节点 18 并撞到了你所在的同一堵墙。降级到 16 就成功了。
    猜你喜欢
    • 2019-11-20
    • 2020-11-18
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2018-10-11
    • 2013-05-11
    相关资源
    最近更新 更多