首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用VPC从lambda窥视时ConnectionException

使用VPC从lambda窥视时ConnectionException
EN

Stack Overflow用户
提问于 2021-12-17 20:26:29
回答 1查看 357关注 0票数 3

我在AWS帐户A上的VPC中有一个AWS lambda函数,它与包含DAX集群的AWS帐户B上的VPC有一个对等连接。当试图从lambda连接到DAX集群时,我得到了以下错误。

代码语言:javascript
复制
2021-12-17T17:29:34.096Z    279f4ed8-a6ea-4f50-b1d7-31c307cc3f30    ERROR   Failed to pull from my-cluster.v3fh7d.dax-clusters.us-east-1.amazonaws.com (11.0.225.143): TimeoutError: ConnectionException: Connection timeout after 10000ms
    at SocketTubePool.alloc (/var/task/node_modules/amazon-dax-client/src/Tube.js:244:64)
    at /var/task/node_modules/amazon-dax-client/generated-src/Operations.js:215:30 {
  time: 1639762164096,
  code: 'ConnectionException',
  retryable: true,
  requestId: null,
  statusCode: -1,
  _tubeInvalid: false,
  waitForRecoveryBeforeRetrying: false
}

我的lambda代码的相关部分就在这里。

代码语言:javascript
复制
let assumedRole;

const sts = new AWS.STS({ region: "us-east-1" });
const params = {
  RoleArn:
    "arn:aws:iam::<account-b>:role/role-to-access-dax",
  RoleSessionName: "testAssumeRoleSession" + Date.now().toString(),
  DurationSeconds: 3600,
};

try {
  assumedRole = await sts.assumeRole(params).promise();
} catch (error) {
  console.log("Failed getting sts assume role: " + error);
}

const dax = new AmazonDaxClient({
  endpoint:
    "dax://my-cluster.v3fh7d.dax-clusters.us-east-1.amazonaws.com",
  region: "us-east-1",
  accessKeyId: assumedRole.Credentials.AccessKeyId,
  secretAccessKey: assumedRole.Credentials.SecretAccessKey,
  sessionToken: assumedRole.Credentials.SessionToken,
  httpOptions: { timeout: 150000 },
  maxRetries: 1,
});

const dynamodb = new AWS.DynamoDB.DocumentClient({ service: dax });

try {
  const params = {
    Key: {
      userid: requestData.userid,
    },
    TableName: "my-users-table",
  };
  const result = await dynamodb.get(params).promise();

  if (result.Item == undefined || result.Item == null) {
    return createResponse(401, "Unauthorized");
  }
  return createResponse(200, JSON.stringify(result.Item));
} catch (error) {
  return createResponse(500, error);
}

角色arn:aws:iam::<account-b>:role/role-to-access-dax具有以下权限

代码语言:javascript
复制
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dax:GetItem",
                "dax:BatchGetItem",
                "dax:Query",
                "dax:Scan",
                "dax:PutItem",
                "dax:UpdateItem",
                "dax:DeleteItem",
                "dax:BatchWriteItem",
                "dax:ConditionCheckItem"
            ],
            "Resource": "arn:aws:dax:us-east-1:<account-b>:cache/my-cluster"
        }
    ]
}

以及接下来的信任关系。

代码语言:javascript
复制
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<account-a>:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

DAX集群具有策略AmazonDynamoDBFullAccess

窥视连接在AWS控制台中显示为Active

DAX群集的安全组有一个入站规则,允许端口8111上的TCP通信量来自源<account-a> / <sg-of-lambda>

帐户A的CIDR为10.0.0.0/24,帐户B的CIDR为11.0.0.0/16

Account a的主路由表有一个路由,将流量与目标11.0.0.0/16定向到对等连接。类似地,Account B的主路由表有一个路由,将具有目的地10.0.0.0/24的流量定向到对等连接。

顺便说一句,在lambda代码中的下列行似乎被忽略了,因为DAX请求上有相当多的重试,超时从10000 ms没有改变。

代码语言:javascript
复制
  httpOptions: { timeout: 150000 },
  maxRetries: 1,
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-11 21:03:59

我在AWS代表的帮助下解决了这个问题。结果,我需要一个包含lambda的VPC中的公共和私有子网。lambda本身必须在一个私有子网中,其中包含NAT网关和internet网关的公共子网。我需要两个子网的单独路由表,而不是VPC中的单个路由表。私有路由包含窥视连接路由和VPC CIDR路由,就像我在我的问题中提到的那样,但也包含以NAT网关为目标的目标0.0.0.0/0路由。公共子网路由表包含VPC路由和以internet网关为目标的目标0.0.0.0/0路由。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70398550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档