亚马逊AWS官方博客

使用应用程序负载均衡器在私有子网内安全访问 Amazon EMR Web 接口

Original URL: https://aws.amazon.com/cn/blogs/big-data/access-web-interfaces-securely-on-amazon-emr-launched-in-a-private-subnet-using-an-application-load-balancer/

 

Amazon EMR Web接口托管在EMR集群的主节点之上。在私有子网中启动EMR集群时,EMR主节点不会有公共的DNS记录。私有子网中的这些web接口很难从子网外部访问。您可以使用应用程序负载均衡器(ALB)作为HTTPS代理,从而通过互联网访问EMR Web接口,而不需要使用堡垒机创建SSH隧道的方式。这种方法将极大简化对EMR Web接口的访问。

本文概述了如何使用应用程序负载均衡器通过互联网安全访问私有子网中EMR集群的Web接口。

解决方案概述

除非存在以下条件之一,否则VPC子网内启动的各节点将无法与子网外部进行通信:

  • 在当前子网与同一VPC内的其他子网间拥有网络路由。
  • 和其他VPC中的子网之间建立VPC对等连接。
  • 通过AWS Direct Connect建立接入当前子网的路由。
  • 指向Internet Gateway的路由。
  • 通过VPN连接指向当前子网的路由。

如果需要对EMR集群保证最高安全级别,则应将集群放置在子网当中,同时尽可能减少指向该集群的路由。但这种方式也会令访问私有子网内启动的EMR集群主节点上的Web接口变得更加困难。

该解决方案使用了一个面向互联网的应用程序负载均衡器(ALB),由其作为EMR主节点上Web接口的HTTPS代理。应用程序负载均衡器(ALB)在HTTPS端口上侦听传入Web接口的访问请求,并将请求路由到所配置的ALB目标,该目标指向EMR主节点上Web接口。

下图显示了客户端如何通过Amazon Route 53与ALB,从而访问到私有子网内EMR主节点上的Web接口。

端点的安全保护

本文概述的解决方案将使用ALB上的入站安全组进行限制,只允许一个范围内的客户端IP地址访问EMR的Web接口。您可以使用LDAP或SSO等用户身份验证机制,从而进一步保护通过ALB进行访问的端点。关于Jupyter身份验证方法的更多详细信息,请参阅 Adding Jupyter Notebook Users and Administrators。关于Hue的更多详细信息,请参阅Configure Hue for LDAP Users。关于Hive的更多详细信息,请参阅User and Group Filter Support with LDAP Atn Provider in HiveServer2

此外,最好启用ALB的访问日志。关于ALB访问日志的详细信息,请参阅Access Logs for Your Application Load Balancer

解决方案演练

当客户端访问EMR Wb接口时,整个过程包含以下一系列步骤:

  • 客户端从Web浏览器向EMR Web接口提交一个访问请求(例如YARN Node Manager)。
  • Route 53使用注册域example.com的托管区域example.com中的sample-emr-web记录集来解析HTTPS请求。Route 53将请求URL解析为ALB的IP地址,而后将该请求路由至ALB。
  • ALB在其HTTPS侦听器上接收到对EMR Web接口的请求,并将其转发至在负载均衡器目标组中配置的Web接口端点处。这里需要创建多个HTTPS侦听器与负载均衡器目标的配对,每个配对可以对应一个EMR Web接口端点。
  • 通过ALB入站安全组来控制哪些其他VPC或企业网络能够访问ALB。
  • 通过EMR主节点上的入站安全组来允许来自ALB的入站流量。

这套解决方案中的 AWS CloudFormation 模板将创建以下AWS对象:

  • 一个ALB。
  • 一组HTTPS侦听器和目标的配对,每个配对对应一个EMR Web应用程序。其支持Gangllia、YARN Resource Manager、JupyterHub、Livy以及Hue。您可以修改这套CloudFormation的栈,为其他EMR Web应用程序添加ALB HTTPS侦听器与目标的配对。以下AWS CloudFormation代码示例展示了ALB、HTTPS侦听器以及负载均衡器目标的代码:
    # EMR ALB Resources
      # ALB, Target Groups, Listeners and R53 RecordSet
      SampleEmrApplicationLoadBalancer:
        Type: AWS::ElasticLoadBalancingV2::LoadBalancer
        Properties:
          IpAddressType: ipv4
          Name: sample-emr-alb
          Scheme: internet-facing
          SecurityGroups:
            - !Ref AlbIngressSecurityGroup
    
          Subnets:
            - !Ref ElbSubnet1
            - !Ref ElbSubnet2
          LoadBalancerAttributes:
            -
              Key: deletion_protection.enabled
              Value: false
          Tags:
            -
              Key: businessunit
              Value: heloc
            -
              Key: environment
              Value: !Ref EnvironmentName
            -
              Key: name
              Value: sample-emr-alb
    
      ALBHttpGangliaTargetGroup:
        Type: 'AWS::ElasticLoadBalancingV2::TargetGroup'
        Properties:
          HealthCheckIntervalSeconds: 30
          HealthCheckTimeoutSeconds: 5
          HealthyThresholdCount: 3
          UnhealthyThresholdCount: 5
          HealthCheckPath: '/ganglia'
          Matcher:
            HttpCode: 200-399
          Name: sample-emr-ganglia-tgt
          Port: 80
          Protocol: HTTP
          VpcId: !Ref VpcID
          TargetType: instance
          Targets:
           - Id: !Ref EMRMasterEC2NodeId
             Port: 80
          Tags:
            -
              Key: Name
              Value: sample-emr-ganglia-tgt
            -
              Key: LoadBalancer
              Value: !Ref SampleEmrApplicationLoadBalancer
    
      ALBHttpsGangliaListener:
        Type: 'AWS::ElasticLoadBalancingV2::Listener'
        Properties:
          DefaultActions:
            - Type: forward
              TargetGroupArn: !Ref ALBHttpGangliaTargetGroup
          LoadBalancerArn: !Ref SampleEmrApplicationLoadBalancer
          Certificates:
            - CertificateArn: !Ref SSLCertificateArn
          Port: 443
          Protocol: HTTPS
  • 为注册域(example.com)设置的托管区域(example.com)中的AWS::Route53::RecordSet对象(sample-emr-web)。该托管区域与记录集的名称都将作为CloudFormation模板中的参数。
  • 附加至ALB的入站安全组,用于控制哪些CIDR段能够访问该ALB。您可以修改模板,根据实际要求来自定义安全组。

