Amazon Web Services ブログ

Amazon VPC と接続可能なおうち Amazon ECS Anywhere クラスターの構築

この記事は Building an Amazon ECS Anywhere home lab with Amazon VPC network connectivity を翻訳したものです。

2014 年以降 Amazon Elastic Container Service (Amazon ECS) は AWS のお客様がコンテナ化されたアプリケーションのデプロイをさまざまなコンピュート環境へわたってオーケストレーションできるように支援してきました。これまでの Amazon ECS は Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、AWS Fargate、AWS Wavelength、AWS Outposts など、AWS が管理するコンピュートハードウェアでのみ使用することができました。Amazon ECS Anywhere (ECS Anywhere) が一般提供開始となったことで Amazon ECS クラスターのキャパシティとしてお客様自身の所有するコンピュートハードウェアを使用することが可能になりました。

このブログでは、おうち ECS Anywhere クラスターで ECS タスクを実行するためのホームラボを構築するプロセスを説明します。ホームラボでは Amazon ECS API を使用して自分のコンピュートハードウェア上でタスクを起動できます。さらに AWS Site-to-Site VPN を使用することで、ローカルネットワークからリモートの Amazon Virtual Private Cloud (Amazon VPC) にアクセスしたり、リモートの Amazon VPC からローカルネットワークにアクセスできます。Site-to-Site VPN はローカルの Amazon ECS Anywhere クラスターで実行されるローカルのタスクが、Amazon VPC 内の Amazon Relational Database Service (Amazon RDS)や、Amazon ElastiCache、または他の AWS のフルマネージドサービスと通信することを可能にします。さらにローカル側のマシンは Application Load Balancer (ALB) や Network Load Balancer (NLB) などの、Amazon VPC 上にホストされたサービスからのインバウンド接続を受け取ることができます。

アーキテクチャ

ECS Anywhere がどのように動作するかを理解するために ECS Anywhere で機能するコンポーネントを調べる必要があります。ECS Anywhere に使用するハードウェアや仮想マシンを Amazon ECS クラスターの一部として動作させるためには、いくつかのコンポーネントが必要です。

最初のコンポーネントは AWS Systems Manager に接続されるエージェントです。AWS Systems Manager Agent (SSM Agent) をインストールするときに、エージェントが自分自身を AWS Systems Manager に登録するための秘密のアクティベーションコードを指定します。エージェントはアクティベーションコードを使用してハードウェアデバイスをマネージドインスタンスとして登録し、そのマネージドインスタンス用のシークレットキーをダウンロードします。この時点からマネージドインスタンスに AWS Identity and Access Management (IAM) ロールを割り当てることができ、その IAM ロールの IAM 認証情報を自動的に受け取ります。この IAM ロールはインスタンスが Amazon ECS などの他の AWS サービスと必要な通信を行うために必須なものです。

次の必須コンポーネントは Docker でマネージドホスト上でコンテナを起動します。Docker が起動するコンテナの 1 つは Amazon ECS エージェントです。このエージェントはマネージドインスタンスの IAM ロールを使用して、 AWS リージョン内の Amazon ECS コントロールプレーンに接続します。接続されると Amazon ECS コントロールプレーンからどのタスクやコンテナを起動するかの指示を受けることができます。また Amazon ECS エージェントはコンテナのライフサイクルと健全性といったタスクのテレメトリ情報をコントロールプレーンに送信できます。

次に理解しなければならないのは AWS リージョン内の Amazon VPC と ECS Anywhere クラスターを実行しているローカルネットワークの間で、ネットワークがどのように動作するかという点です。

Amazon VPC 側では AWS Site-to-Site VPN を使用してフルマネージドの VPN ゲートウェイを提供できます。このゲートウェイは Amazon VPC のルートテーブルにルートを追加するように構成されています。このルートはオンプレミスネットワークの CIDR レンジに宛てられたすべてのトラフィックを VPN ゲートウェイ経由で送信します。オンプレミスではクラウド側の VPN ゲートウェイと対になるお客様自身が管理する VPN ゲートウェイとルーティングを設定し、これにより各ノードにて発生する Amazon VPC の CIDR レンジに宛てられたすべてのトラフィックがオンプレミス側の VPN ゲートウェイに流れるようにします。

