【问题标题】:Unable to query dynamodb GSI in lambda locally无法在本地查询 lambda 中的 dynamodb GSI
【发布时间】:2020-12-01 08:18:04
【问题描述】:

所以我使用 amplify CLI 添加了一个 lambda 函数类别,以便从我使用 graphql 架构中的 @key 指令创建的 GSI(全局二级索引)查询数据。每当我尝试使用 amplify mock function <functionName> 在本地模拟该函数时,查询的回调函数都会继续返回 null。功能见下图

const AWS = require("aws-sdk");
const db = new AWS.DynamoDB.DocumentClient({
  region: process.env.REGION,
  apiVersion: "2012-08-10",
});


 const params = {
  // ProjectionExpression: ["province", "gender", "updatedAt", "createdAt"],
  ExpressionAttributeValues: {
    ":provinceVal": "Sichuan",
  },
  IndexName: "RegistreesByProvince",
  KeyConditionExpression: "province = :provinceVal",
  TableName: process.env.API_PORTAL_SUBMISSIONSTABLE_NAME,
};

const calculateStatistics = async () => {
  try {
    const data = await db.query(params).promise();
    console.log(data);
  } catch (err) {
    console.log(err);
  }
};

const resolvers = {
  Query: {
    getStatistics: () => {
      return calculateStatistics();
    },
  },
};
exports.handler = async (event) => {
  // TODO implement
  const typeHandler = resolvers[event.typeName];
  if (typeHandler) {
    const resolver = typeHandler[event.fieldName];
    if (resolver) {
      var result = await resolver(event);
      return result;
    }
  }
}; // };

然后我尝试捕获整个事件并将其记录到控制台,这可以在 calculateStatistics 函数中看到,现在它向我显示了如下更明确的错误。

     { UnknownEndpoint: Inaccessible host: `dynamodb.us-east-1-fake.amazonaws.com'. This service may not be available in the `us-east-1-fake' region.
    at Request.ENOTFOUND_ERROR (/Users/apple/Documents/work/web/portal/amplify/backend/function/calcStatistics/src/node_modules/aws-sdk/lib/event_listeners.js:501:46)
    at Request.callListeners (/Users/apple/Documents/work/web/portal/amplify/backend/function/calcStatistics/src/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/Users/apple/Documents/work/web/portal/amplify/backend/function/calcStatistics/src/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/Users/apple/Documents/work/web/portal/amplify/backend/function/calcStatistics/src/node_modules/aws-sdk/lib/request.js:688:14)
    at ClientRequest.error (/Users/apple/Documents/work/web/portal/amplify/backend/function/calcStatistics/src/node_modules/aws-sdk/lib/event_listeners.js:339:22)
    at ClientRequest.<anonymous> (/Users/apple/Documents/work/web/portal/amplify/backend/function/calcStatistics/src/node_modules/aws-sdk/lib/http/node.js:96:19)
    at ClientRequest.emit (events.js:198:13)
    at ClientRequest.EventEmitter.emit (domain.js:448:20)
    at TLSSocket.socketErrorListener (_http_client.js:401:9)
    at TLSSocket.emit (events.js:198:13)
  message:
   'Inaccessible host: `dynamodb.us-east-1-fake.amazonaws.com\'. This service may not be available in the `us-east-1-fake\' region.',
  code: 'UnknownEndpoint',
  region: 'us-east-1-fake',
  hostname: 'dynamodb.us-east-1-fake.amazonaws.com',
  retryable: true,
  originalError:
   { Error: getaddrinfo ENOTFOUND dynamodb.us-east-1-fake.amazonaws.com dynamodb.us-east-1-fake.amazonaws.com:443
       at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)
     message:
      'getaddrinfo ENOTFOUND dynamodb.us-east-1-fake.amazonaws.com dynamodb.us-east-1-fake.amazonaws.com:443',
     errno: 'ENOTFOUND',
     code: 'NetworkingError',
     syscall: 'getaddrinfo',
     hostname: 'dynamodb.us-east-1-fake.amazonaws.com',
     host: 'dynamodb.us-east-1-fake.amazonaws.com',
     port: 443,
     region: 'us-east-1-fake',
     retryable: true,
     time: 2020-08-12T10:18:08.321Z },
  time: 2020-08-12T10:18:08.321Z }
Result:
null
Finished execution.

然后我做了更多的研究并遇到了this 线程关于 inaccessible-dynamodb-host-when-running-amplify-mock 我遵循并尝试实施但无济于事。对此的任何帮助将不胜感激。

PS:值得一提的是,我能够通过 Appsync 控制台成功查询到这些数据,这让我坚信问题出在函数本身。

【问题讨论】:

    标签: aws-lambda amazon-dynamodb serverless-framework aws-amplify aws-appsync


    【解决方案1】:

    在做了更多的研究和四处询问之后,我终于明白了 github 上提供给我的答案

    在可以访问 dynamodb 的函数上运行模拟时 API 生成的表。它将用假值填充 env。如果 你想根据你部署的模拟你的 lambda 函数 dynamodb 表,您可以编辑 sdk 客户端中的值,以便它可以 准确拨打电话。

    总而言之,如果您在本地运行东西,那么您将无法访问您可能会尝试模拟的后端变量。我希望这可以帮助别人。谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      相关资源
      最近更新 更多