首页 > 解决方案 > CDK 中的 SQS 接口端点

问题描述

使用 AWS-CDK。我不得不移动我的 Lambda,它在 VPC 内写入 SQS。我添加了接口网关以允许从 VPC 直接连接到 SQS:

props.vpc.addInterfaceEndpoint('sqs-gateway', {
  service: InterfaceVpcEndpointAwsService.SQS,
  subnets: {
    subnetType: SubnetType.PRIVATE,
  },
})

Lambda 被部署到同一个 VPC(默认情况下到同一个私有子网),我将 QUEUE_URL 作为 env 参数传递,就像我在没有 VPC 时所做的那样:

const ingestLambda = new lambda.Function(this, 'TTPIngestFunction', {
      ...
  environment: {
    QUEUE_URL: queue.queueUrl,
  },
  vpc: props.vpc,
})

并且 Lambda 代码只需使用以下命令发送消息:

const sqs = new AWS.SQS({ region: process.env.AWS_REGION })

return sqs
  .sendMessageBatch({
    QueueUrl: process.env.QUEUE_URL as string,
    Entries: entries,
  })
  .promise()

没有 VPC,此发送工作,但现在 Lambda 只是超时发送 SQS 消息。我在这里想念什么?

标签: amazon-web-servicesamazon-sqsaws-cdk

解决方案


默认情况下,接口 VPC 终端节点会创建一个新的安全组,并且不会 自动允许来自 VPC CIDR 的流量。

如果您想允许来自 Lambda 的流量,您可以执行以下操作:

const sqsEndpoint = props.vpc.addInterfaceEndpoint('sqs-gateway', {
  service: InterfaceVpcEndpointAwsService.SQS,
});

sqsEndpoint.connections.allowDefaultPortFrom(ingestLambda);

或者,您可以允许所有流量:

sqsEndpoint.connections.allowDefaultPortFromAnyIpv4();

此默认行为目前正在https://github.com/aws/aws-cdk/pull/4938中讨论。


推荐阅读