关于更多详细信息和这套CloudFormation栈的下载,请参阅GitHub repo

先决条件

要完成本次演练,您需要做好以下准备:

  • 拥有一个AWS账户。
  • 一个具有私有及公共子网的VPC。该VPC至少覆盖两个可用区ALB,并且每个可用区都包含一个公共子网。关于创建包含私有与公共子网的VPC的示例代码,请参阅GitHub repo
  • 在启动EMR集群时,应选择安装Ganglia、Livy、Jupyter以及Hue等Web应用程序。
  • 在Route 53中为您的域名建立一个托管区域的记录。如果您还没有一个域名,可以在Route 53中注册一个新的域名。注册新域会产生不可退还的费用。关于更多详细信息,请参阅Amazon Route 53计费说明
  • 一个公共证书用于访问该域名的HTTPS端点。如果您还没有公共证书,可以申请一个公共证书

创建一个ALB作为HTTPS代理

要在EMR集群之前创建一个作为HTTPS代理的ALB,您应首先启动CloudFormation栈。

  • 登录您的AWS账户
  • 选择您要运行EMR集群的区域。
  • 要启动您的CloudFormation栈,请选择Launch Stack
  • 输入您的参数值,并按照屏幕提示创建新栈。

以下截屏所示,为栈的各项参数示例。

  • 修改EMR主节点的安全组,允许来自ALB的入站流量。
  • 创建一项自定义TCP规则,端口范围为80至65535。
  • 为ALB创建和添加一个安全组。

通过以下步骤,您将向该安全组内添加一条入站规则。

  • 选定此EMR主节点的安全组。
  • 在EMR集群的Summary选项卡中选择Security group for master以打开该安全组。
  • 选择Edit inbound rules
  • 选择Add Rule
  • 添加一个端口范围,并选择ALB安全组作为源安全组。
  • 选择 Save rules
  • 在您的浏览器中测试以下EMR Web接口:
      • Ganglia – https://sample-emr-web.[web domain]/ganglia/
      • YARN Resource Manager – https://sample-emr-web.[web domain]:8088/cluster
      • JupyterHub – https://sample-emr-web.[web domain]:9443/hub/login
      • Hue – https://sample-emr-web.[web domain]:8888/hue/accounts/login
      • Livy – https://sample-emr-web.[web domain]:8998/ui

如果无法从Web接口端点处收到响应,请断开当前VPN连接再次进行测试。某些组织可能阻止端口80之外的任何其他端口上的对外Web请求。

有时候,将Route 53 DNS记录的更新传播至DNS服务器全球网络的时间,可能要比正常情况下的时间花费更长。如果您无法从EMR Web接口处获得响应,请在CloudFormation栈创建完成后等待一、两分钟,然后再进行测试。

您可以在CloudFormation模板中添加代码,从而使其支持其他EMR Web接口端点。关于更多详细信息,请参阅View Web Interfaces Hosted on Amazon EMR Clusters

从AWS Certificate Manager中查找公共证书的ARN

您可以从ACM控制台上的AWS Certificate Manager (ACM) 处找到公共证书的ARN。具体方法为:展开特定证书的域名,并在Details部分找到其ARN。

通过Route 53创建一个托管区域

要通过Route 53创建一个托管区域,请完成以下操作步骤:

  • 在Route 53控制台上,选择 Hosted zones
  • 选择您域名中的托管区域。
  • Hosted Zone Details 部分,复制相应的 Domain Name
  • R53 Hosted Zone AWS CloudFormation参数框中输入该域名。

费用明细

下面的AWS Cost Explorer报告显示了一个示例的总成本,以及在完成本演练中按服务细分的成本。该费用包括了一个在练习开始时创建的最小EMR集群,其中没有存储任何数据,以及其他由CloudFormation模板创建的资源。

资源清理

为了避免产生不必要的费用,请删除CloudFormation栈以清理所有对应资源。

总结

现在,大家可以将应用程序负载均衡器(ALB)作为HTTPS代理使用,通过互联网访问EMR Web接口。通过这种方式,避免了使用堡垒机创建SSH隧道。这种方法极大简化了对EMR Web接口的访问。

 

本篇作者

Hitesh Parikh

AWS公司云架构师。Hitesh热衷于同客户一起合作,推动上云项目,并在AWS上构建起多套创新型现代云原生数字解决方案。在工作之余,他喜欢陪伴家人、旅游、观看电影以及参与社区服务。

James Sun

AWS公司高级解决方案架构师。James在信息技术领域拥有超过15年的丰富从业经验。在加入AWS之前,他曾在MapR、HP、NetApp、Yahoo以及EMC等多家企业担任过高级技术职位。他拥有斯坦福大学博士学位。