AWS Lambda-RabbitMQ 事件映射使用 VPC 端点

AWS Lambda-RabbitMQ event mapping usign VPC endpoints

TL/DR

尝试使用私有子网和 VPC 端点在 AmazonMQ (RabbitMQ) 队列上创建 Lambda 触发器。

POC 目标

我正在做这个 POC: 私有子网中的 AmazonMQ (RabbitMQ) 和由传入队列的消息触发的 Lambda。

免责声明

这里我要说的是我正在学习的内容,如有任何指正,我们将不胜感激。

联网

由于 Amazon MQ 是 AWS 托管的服务,因此它在自己的网络中运行。因此,当我们要求 AWS 将代理置于子网中时,会在子网中为该代理创建网络接口,从而为代理提供子网中的访问权限和可达性。

Lambda 也有类似的情况,网络接口为 lambda 提供了对子网的访问权限。但是要调用此 lambda,由于调用端点位于我们的子网之外,因此需要创建一个 VPC 端点来公开子网内的 lambda 端点。

另一种选择是授予代理 public 访问权限(创建 public nats),以便代理可以访问 public lambda 端点。

问题

只是它不适用于 VPC 端点选项(它适用于 public NAT)。

这是我使用的代码:https://gitlab.com/templates14/terraform-templates/-/tree/master/lambda_rabbitmq_trigger

如果您想测试,只需在此处更改 AWS 帐户即可:

# here using an AWS profile of my own, change it
provider "aws" {
  region                   = "us-east-1"
  profile                  = "myown-terraform"
}

分析

据我所知,代理和 lambda 的网络接口位于同一子网中,安全组正常(它们允许所需的流量),并且创建了 VPC 端点。但是事件映射(又名触发器,手动创建或使用 terraform)永远无法完成配置。

如@jarmod 所述(感谢),我错过了 STS 和 SecretsManager 的 VPC 端点。

基本上,解决方案是可以的,但必须添加:

resource "aws_vpc_endpoint" "sts_endpoint" {
  vpc_id            = module.red.vpc_id
  service_name      = "com.amazonaws.${ var.region }.sts"
  vpc_endpoint_type = "Interface"
  subnet_ids = [module.red.private_subnets[0]]
  security_group_ids = [ aws_security_group.sg-endpoint.id ]
  private_dns_enabled = true
}
resource "aws_vpc_endpoint" "secretsmanager_endpoint" {
  vpc_id            = module.red.vpc_id
  service_name      = "com.amazonaws.${ var.region }.secretsmanager"
  vpc_endpoint_type = "Interface"
  subnet_ids = [module.red.private_subnets[0]]
  security_group_ids = [ aws_security_group.sg-endpoint.id ]
  private_dns_enabled = true
}

这是最终图表:

如果你想玩的话,这里是代码:https://gitlab.com/templates14/terraform-templates/-/tree/master/lambda_rabbitmq_trigger