この構成ではオンプレミスネットワーク内のどのリソースも、Amazon VPC がホストするリソースのプライベート IP アドレスを使用して VPC 内のリソースとやり取りできます。例えばオンプレミスの Raspberry Pi は Amazon VPC で稼働している Amazon RDS インスタンスにトラフィックを送信できます。さらに、Amazon VPC でホストされているリソースはプライベート IP アドレスを使用してオンプレミスのリソースと通信できます。上記の図では、Amazon VPC がホストする NLB は Raspberry Pi のプライベート IP アドレスを使用して Raspberry Pi と通信しています。

ここで覚えておいていただきたい重要なことは、オンプレミス側のデバイスがインターネットに接続できるのであれば上記のような VPN の構成がなくとも多くの AWS サービスと通信できるという点です。これには Amazon ECS、Amazon DynamoDB、Amazon Simple Storage Service (S3)、およびパブリックなサービスエンドポイントを通してグローバルにアクセス可能な多くの AWS サービスが含まれています。追加のネットワーク設定は特定の Amazon VPC に紐づく AWS サービスに対してのみ必要です。

ホームラボのハードウェア構築

ECS Anywhere はさまざまなデバイスや OS で機能するように設計されているため、ホームラボを構築するためのハードウェアの選択肢は数多くあります。あなたはおうち Amazon ECS クラスターに使用したいハードウェアをすでにお持ちかもしれませんが、新しいものを購入する理由を探していたのではないでしょうか!? このセクションでは Raspberry Pi デバイスを使用して ECS Anywhere ホームラボを構築するためのパーツリストを紹介します。これらのパーツは他の代替品を利用できますが、このリストがホームラボ構築のための良い出発点となるでしょう。

Raspberry Pi にはいくつかの重要な利点があります。Raspberry Pi は比較的低予算で大きめのクラスターを構築できます。さらにRaspberry Pi は ARM ベースのデバイスであるため、お手持ちの開発デバイスがすべて Intel ベースである場合に自宅で ARM ビルドをテストするのに最適です。最後に Raspberry Pi は低消費電力のデバイスであり自然冷却で動作可能なため、オフィスに騒々しいファンを設置したくない場合にも最適です。

コンピュート環境について以下のコンポーネントを使用することができます。

  • 4 x Raspberry Pi 4 Model B (8 GB RAM, Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5 GHz). Amazon ECS タスクを実行するために合計 16 コアと 32 GB のメモリが提供されます。
  • 4 x Raspberry Pi Power over Ethernet HAT. これは Raspberry Pi の上に載せる追加の回路基板で、イーサネットケーブルを介して電源を供給する機能を与えます。このパーツはオプションですがネットワークケーブルに加えて電源ケーブルも扱いたくない場合に最適です。
  • 4 x 128 GB SD card. これは Raspberry Pi が OS や Docker イメージなど、Raspberry Pi にインストールして実行するすべてのものを保存する領域となります。
  • 4 x Raspberry Pi low profile heatsinks. 自然冷却を強化します。ヒートシンクは Raspberry Pi と PoE Hat の間に収まるような小型のものである必要があります。

これらの個々のデバイスをきちんとしたセルフマネージドのクラスターとして稼働させるために、以下のコンポーネントも検討してください。

  • 4 x Cat8 Ethernet patch cable. Raspberry Pi をスイッチに接続する長さ 1 フィートのケーブルです。
  • 1 x TP-Link 8 Port Power over Ethernet Switch. すべての Raspberry Pi に電源を供給し有線のインターネット接続を行います。これにより自宅の Wi-Fi ネットワークに負荷をかけずに済み、加えてこのスイッチはケースにほぼぴったり収まります。
  • 1 x cluster case for Raspberry Pi from C4 Labs. クリアケースなので中の機器がよく見えます。8 つの付け外し可能なベイを備え、底面にはスイッチを配置できるスペースがあります。仮にあなたが 8 つのスロットすべてにデバイスを搭載する予定でも、このケースには冷却ファン用のスペースがあるためそこにファンを設置することで機械的な手助けによってケース内の空気の流れを活発にできます。

ソフトウェアの設定

すべてのハードウェアを組み立てたあとは少しだけソフトウェアの設定を行う必要があります。具体的に Raspberry Pi の場合は Raspberry Pi のイメージャーを使って SD カードに OS をインストールします。今回のホームラボの例では Ubuntu 20 を使用しています。SSH アクセス可能なユーザーとして公開鍵を追加します。その後 SSH を使って Raspberry Pi の中でコマンドを実行します。ファームウェアの設定を少し調整する必要があります。

