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
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