Amazon Web Services ブログ

Application Load Balancer を使用して、プライベートサブネット内で起動された Amazon EMR 上のインターフェイスにセキュアにアクセスする

Amazon EMR ウェブインターフェイスは、EMR クラスターのマスターノードにホストされています。EMR クラスターをプライベートサブネット内で起動した場合、EMR マスターノードはパブリック DNS レコードを保持しません。プライベートサブネット内にホストされたウェブインターフェースは、サブネット外には簡単にアクセスできません。Application Load Balancer (ALB) を HTTPS プロキシとして使用すると、Bastion ホストを介した SSH トンネリングを行うことなく、インターネット上の EMR ウェブインターフェイスにアクセスすることが可能です。このアプローチにより、 EMR ウェブインターフェイスへのアクセスが大いに簡素化されます。

この投稿では、EMR クラスターをプライベートサブネット内で起動した場合に、ALB を使用してどのようにインターネット上の EMR ウェブインターフェースへセキュアなアクセスをするのかを概説します。

ソリューションの概要

VPC サブネット内に起動されたノードは、以下のいずれかが存在しない限り、そのサブネットから外部への通信はできません。

  • VPC 内で、そのサブネットから他のサブネットへのネットワークルート
  • VPC Peering による VPC サブネットへのルート
  • AWS Direct Connect を介したサブネットへのルート
  • インターネットゲートウェイへのルート
  • VPN 接続からサブネットへのルート

最高レベルのセキュリティを EMR クラスターに求める場合は、クラスターへの最小数のルートを持つサブネットにクラスターを配置する必要があります。これにより、プライベートサブネット内で起動された EMR クラスターのマスターノード上で動作しているウェブインターフェースへのアクセスがさらに難しくなります。

このソリューションでは、 EMR マスターノード上のウェブインターフェースエンドポイントへの HTTPS プロキシとして機能するインターネット向けの ALB を使用しています。ALBは、HTTPSポートで着信ウェブインターフェイスアクセスリクエストをリッスンし、EMR マスターノードの ウェブインターフェイスのエンドポイントを指す設定済みの ALB ターゲットにリクエストをルーティングします。

下図は、プライベートサブネット内の EMR マスターノードで実行されているウェブインターフェイスにアクセスするための、Amazon Route 53 と ALB を介したクライアントから EMR マスターノードへのネットワークフローを示しています。

エンドポイントの確保

この投稿で概説するソリューションは、ALB 上の受信セキュリティグループを使用して、幅広いクライアント IP アドレスが EMR ウェブインターフェースへアクセスするこのを制限します。LDAP や SSO などのユーザー認証メカニズムを備えることで、ALB を使用して到達可能なエンドポイントをさらにセキュアにする必要があります。Jupyter 認証方法に関する詳細は、Jupyter ノートブックユーザーおよび認証の追加をご覧ください。Hue に関する詳細は、LDAP ユーザーのためにのHue の設定をご覧ください。Hive に関する詳細は、「User and Group Filter Support with LDAP Atn Provider in HiveServer2 」 をご覧ください。

また、ALB を介してアクセスログを有効にすると良いでしょう。ALB アクセスログに関する詳細は、「Application Load Balancer のアクセスログ」をご覧ください。

ソリューションのウォークスルー

クライアントが EMR ウェブインターフェースへアクセスすると、そのプロセスには以下の一連のステップを含みます。

  • クライアントが、ウェブブラウザから EMR ウェブインターフェースリクエストを送信する (例えば、YARN Node Manager)。
  • Route 53 は、登録済みドメイン example.com のホストゾーン example.com のレコードセット名 sample-emr-web を使用して HTTPS リクエストを解決する。Route 53 が ALB の IP アドレスへのリクエスト URL を解決し、リクエストを ALB へルーティングする。
  • ALB は HTTPS リスナー上の EMR ウェブインターフェースリクエストを受信し、それをロードバランサ―ターゲットグループに設定されたウェブインターフェースエンドポイントへ転送する。複数の HTTPS リスナーとロードバランサーターゲットグループのペアが作成される。各 EMR ウェブインターフェースエンドポイントに対して 1 ペアが対応する。
  • ALB 受信セキュリティグループは、他のどの VPC または社内ネットワークが ALB にアクセスできるように制御する。
  • マスターノード上の EMR 受信セキュリティグループは、ALB からのインバウンドトラフィックを EMR マスターノードへ接続させる。

このソリューション用の AWS CloudFormation テンプレートは、ソリューションスタック内に以下の AWS オブジェクトを作成します。

  • ALB
  • 各 EMR ウェブアプリケーションに1ペアずつの HTTPS リスナーおよびターゲットペア。これは、Ganglia、YARN Resource Manager、JupyterHub、Livy および Hue EMR ウェブアプリケーションをサポートします。CloudFormation スタックを変更して、その他すべての EMR ウェブアプリケーション用に 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 VpclD
          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
  • 指定された登録ドメイン (exmaple.com) 用の、ホストゾーン (example.com) 内の AWS::Route53::RecordSet オブジェクト (sample-emr-web)ホストゾーンとレコードセット名は、CloudFormation テンプレート上のパラメータです。
  • どの CIDR ブロックが ALB にアクセスできるか制御する、ALB にアタッチされた受信セキュリティグループ。テンプレートを変更して、要件を満たすためにセキュリティグループをカスタマイズできます。

詳細および CloudFormation スタックをダウンロードするには、GitHub repo をご覧ください。

前提条件

