【ハンズオン風】AWS PrivateLinkでUDPサービスを設定しよう

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

クリスマスイブって23日なのか24日なのか毎年迷います。
サーバーワークスアドベントカレンダー2024 12月23日の記事です! ぜひ、他の記事も見てみてください! qiita.com

概要

この記事では、「AWS Privatelinkを使用して、UDPで待ち受けるサービスを提供する方法」をハンズオン風に紹介します。

注意:
ハンズオン"風"であるのは、詳細な設定パラメータは省くためです。

【本記事でわかること】

  • PrivateLinkを用いたUDPサービスの提供方法

はじめに

こんにちは!CS部CS1課の圡井です。 最近は味噌キムチ鍋・味噌鍋・海鮮鍋を作りました。

10月にこのようなAWSアップデートが入りました。

アップデート記事 aws.amazon.com

リリースブログ aws.amazon.com

これまで、Network Load Balancer(NLB)自体は、UDPのフォワーディングを提供していましたが、PrivateLink経由では利用できませんでした。 このアップデートによって、PrivateLinkでUDPを利用したサービスに接続できるようになりました。

実際に設定してみたのでハンズオン風の記事にしたいと思います。

本編

前提となる構成図

以下のPrivateLink環境利用します。 詳細設定はコチラのブログをご参照ください。 blog.serverworks.co.jp

前提となるPrivateLink環境

ここから、PrivateLinkがUDPで通信を受け付けられるように設定していきます。 基本的に追加設定は サービス提供側のVPC で完結します。

VPCの設定を変更する

リリースブログには以下のような記載があります。

The NLB is dual stack, and has a UDP lister for the service. The service provider service target group must use IPv6.
(日本語訳) NLBはデュアルスタックで、サービス用にUDPリスナーが設定されている。サービスプロバイダーのサービスターゲットグループはIPv6を使用する必要がある。
※英文では "lister" とありますが、"listener" と解釈して訳しています。

そのためNLBをデュアルスタック仕様にする必要があります。 しかし、前提の構成ではIPv4のみを利用しているため、IPv6が利用できるようにVPCから設定を変更する必要があります。

リソース・サービス 設定・要点
VPC
(privatelink-B-vpc)
サービス提供側のVPCです。
IPv6を有効化します。
アクションCIDRの編集を押下します。
新しい IPv6 CIDR を追加ボタンより
IPv6 CIDR ブロック:Amazon 提供の IPv6 CIDR ブロック
ネットワークボーダーグループap-northeast-1
を選択します。
Subnet
(privatelink-B-subnet-***)
すべてのサブネット
サービス提供側のサブネットです。
VPCで取得したIPv6アドレスをサブネットに振り分けます。
アクションIPv6 CIDR の編集を押下します。
IPv6 CIDR ブロックボタンを押下し、/64区切りで各サブネットに設定します。

これにより、VPC内のリソースでIPv6が利用できるようになりました。

EC2の設定を変更する

IPv6通信を受け入れられるよう設定変更を行います。

リソース・サービス 設定・要点
EC2
(EC2-B)
サービス提供側のEC2です。
EC2にIPv6アドレスを付与します。
アクションIPアドレスの管理を押下します。
IPv6アドレス項目の新しいIPアドレスの割り当てを押下し、
プライマリIPv6 IPを割り当てるにチェックします。

UDPを受信できるようにする

また、通信検証のためにUDP通信をリッスンするためのツールをインストールします。 今回はnmap-netcatを利用してUDP通信をリッスンします。 既存のNLB(NLB-B)にてHTTP:80をヘルスチェックしているので、80番ポートをリッスンして動作チェックを行います。

EC2-BにSSMでログインします。 以下のコマンドを利用して、Webサービスインストール・起動します。

# nmap-netcatのインストール
sudo dnf install nc

# リッスンできているかテスト
# -l : リッスンモード -k : リッスンをキープ
# ELBからのヘルスチェックが届きます。
sudo nc -lk 80
> GET /index.html HTTP/1.1
  user-agent: ELB-HealthChecker/2.0
  host: 10.0.0.155:80
  connection: close
  accept: */*
  accept-encoding: *

> GET /index.html HTTP/1.1
  user-agent: ELB-HealthChecker/2.0
  host: 10.0.0.132:80
  connection: close
  accept: */*
  accept-encoding: *

NLBを構築する

新たにUDP接続用のNLBの構築を行います。 今回は、UDP:53535にてUDP通信を行います。

※TargetGroupはUDPに対してヘルスチェックを行えないため、HTTP:80を利用します。

リソース・サービス 設定・要点
Security Group
(NLB-B-UDP-sg)
NLB(NLB-B-UDP)のSGです。
・VPC:privatelink-B-vpc
Target Group
(NLB-B-UDP-tg)
NLBからEC2に接続するためのTGです。
・プロトコル:ポート:UDP:53535
・IPアドレスタイプ:IPv6
・VPC:privatelink-B-vpc
ヘルスチェック
・ヘルスチェックプロトコル:HTTP
・ヘルスチェックパス:/index.html
ヘルスチェックの詳細設定
・ヘルスチェックポート:上書き, 80
※UDPではヘルスチェックできないため、前提として設定したWebサーバ機能を利用します。

