AWS beanstalk PrivateLink 未连接

Posted

技术标签:

【中文标题】AWS beanstalk PrivateLink 未连接【英文标题】:AWS beanstalk PrivateLink not connecting 【发布时间】:2021-12-20 16:43:25 【问题描述】:

我有以下设置

单个 VPC 跨 2 个可用区的 2 个公共子网(包含 AWS Beanstalk 应用程序并公开一个 api) 跨 2 个可用区的 2 个私有子网(包含 Lambda 函数) 1 用于 Elastic beanstalk 的接口 VPC 端点(服务名称 com.amazonaws.us-east-2.elasticbeanstalk)

我不想为我的 lambda 函数创建 NAT 网关以便能够通过 Internet 访问 AWS Beanstalk 应用程序 API,而是想创建一个 VPC 端点,以便我可以从我的 lambda 函数访问 AWS 内部网络中的 aws beanstalk。

公共子网具有允许 Web 流量(端口 80/443)的安全组

VPC 终端节点与私有子网关联,其安全组允许 Web 流量(端口 80/443)。

lambda 函数还与私有子网相关联,其安全组允许 Web 流量通信(端口 80/443)。

DNS 解析和 DNS 主机名在 VPC 级别启用。

我复制了 Endpoint dns 名称以形成 lambda 函数正在调用的 url,我得到了一个超时

即使我尝试了上述所有步骤,AWS Lambda 仍无法访问 beanstalk 应用程序 api。

简化的 lambda 函数:

def lambda_handler(event, context):
    
    http = urllib3.PoolManager()
    r = http.request('GET', 'http://vpce-**********.elasticbeanstalk.us-east-2.vpce.amazonaws.com/')
    print(r.data)
    
    # TODO implement
    return 
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    

Elastic beanstalk 应用程序可通过 Internet 获取,地址为 http://sample-app-dev.******.us-east-2.elasticbeanstalk.com/

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

如果我理解正确,您设法创建了一个 VPC 终端节点,它可以让您访问 Elastic Beanstalk AWS 服务(您可以在其中对您的 EB 实例进行管理)。您没有公开使用 Elastic Beanstalk 部署的应用程序本身。

我这么说是因为为了从 VPC 公开您的 EB 应用程序,首先您必须创建一个连接到网络负载均衡器的 Endpoint Service。 EB 应用程序需要注册为此负载均衡器的目标(如果您有Application Load Balancer for EB,这很容易)。 这将为您提供服务名称,您可以从中在另一个 VPC(消费者 VPC)中创建一个 Endpoint,您可以在其中按名称找到该服务:

如果您找到您的服务,您可以将 Endpoint 放置到您可以连接的消费者 VPC 中。

尽管如此,如果您的两个 VPC 都在同一个 AWS 账户中,那么通过 PrivateLink 公开服务可能会有点过头了。可能VPC peering 就足够了。

更新 - PrivateLink 设置的简短教程:

    在部署您的 EB 应用程序的 VPC 中创建一个网络负载均衡器。这将要求您创建一个目标组,因此请打开链接以创建一个。

    为负载均衡器的目标组创建一个新的并选择应用程序负载均衡器。

    将负载均衡器从 EB 应用程序注册到目标组。

    确保选择之前为网络负载平衡器创建的目标组。

    等待负载平衡器配置。它应该处于active 状态。

    转到VPC -> Endpoint Service 并创建一个新的Endpoint Service (PrivateLink)。您必须在此处提供负载均衡器的名称:

    获取端点服务名称:

    转到Endpoints 并搜索端点名称:

    Endpoint 附加一个安全组,允许来自 VPC 的 HTTP/HTTPS 入站流量:

    创建Endpoints:

这可能需要接受,因此请返回Endpoint Service 并接受请求。

这也应该从pendingavailable

    此时您应该能够使用 DNS 从Endpoint 访问 EB 应用程序。

【讨论】:

我有一个带有应用程序负载均衡器的 EB 应用程序。我是否需要创建一个网络负载均衡器,或者如果您可以扩展您的解释或指向我的教程会很棒 我设法创建了一个将 EB 应用程序负载均衡器注册为目标的网络负载均衡器。我找不到服务名称 我已经更新了答案。 @user2650277 管理我的意思是使用aws clieb cli。如果您没有 Internet 连接到 VPC,并且由于某种原因想要使用 Elastic Beanstalk API,您可以为com.amazonaws.us-east-2.elasticbeanstalk 放置一个端点。 DynamoDB 是一项公共服务,它并不存在于您的 VPC 中。如果您无法访问 Internet,或者您不希望您的流量通过公共 Internet,则您需要一个端点。其他公共服务有 S3、SNS、SQS、CloudWatch 等。

以上是关于AWS beanstalk PrivateLink 未连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在中国区域的AWS beanstalk实例上部署美国区域的AWS beanstalk实例

AWS Beanstalk 跨多个 AWS 账户部署

HTTPS Elastic Beanstalk (AWS) 到 Android

AWS Beanstalk 和 IPset

无法延长 AWS 中 beanstalk 的超时时间

拒绝 aws_beanstalk/ubuntu 的请求访问