このウォークスルーに従うためには、下記の事項が必要です。

  • AWS アカウント
  • プライベートおよびパブリックサブネットを持つ VPCALB は、各アベイラビリティ―ゾーンに1つのパブリックサブネットを持つアベイラビリティ―ゾーンを2つ以上要求します。プライベートおよびパブリックサブネットを持つベーシックな VPC を作成するためのサンプルコードについて、GitHub repo をご覧ください。
  • プライベートサブネット内で起動された EMR クラスター。
  • EMR クラスターが起動された時にそのクラスター上にインストールされる、Ganglia、Livy、Jupyter、Hue などのウェブアプリケーション。
  • ドメイン用の Route 53 におけるホストゾーンエントリ。ドメインをお持ちでない場合、Route 53 に新規登録できます。新規ドメインの登録に関連して、返金不可の費用がかかります。詳細については、「Amazon Route 53 料金設定」をご覧ください。
  • ドメイン内の HTTPS エンドポイントにアクセスするための公開証明書。お持ちでない場合は、公開証明書をリクエストできます。

ALB を HTTPS プロキシとして作成

ALB を HTTPS プロキシとして EMR クラスターの前に作成する為には、まず CloudFormation を起動します。

  1. ご自分の AWS アカウントにログインする。
  2. EMR クラスターを実行しているリージョンを選択する。
  3. Launch Stack を選択し、CloudFormation スタックを起動する。

  4. パラメータ値を入力し、画面上のプロンプトに従いスタックを作成する。

以下のスクリーンショットはスタックパラメータ例を示しています。

  1. EMR マスターノードセキュリティグループを変更し、ALB からの受信トラフィックを許可する。
  2. ポート範囲 80–65535 でカスタム TCP ルールを作成する。
  3. ALB にアタッチしたソースセキュリティグループを追加する。

以下のステップでは、セキュリティグループにインバウンドルールを追加します。

  1. EMR マスターノードセキュリティグループを選択する。
  2. EMR クラスターの [サマリー] タブ上の [マスター用セキュリティグループ] を選択し、セキュリティグループを開く

  1. [インバウンドルールの編集]を選択する

  1. [ルールの追加] を選択する

  1. ポート範囲を追加し、ALB セキュリティグループをソースセキュリティグループとして選択する。
  2. [ルールの保存]を選択する。

  1. 以下の EMR ウェブインターフェースをご自分のブラウザでテストする
    1. Gangliahttps://sample-emr-web.[web domain]/ganglia/
    2. YARN Resource Managerhttps://sample-emr-web.[web domain]:8088/cluster
    3. JupyterHubhttps://sample-emr-web.[web domain]:9443/hub/login
    4. Huehttps://sample-emr-web.[web domain]:8888/hue/accounts/login
    5. Livyhttps://sample-emr-web.[web domain]:8998/ui

ウェブインターフェースエンドポイントから応答がない場合、VPN 接続を切断して、テストします。組織よっては、80 以外のポートで送信ウェブリクエストをブロックする場合があります。

世界中の DNS サーバーネットワークへの Route 53 DNS レコードの更新の伝達は、通常の条件下よりも時間がかかる場合もあります。EMR ウェブインターフェースからの応答がない場合、CloudFormation スタック作成後、数分待ってからテストします。

コードを追加して、CloudFormation テンプレートで、他の EMR ウェブインターフェースエンドポイントをサポートすることができます。これの詳細については、「Amazon EMR クラスターでホストされているウェブサイトの表示」をご覧ください。

AWS Certificate Manager からの公開証明書 ARN の配置

ACM コンソール上で AWS Certificate Manager (ACM) からの公開証明書 ARN を確認できると思います。特定の証明書用にドメインを拡張する場合は、ARN を [詳細] セクションに配置して下さい。

Route 53 からのホストゾーンの作成

Route 53 からホストゾーンを作成するには、以下のステップを完了してください。

  1. Route 53 コンソール上で ホストゾーンを選択する。
  2. ご自分のドメインのホストゾーンを選択する。
  3. [ホストゾーンの詳細] セクションでドメイン名用のエントリをコピーする。

  1. R53 ホストゾーンのAWS CloudFormation パラメータボックスにドメイン名を入力する。

コストの内訳

以下の AWS Cost Explorer レポート表は、合計コストと、このウォークスルーの完了に要する時間に対するサービス別コスト内訳の例を示しています。このコストには、演習の開始時点で何もデータを保存せずに作成した最小限の EMR クラスターにかかるコストや、 CloudFormation テンプレートが作成するその他のリソースにかかるコストが含まれます。

クリーンアップ

将来料金が発生しないように、CloudFormation スタックを削除して、作成したリソースを全て消去しましょう。。

まとめ

これで、ALB を HTTPS プロキシとして作成し、SSH トンネリング用の Bastion ホストを要すことなく、インターネット上の EMR ウェブインターフェースに安全にアクセスできるようになりました。プライベートサブネット内で起動された EMR 用の EMR ウェブインターフェースへのセキュアなアクセスを簡素化できます。

 


著者について

Hitesh Parikh は AWS のクラウドアーキテクトです。 クラウド導入の過程において、顧客と連携しながら AWS 上に革新的かつモダンなクラウドネイティブなデジタルソリューションを構築することに情熱を注いでいます。仕事以外では、家族と過ごすこと、旅行、映画鑑賞、そして社会奉仕活動が趣味です。

 

 

 

James Sun は、アマゾン ウェブ サービスのシニアソリューションアーキテクトです。 インフォメーションテクノロジーにおいて 15 年以上の経験があります。AWS の前には、MapR、HP、NetApp、Yahoo および EMC でいくつかのシニアテクニカル職に就いていました。スタンフォード大学で PhD を取得。