0

TL/DR

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

POC 目标

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

免责声明

我在这里只说我正在学习的内容,任何更正将不胜感激。

关于网络

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

Lambda 也有类似的情况,网络接口让 Lambda 可以访问子网。但是要调用这个 lambda,由于调用端点位于我们的子网之外,因此需要创建一个 VPC 端点,以在子网内公开 lambda 端点。

另一种选择是授予代理公共访问权限(创建公共 nat),以便代理可以访问公共 lambda 端点。 在此处输入图像描述

问题

只是它不适用于 VPC 端点选项(它适用于公共 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)永远无法完成配置。

4

1 回答 1

0

正如@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

于 2022-02-28T13:08:36.827 回答