【NLB to ALB】VPCエンドポイントからのアクセスを試してみた

記事タイトルとURLをコピーする

技術2課の大川です。

🏀JBA公認E級審判ライセンスを取得しました。

今回の投稿ではまずNetwork Load Balancer(以下、NLB)、Application Load Balancer(以下、ALB))、 EC2インスタンスで構成された簡易的なシステムを構築します。

それに対して他VPCからVPCエンドポイント経由でアクセスを試してみます。

今回の構成

今回の構成図です。

今回の構成

アクセス元(左)とアクセス先(右)の2つのVPCを用意します。 それに加えてサブネット/ルートテーブル/インターネットゲートウェイ/NATゲートウェイ/踏み台用EC2(bastion)なども用意しますが、それらの方法については割愛します。

以下、手順の番号は構成図にある赤枠で示した番号と紐づいています。

構築手順

1. ターゲットとなるEC2インスタンスの用意

まずアクセス先VPCの各プライベートサブネットに1台ずつAmazon Linux2でインスタンスを立てます。 Webサーバーとして今回はNGINXを使用しています。(お好みに合わせて)

今回の検証ではトップページが表示されれば良いだけなので、次の手順でサクッとインストール&起動&確認までを行います。

$ sudo amazon-linux-extras install nginx1 
$ sudo systemctl start nginx  
$ sudo systemctl enable nginx  
$ sudo systemctl status nginx

セキュリティグループは「default」をアタッチしています。

念のため踏み台インスタンスからcurlでアクセスして、レスポンスがあることを確認します。