まず、デバイスが Docker および Amazon ECS タスクを実行するためにはブートコンフィグでメモリの cgroups を有効化する必要があります。これはデフォルトでは有効になっていないかもしれませんが、Amazon ECS のタスク定義でハードまたはソフトのメモリ制限を設定したときに Docker が正しく機能するために必要です。これは /boot/firmware/cmdline.txt ファイルに cgroup_enable=memory を追加することで行うことができます。

さらに Raspberry Pi の場合、クラスターからのノイズを減らしたい場合もあります。純正の Power over Ethernet Hat には冷却ファンが付いており、厳密に必要とされる温度よりもはるかに低い温度を維持しようとします。ヒートシンクを設置している場合は、典型的な条件下ではデバイスを最大動作温度よりもはるかに低い温度で自然冷却することになるでしょう。/boot/firmware/usercfg.txt での設定によりデバイスが 68℃ になるまでファンがオンにならないようにできます。

dtoverlay=rpi-poe
dtparam=poe_fan_temp0=68000
dtparam=poe_fan_temp1=72000
dtparam=poe_fan_temp2=76000
dtparam=poe_fan_temp3=80000

cat /sys/class/thermal/thermal_zone0/temp を実行することで Raspberry Pi の温度を監視し、負荷がかかっていても適正な温度を保つことができます。周囲の温度が高すぎない限り、高負荷状態が長時間続くまで Raspberry Pi はヒートシンクによって自然冷却されます。温度が 68℃ を超えるとファンが作動して強制冷却が行われます。

これらの初期調整が終わったら AWS マネジメントコンソールを使って各デバイスで実行するアクティベーションコマンドを取得できます。このコマンドはデバイスを Amazon ECS クラスターのキャパシティとして登録します。

このスクリプトは SSM エージェント、Docker、Amazon ECS エージェントを自動的にインストールして設定するためそれ以上の入力は必要ありません。スクリプトの実行が終了すると AWS Systems Manager Fleet Manager にデバイスが表示されるのが確認できます。また、ホームネットワーク内のローカル IP アドレスなどいくつかの詳細情報が表示されます。

Fleet Manager の便利な機能のひとつにマネージドインスタンスへの接続があります。これは NAT の背後にあるプライベート IP アドレスのみをもつデバイスでも機能します。これはホスト上の SSM エージェントが SSM へのコントロールチャネルを開くためです。これを利用してマネージドインスタンスを監視したり AWS SSM Session Manager のセッションを開始できます。“Start session” を選択するとブラウザ上でシェルが開かれます。htop を起動するとプロセスツリーが表示され、SSM エージェントがシェルを実行するワーカーを起動していることがわかります。

AWS Site-to-Site VPN の設定

Amazon ECS クラスターに使用できるネットワークのアプローチにはいくつかの種類があります。インバウンドトラフィックに対する最も簡単なアプローチは、自宅のルーターにポートフォワーディングを設定することです。これによりトラフィックを自宅の IP アドレスに送信し、ネットワーク上のデバイスの 1 つに転送することが可能になります。

Amazon VPC 内のリソースに接続したい場合はどうすればよいでしょうか? 大規模なオンプレミス環境では AWS Direct Connect を使用して AWS への直接接続が可能です。しかしホームラボの場合、これは理想的ではありません。コストを下げるための代替手段として AWS Site-to-Site VPN を使用できます。そして、ホームラボの Raspberry Pi の 1 つを IPsec VPN 用に strongSwan の実行に割り当て、VPN ゲートウェイとして動作させれば良いのです。Amazon VPC コンソールにアクセスして AWS 側の VPN ゲートウェイを作成し、オンプレミスの VPN ゲートウェイを設定するための手順をダウンロードすることができます。

ダウンロードした手順にそってホームネットワークと Amazon VPC の間に IPsec VPN トンネルを設定することができます。ipsec statusを実行して接続が確立していることを確認します。このケースでは192.168.1.0/24ネットワークと Amazon VPCの10.0.0.0/16ネットワークの間に設定された VPN 接続の出力を見ることができます。

次に、他の Raspberry Pi デバイスに VPN ゲートウェイのルートを設定する必要があります。他の Raspberry Pi デバイスは Amazon VPC の IP レンジ宛のすべてのトラフィックを VPC に届けるために、ゲートウェイとして VPN Raspberry Pi のローカル IP アドレスを使う必要があることをこのルート設定によって知ります。以下の例では VPN Raspberry Pi のローカル IP アドレスが192.168.1.196となっています。

