3

通过 CloudFormation,我有一个设置,包括 DynamoDB 表、DAX、VPC、Lambdas(位于 VPC 中)、安全组(允许访问端口 8111)等等。

一切正常,除非它不起作用。

我可以在 99% 的时间从我的 VPC 的 Lambda 访问 DAX。除了偶尔他们得到 NoRouteException 错误......看似随机。这是 CloudWatch 的输出,其中单个 Lambda 函数每次都执行完全相同的操作(DAX 获取)。注意它是如何工作的、失败的,然后又是如何工作的:

/aws/lambda/BigOnion_accountGet START RequestId: 2b732899-f380-11e7-a650-cbfe0f7dfb3d Version: $LATEST
/aws/lambda/BigOnion_accountGet END RequestId: 2b732899-f380-11e7-a650-cbfe0f7dfb3d
/aws/lambda/BigOnion_accountGet REPORT RequestId: 2b732899-f380-11e7-a650-cbfe0f7dfb3d  Duration: 58.24 ms  Billed Duration: 100 ms     Memory Size: 768 MB Max Memory Used: 48 MB
/aws/lambda/BigOnion_accountGet START RequestId: 3b63a928-f380-11e7-a116-5bb37bb69bee Version: $LATEST
/aws/lambda/BigOnion_accountGet END RequestId: 3b63a928-f380-11e7-a116-5bb37bb69bee
/aws/lambda/BigOnion_accountGet REPORT RequestId: 3b63a928-f380-11e7-a116-5bb37bb69bee  Duration: 35.01 ms  Billed Duration: 100 ms     Memory Size: 768 MB Max Memory Used: 48 MB
/aws/lambda/BigOnion_accountGet START RequestId: 4b7fa7f2-f380-11e7-a0c8-513a66a11e7a Version: $LATEST
/aws/lambda/BigOnion_accountGet 2018-01-07T07:56:40.643Z    3b63a928-f380-11e7-a116-5bb37bb69bee    caught exception during cluster refresh: { Error: NoRouteException: not able to resolve address
    at DaxClientError (/var/task/index.js:545:5)
    at AutoconfSource._resolveAddr (/var/task/index.js:18400:23)
    at _pull (/var/task/index.js:18421:20)
    at _pullFrom.then.catch (/var/task/index.js:18462:18)
  time: 1515311800643,
  code: 'NoRouteException',
  retryable: true,
  requestId: null,
  statusCode: -1,
  _tubeInvalid: false,
  waitForRecoveryBeforeRetrying: false }
/aws/lambda/BigOnion_accountGet 2018-01-07T07:56:40.682Z    3b63a928-f380-11e7-a116-5bb37bb69bee    Error: NoRouteException: not able to resolve address
    at DaxClientError (/var/task/index.js:545:5)
    at AutoconfSource._resolveAddr (/var/task/index.js:18400:23)
    at _pull (/var/task/index.js:18421:20)
    at _pullFrom.then.catch (/var/task/index.js:18462:18)
/aws/lambda/BigOnion_accountGet END RequestId: 4b7fa7f2-f380-11e7-a0c8-513a66a11e7a
/aws/lambda/BigOnion_accountGet REPORT RequestId: 4b7fa7f2-f380-11e7-a0c8-513a66a11e7a  Duration: 121.24 ms Billed Duration: 200 ms     Memory Size: 768 MB Max Memory Used: 48 MB
/aws/lambda/BigOnion_accountGet START RequestId: 5b951673-f380-11e7-9818-f1effc29edd5 Version: $LATEST
/aws/lambda/BigOnion_accountGet END RequestId: 5b951673-f380-11e7-9818-f1effc29edd5
/aws/lambda/BigOnion_accountGet REPORT RequestId: 5b951673-f380-11e7-9818-f1effc29edd5  Duration: 39.42 ms  Billed Duration: 100 ms     Memory Size: 768 MB Max Memory Used: 48 MB
/aws/lambda/BigOnion_siteCreate START RequestId: 0ec60080-f380-11e7-afea-a95d25c6e53f Version: $LATEST
/aws/lambda/BigOnion_siteCreate END RequestId: 0ec60080-f380-11e7-afea-a95d25c6e53f
/aws/lambda/BigOnion_siteCreate REPORT RequestId: 0ec60080-f380-11e7-afea-a95d25c6e53f  Duration: 3.48 ms   Billed Duration: 100 ms     Memory Size: 768 MB Max Memory Used: 48 MB

有什么想法吗?

大概不是 VPC 和安全访问,因为 9/10 次访问完全没问题。我有广泛的 CIDR IP,所以我认为这与 EIN 配置无关……但还有什么?

我唯一的提示是初始错误,指出“在集群刷新期间捕获异常”。究竟什么是“集群刷新”以及它如何导致这些故障?

4

1 回答 1

2

“集群刷新”是 DAX 客户端使用的一个后台进程,用于确保其对集群成员状态的了解在某种程度上符合现实,因为 DAX 客户端负责将请求路由到集群中的适当节点。

通常刷新失败不是问题,因为集群状态很少更改(因此可以重用现有状态),但在启动时,客户端“阻塞”以获取初始成员列表。如果失败,客户端将无法继续,因为它不知道哪个节点可以处理哪些请求。

在 Lambda 冷启动期间创建连接 VPC 的 ENI 可能会有轻微延迟,这意味着客户端在初始化期间无法访问集群(因此,“没有到主机的路由”)。一个 Lambda 容器正在运行它应该不是问题(如果出现网络故障,您可能仍然会在日志中看到异常,但它不应该影响任何事情)。

如果它只发生在冷启动期间,那么稍微延迟后重试应该能够解决它。

于 2018-01-08T18:36:25.903 回答