$ curl 10.0.11.192 | head
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3520  100  3520    0     0   546k      0 --:--:-- --:--:-- --:--:--  572k
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <title>Test Page for the Nginx HTTP Server on Amazon Linux</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <style type="text/css">
            /*<![CDATA[*/
            body {
                background-color: #fff;

2. ALB用ターゲットグループの作成

後ほど構築するALBのターゲットとなるターゲットグループを構築します。 このターゲットグループには先ほど作成したEC2インスタンスを含めるため、「ターゲットグループ」は「インスタンス」で作成します。

ターゲットグループの作成

ターゲットタイプの選択

設定完了

3. ALBの作成

今回はサービスをインターネットに公開しないのでスキームは「インターネット向け」ではなく「内部」でALBを構築します。

スキームの指定

NLBとは違ってALBにはセキュリティグループをアタッチすることが可能です。それがここでのポイントとなります。

ここでは次の2つをアタッチしています。

  • default
    ALBがEC2(同じくセキュリティグループ「default」をアタッチ)へアクセスするため
  • プライベートサブネットからのアクセスを許可するセキュリティグループ
    後ほどプライベートサブネットに構築するNLBからのアクセスを許可するため

NLBはVPCエンドポイント経由でアクセスされる場合はソースNATを行います。 つまりALBはVPCエンドポイント経由のアクセスをNLBを送信元としたパケットとして受け取ります。 ただしNLBはALBとは違ってセキュリティグループをアタッチできないため、アドレス指定のセキュリティグループで許可してあげる必要があります。

「リスナーとルーティング」欄で、リスナーの「デフォルトアクション」として先ほど作成したターゲットグループを指定します。

デフォルトアクション

4. NLB用ターゲットグループの作成

NLBのターゲットとなるターゲットグループを用意します。 このターゲットグループには先ほど作成したALBを含めるため、ターゲットタイプを「Application Load Balancer」で作成します。 その上で先ほど作成したALBを含めるように作成していきます。

ターゲットタイプの選択

「ターゲットの登録」画面で先ほど作成したALBを指定します。

ターゲットの登録

5. NLBの作成

NLBもインターネットに公開しないのでスキームは「内部」で作成します。

スキームの指定

「リスナーとルーティング」欄でリスナーの「デフォルトアクション」の「転送先」として、先ほど作成したNLB用のターゲットグループを指定します。

デフォルトアクション

6. VPCエンドポイントサービスの作成

NLBを宛先とするVPCエンドポイントサービスを作成します。

エンドポイントサービスの作成

「ロードバランサーのタイプ」を「ネットワーク」とし、先に作成したNLB を選択します。

エンドポイントサービスの設定

「エンドポイントの承諾が必要」にチェックすることで、当VPCエンドポイントサービスへアクセスするためのVPCエンドポイント作成時には、「承諾」が必要になります。(手順は後述)

「承諾」の設定

作成すると次のように詳細を確認できます。 ここで表示されている「サービス名」は、VPCエンドポイントを作成する際にVPCエンドポイントサービスを指定する際のキーになるのでメモしておきます。

サービス名

7. (オプション)アクセスを許可するAWSアカウントをプリンシパルとして許可

他のAWSアカウントにVPCエンドポイントサービスへのアクセスを許可する場合は、VPCエンドポイントに「プリンシパル」を設定する必要があります。 ※同一アカウントからのアクセスでは不要

次のようにVPCエンドポイントサービスの「プリンシパルを許可」タブから設定します。

プリンシパルの許可

プリンシパルをARNで指定します。

プリンシパルの指定

8. VPCエンドポイントの作成

アクセス元のVPCにVPCエンドポイントサービスへアクセスするためのVPCエンドポイントを用意します。

VPCエンドポイントの作成

「エンドポイントの設定」欄で「その他のエンドポイントサービス」を指定します。 またVPCエンドポイントサービスの「サービス名」で先ほど作成したVPCエンドポイントサービスでメモした「サービス名」を入力します。

エンドポイントの設定

「サービスの検証」ボタンをクリックすると「サービス名が検証されました」と表示されることを確認します。

サービスの検証

ただしVPCエンドポイントサービスでは「承諾が必要」で作成したため、ここで作成したVPCエンドポイントはステータス「pendingAcceptance」で保留しています。 このままでは使用できません。

pendingAcceptance

使用するためには「VPCエンドポイントサービス」側で「エンドポイント接続リクエストの承諾」が必要になります。

リクエストの確認

「アクション」から「エンドポイント接続リクエストの承諾」を選択します。

エンドポイント接続リクエストの承諾

承諾されると無事にステータスが「Available」に遷移し、利用可能となります。

Availableへの遷移を確認

9. アクセス確認

それではアクセスを確認してみましょう。

VPCエンドポイントのFQDNは「DNS名」で確認することができます。VPCエンドポイントが正しく作成されていれば名前解決できるはずです。

VPCエンドポイントのDNS名

DNS名が複数ある理由はこちらのブログをご参考に。

blog.serverworks.co.jp

アクセス元のVPCにあるEC2インスタンスにsshでアクセスした後に、curlコマンドでVPCエンドポイントにhttpでGETしてみます。

$ curl vpce-00000000000000000-xxxxxxxx.vpce-svc-00000000000000000.ap-northeast-1.vpce.amazonaws.com | head 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current 
                                 Dload  Upload   Total   Spent    Left  Speed 
100  3520  100  3520    0     0   375k      0 --:--:-- --:--:-- --:--:--  381k 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xml:lang="en"> 
    <head> 
        <title>Test Page for the Nginx HTTP Server on Amazon Linux</title> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
        <style type="text/css"> 
            /*<![CDATA[*/ 
            body { 
                background-color: #fff;

無事にNGINXのテスト用トップページ(のhtml)にアクセスすることができました。

まとめ

NLB/ALB/EC2で構成されたシステムへVPCエンドポイント経由でアクセスしてみました。

VPCピアリングでも両VPC間の接続は可能ですが、互いのルーティングも気にする必要があります。 一方でVPCエンドポイント経由であれば、それぞれのVPC内のルーティングだけを考えるだけで良いので疎結合化できます。

今回の構成でも両VPCはCIDRをあえてバッティングさせて構築しましたが、問題なくアクセスすることができました。

本ブログがお役に立てれば幸いです。

参考リンク

aws.amazon.com

aws.amazon.com

大川 出(記事一覧)

クラウドインテグレーション2部 技術2課

IPA「システム監査」、「テクニカルエンジニア(ネットワーク)」

村民です。