クリスマスイブって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が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/C のpriavateサブネット ・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-1a のPrivateSubnetの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年度新卒入社しました。最近は自炊にはまっています。アパートのキッチンが狭くて困ってます。