sudo route add -net 10.0.0.0/16 gw 192.168.1.196

再び Fleet Manager を使用してネットワークの接続性を確認します。Raspberry Pi の 1 つにセッションを開き、Amazon VPC 内で稼働する Amazon EC2 インスタンスがある場合はそのプライベート IP アドレスに対して ping を実行してみましょう。

上記のスクリーンショットでは、ニューヨークにある私のホームネットワークに接続されている (私の机の上の) Raspberry Pi からpingを実行した結果を見ることができます。ping の宛先アドレスは米国東部 (北バージニア) の VPC 内で稼働している Amazon EC2 インスタンスです。ping の結果を見るとニューヨークから米国東部 (北バージニア) までの往復を 11ms 以下で行っています。この結果はあなたのネットワーク環境や Amazon VPC をプロビジョニングした AWS リージョンまでの距離によって異なる場合があります。

おうちクラスターでの負荷分散ワークロードの起動

ハードウェアとソフトウェアに必要なセットアップがすべて完了したら、クラスター上でテストワークロードを起動してすべてが問題なく動作することを確認します。新しい起動タイプである EXTERNALを使用して Amazon ECS サービスをホームラボのクラスターで起動できます。タスク定義と Amazon ECS サービスの両方をEXTERNAL起動タイプで作成する必要があります。

ここからは、以下のスクリーンショットでも確認できるredisサービスの例を見ていきましょう。Redis は情報をディスクに永続化する必要があるステートフルなサービスです。ステートフルなサービスはデータが保存されているのと同じ場所で実行される必要があるので注意が必要です。ECS Anywhere では「タスク配置の制約事項」機能を使用してこれを解決することができます。「タスク配置の制約事項」はワークロードを特定のデバイスに固定するために使用できます。このケースでは Amazon ECS のインスタンス属性redis=trueと「タスク配置の制約事項」 attribute:redis=trueを使用して、redisタスクが特定の Raspberry Pi に固定されています。

タスクが起動すると、あたかも VPC 内の Amazon EC2 インスタンスで実行されているかのようにタスクのメトリクスやログを取得することができます。

インターネットからのトラフィックを受信する必要があるサービスをホストしている場合、ロードバランサーが必要になることがあります。ロードバランサーを AWS リージョンでホストすることのメリットは、ホームネットワークのアドレスを指すように DNS 設定をする必要がないことです。ロードバランサーは自身の IP アドレスを使用してトラフィックを処理でき、ホームネットワークは VPN 接続で保護されます。

この構成を実現するためには NLB または ALB を AWS Site-to-Site VPN を構成した VPC に作成する必要があります。ロードバランサーがこの VPC 内にあれば、VPN ゲートウェイを経由してホームネットワーク内のデバイスのプライベート IP アドレスにトラフィックを送信できます。現時点ではホームラボのデバイスのプライベート IP アドレスとポートの組み合わせをロードバランサーに手動で追加する必要があります。幸いなことにホームネットワーク上のデバイスは固定 IP アドレスを持つことが多いので、この構成は安定しているはずです。

ロードバランサーの各ターゲットが Healthy になったらロードバランサーの DNS 名にトラフィックを送信してみましょう。このケースではレスポンスは小さな Node.js のアプリケーションが返すシンプルな HTML ページで、Redis に保存されたヒットカウンターが表示されます。

まとめ

ECS Anywhere を使用すると自宅のホームラボでのコンテナを利用した実験をクラウド側からオーケストレーション可能です。コントロールプレーンを自分のデバイスで実行する必要はありません。代わりに自分のデバイスを純粋にアプリケーションのキャパシティとして使用できます。ECS Anywhere ではデバイス上のソフトウェアの望ましい状態を定義し、ホストへのタスクの配置を Amazon ECS のコントロールプレーンに任せることができます。Amazon ECS はタスクを監視し必要があればそれらを再起動します。さらに Fleet Manager を利用すると、あなたはどこからでもインターネット越しにプライベートネットワーク内の管理対象のデバイスに接続してコントロールできるようになります。これはたとえそれらのデバイスが NAT の背後にあっても同様です。

この記事だけでは ECS Anywhere の魅力は伝えきれませんので、ぜひドキュメントリリース発表記事もご覧ください。また、6 月に開催される Containers from the Couch のライブストリームでも ECS Anywhere を紹介する予定です。皆さまからの質問にもお答えしますので、ぜひご参加ください。

翻訳はソリューションアーキテクト加治が担当しました。原文はこちらです。