ターゲット:EC2-B
Network Load Balancer
(NLB-B-UDP)
PrivateLinkとしてサービスを提供するためのNLBです。
・スキーム:内部向け
・ロードバランサーのIPアドレスタイプ:Dualstack
・VPC:privatelink-B-vpc
・IPv6 ソース NAT のプレフィックスを有効にする:オン
・マッピング:Availability Zone-A/Cpriavateサブネット
・SG:NLB-B-UDP-sg
・プロトコル: ポート:UDP:53535
・TG:NLB-B-UDP-tg

構築完了後
セキュリティタブより編集ボタンを押下します。
PrivateLink トラフィックにインバウンドルールを適用する のチェックを外します。
NLBを選択しアクションロードバランサーの属性を編集を選択します。
ロードバランサーのターゲット選択ポリシー項目でクロスゾーン負荷分散を有効にするを選択します。

NLBからEC2への接続許可をする

NLB(NLB-B-UDP)からEC2(EC2-B)に通信するために、SG(EC2-B-sg)のインバウントルールを編集します。

リソース・サービス 設定・要点
Security Group
(EC2-B-sg)
EC2(EC2-B)のSGです。
・HTTP(TCP: 80)に対し、NLBのSG(NLB-B-UDP-sg)の通信を許可
・UDP(53535)に対し、NLBのSG(NLB-B-UDP-sg)の通信を許可

エンドポイントサービス / エンドポイントを構築する

UDPで通信するためのエンドポイントサービス/エンドポイントを構築します。

リソース・サービス 設定・要点
VPC Endpoint Service
(privatelink-B-UDP-vpces)
Privatelinkを構成するサービスです。
サービス提供側VPCに構築したNLB(NLB-B-UDP)をアタッチします。
サポートされいているIPアドレスタイプにはIPv4を設定します。

構築した後に、エンドポイントサービスを選択し、詳細タブよりサービス名を控えておきます。
(com.amazonaws.vpce.ap-northeast-1.vpce-svc-xxxxxx)

次に、接続口となるエンドポイントをサービス提供側VPCのEC2(EC2-A)が構築されたサブネットに構築します。

リソース・サービス 設定・要点
Security Group
(privatelink-A-UDP-vpce-sg)
VPC EndpointのSGです。
UDP(53535)に対し、EC2のSG(EC2-A-sg)の通信を許可します。
VPC Endpoint
(privatelink-A-UDP-vpce)
Privatelinkの入り口となるサービスです。
サービス利用VPCに構築されたEC2と同一のサブネットに配置します。
タイプNLB と GWLB を使用するエンドポイントサービス
サービス名には控えておいたサービス名を入力し、サービスの検証を押下します。
サブネットap-northeast-1aPrivateSubnetのIDを選択します。
セキュリティグループ:privatelink-A-UDP-vpce-sg

エンドポイントサービス側からの承諾も忘れずに行いましょう。

リソース・サービス 設定・要点
VPC Endpoint Service
(privatelink-B-UDP-vpces)
エンドポイント接続タブにて作成したエンドポイントがPending acceptanceとなっているので、
アクションエンドポイント接続リクエストの承諾を選択します。

実際に接続してみる

実際にUDP通信を受け取ることができるのか検証します。

EC2-BにSSMでログインし、以下のコマンドを用いてUDP:53535をリッスンします。

# UDP通信を53535ポートでリッスン
sudo nc -u -l 53535

# このまま置いておく

次にEC2-AにSSMでログインし、以下のコマンドを用いてUDP通信でメッセージを送信します。

# エンドポイントからIPv4アドレスを引けることを確認
dig <控えておいたエンドポイントDNS名>
> 10.0.0.xxx

# UDP通信でメッセージを送る
echo "Test message" | nc -u <控えておいたエンドポイントDNS名> 53535

最後にEC2-BにSSMでログインし、メッセージを確認します。

# 通信が届いていることを確認
sudo nc -u -l 53535
> Test message

無事にメッセージが届いていますね!

ncコマンドでは一度しか受け取ることができないので、2回目を送信したい場合は "ctrl + c" などで一度終了させてから、再度リッスンしましょう。

終わりに

PrivateLinkでUDP通信を利用できるアップデートを検証してみました。主にサービス提供側のVPCで完結するため、利用側に影響が少ないことが良いですね。 しかし、提供側ではIPv6の設定が必要なため、既存のVPCに適用する際はセキュリティグループ等通信許可の部分で見落とし忘れが無いように注意したいですね。

圡井一磨(執筆記事の一覧)

23年度新卒入社しました。最近は自炊にはまっています。アパートのキッチンが狭くて困ってます。