MediaLiveのVPC OutputでElastic IPを使ってVPCの外へ通信してみた

AWS Elemental MediaLiveのVPC OutputでElastic IPを割り当てインターネット経由の通信をしつつ、プライベートIPを使った通信をしてみました。パブリックIPは自動で割り当てられない点にも注意しましょう。
2021.02.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

清水です。先日アップデートされたAWS Elemental MediaLiveのVPC Output機能、これまでにEC2へのプライベートIPでの出力とVPC エンドポイント経由でのS3への出力を確認してきました。

本エントリではさらに、MediaLiveのVPC OutputでパブリックIPを使った出力を確認してみたいと思います。具体的にはVPC Output設定時にElastic IPを指定します。このパブリックIP(Elastic IP)を使ってのS3への書き込み(VPCエンドポイント経由ではない)をしつつ、VPC内部には引き続きプライベートIPでアクセスできていることを確認してみます。

MediaLiveのVPC Outputでは自動でパブリックIPは割り当てられない

まずはMediaLiveのVPC OutputでパブリックIPを使用する際の注意点、というか私が個人的に思い込みで勘違いをしていた点を挙げておきます。MeidaLiveのVPC Outputですが、設定時に指定するサブネットの設定でAuto-assign public IPv4 addressYesに設定されている状況でも、Elastic IPの設定は必須です。Elastic IPではないパブリックIPは自動で割り当てられません。私は当初、EC2インスタンスのようにVPC Output設定時のElastic IPを指定しなくてもサブネット設定でパブリックIPが割り当てられるのかな、と考えていたのですが、そうではありませんでした。

具体的に確認していきましょう。以下のような構成を想定します。(なお検証目的ということで、本エントリで扱うMediaLiveのChannel classはいずれもSINGLE_PIPELINEとしています。)MediaLiveのInputは非VPC設定で、OutputのみVPC設定とします。この際、Outputはパブリックサブネットに設定する想定です。またS3のVPCエンドポイントは準備せず、S3へのアクセスはインターネットゲートウェイを介して行います。

パブリックサブネットの設定を確認します。Auto-assign public IPv4 addressYesに設定しています。

EC2インスタンスの起動画面では、以下のようにパブリックIPが自動でアサインされる状態です。

またルートテーブルは以下のように、0.0.0.0/0をインターネットゲートウェイに向けています。

MediaLiveのVPC Outputに設定する想定のセキュリティグループは以下です。Inboundは設定なし、Outboundは制限なしのデフォルト状態になります。

この状況下で、MediaLiveのVPC Outputを設定していきます。あえてElastic IPは指定しないで進めてみます。

Channel作成後、DestinationsタブのEgress endpointsを確認してみましょう。プライベートIPのみでパブリックIPについての記載はありませんね。

EC2のマネジメントコンソールでNetwork interfacesの項目も確認してみましょう。パブリックIPアドレスは割り当てられていません。

パブリックIPアドレスが割り当てられていない状況のため、当然ながらインターネット向け通信はできません。アーカイブ出力を使ってS3への書き込みをしようとしてもエラーとなってしまいました。

Elastic IPをMediaLiveのVPC Outputに関連付けてみる

ということで改めて、VPC Output作成時にElastic IPを指定して設定を進めていきます。構成図も改めておきましょう、以下のような想定です。

あらかじめ、EC2のマネジメントコンソールからElastic IPを割り当てておきます。

続いて新たにElastic IPと関連付けるMediaLiveのVPC Outputの設定です。今回はChannelを作りなおすことで行いました。既存のVPC Outputを設定したChannelをIdle状態のときに編集しようとしてもマネジメントコンソールからでは設定がグレーアウトされており、編集ができなかったためです。

以下のようにOutput deliveryの項目を設定します。EIPs for endpointsの箇所で先ほど割り当てておいたElastic IPをそのID(eipalloc-XXXX)とパブリックIPアドレスなどから判断、指定します。

OutputとしてはS3バケットへのアーカイブ出力のほか、HLS出力をプライベートサブネットにあるEC2にWebDAVで書き込みます。前者はパブリックIPを使った通信、後者はプライベートIPを使った通信になりますね。プライベートサブネットのEC2で稼働しているWebDAVはこちらのエントリに記載の手順で準備しました。(以下スクリーンショット中、Output groups内でのアーカイブ出力とHLS出力の順序がテレコになっていますのでご注意ください。)

Channel作成後、DestinationsタブのEgress endpointsの項目を確認してみます。先ほど作成したElastic IPのアドレスがSouce IPに記載されていることが確認できます。

EC2のマネジメントコンソール、Network interfacesの項目でも該当するENIを確認してみます。こちらではパブリックIP(Elastic IP)のほか、プライベートIPアドレスも確認することができます。

Elastic IPsの画面も確認しておきましょう。MediaLiveのVPC Outputで作成されるENIに関連付けられている状況が確認できます。

実際にMediaLiveのChannelをStart、映像を打ち上げて書き込みを確認してみます。まずはすぐに確認ができる、プライベートIPを使った通信先のWebDAV on EC2です。hlsから始まるファイルが該当しますが、きちんと書き込まれていますね。

[ec2-user@ip-10-100-201-68 ~]$ ls -l /var/www/data/
合計 24468
-rw-rw-r-- 1 nobody nobody     200  2月 22 12:18 hls.m3u8
-rw-rw-r-- 1 nobody nobody     383  2月 22 12:19 hls_720p30.m3u8
-rw-rw-r-- 1 nobody nobody 2732392  2月 22 12:18 hls_720p30_00001.ts
-rw-rw-r-- 1 nobody nobody 2470884  2月 22 12:18 hls_720p30_00002.ts
-rw-rw-r-- 1 nobody nobody 2467688  2月 22 12:18 hls_720p30_00003.ts
-rw-rw-r-- 1 nobody nobody 2480096  2月 22 12:18 hls_720p30_00004.ts
-rw-rw-r-- 1 nobody nobody 2475960  2月 22 12:18 hls_720p30_00005.ts
-rw-rw-r-- 1 nobody nobody 2478028  2月 22 12:18 hls_720p30_00006.ts
-rw-rw-r-- 1 nobody nobody 2487428  2月 22 12:18 hls_720p30_00007.ts
-rw-rw-r-- 1 nobody nobody 2477276  2月 22 12:18 hls_720p30_00008.ts
-rw-rw-r-- 1 nobody nobody 2481788  2月 22 12:18 hls_720p30_00009.ts
-rw-rw-r-- 1 nobody nobody 2472388  2月 22 12:19 hls_720p30_00010.ts
-rw-rw-r-- 1 nobody nobody      13  2月 22 10:46 test.txt

続いてパブリックIPを使った通信となる、S3へのアーカイブ出力です。こちらも問題なく書き込みが行えています。

まとめ

AWS Elemental MediaLiveのVPC Output機能で設定時にElastic IPを指定してインターネット経由の通信をしつつ、プライベートIPアドレスを使って同一VPC内の通信も行えることを確認してみました。従来からある非VPCなOutputでも当然ながらインターネット経由の通信は可能でしたが、VPC Outputを使うことでプライベートIPでの通信も可能になることが利点と考えます。VPC内のネットワーク設計についてEC2などと同様に行えますね。ただし、EC2と異なり明示的にElastic IPを指定しないとパブリックなIPが割り当てられないことには注意しておきましょう。