PrivateLinkとALBを利用してECS Fargateをロードバランシングする

インフラ

こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。

FargateとはECSの実行環境の1つです。Fargateを利用することでECSインスタンスの管理が不要になるため、インスタンスのキャパシティやセキュリティについて意識しなくてよくなるというメリットがあります。
Fargateの概要についてはAWS『スタートアップのためのコンテナ入門 – AWS Fargate 編』を参照してください。

今回はFargateで起動しているタスク(Dockerコンテナ)をPrivateLinkとALBを利用してロードバランシングさせる手順について紹介します。
具体的には以下のような環境を構築します。

ロードバラシング向けVPCネットワークの作成

図の簡略化のためALBの配置がシングルAZになっていますが、実際にはALBはマルチAZで配置されています。

まずはロードバランサーおよびロードバランシング対象のタスクを配置するVPC環境を作成します。今回はロードバランサーをパブリックサブネットに、タスクをプライベートサブネットに配置します。
具体的にはVPCに以下の環境を作成します。

サブネット

名前 アベイラビリティゾーン IPv4 CIDRブロック 目的
public-subnet1 ap-northeast-1a 10.0.0.0/24 ALB配置用
private-subnet1 ap-northeast-1a 10.0.1.0/24 タスク配置用
public-subnet2 ap-northeast-1c 10.0.3.0/24 ALB配置用

セキュリティグループ

名前 インバウンドルール 用途
sec-alb 任意のHTTPアクセスを許可 ALB用
sec-web-via-alb ALBからのHTTPアクセスを許可 タスク用

ロードバランサーはALBを利用します。

一点、ロードバランサーおよびターゲットグループの作成で注意点があります。
Fargateが実行環境の場合タスクはawsvpcで起動します。awsvpcとはタスクごとにENIとプライベートIPを付与するネットワークモードのことです。1
FargateのタスクはIPで識別されることになるので、Fargateのタスクをロードバランシングする際は『ターゲットの種類』を『ip』に設定してください。

ロードバランサーが配置されたVPC環境におけるサブネットやセキュリティグループの作成手順の詳細はAWS EC2にALBを導入し、Webサーバーのロードバランシングを実現する手順で紹介していますので参照してください。

AWS EC2にALBを導入し、Webサーバーのロードバランシングを実現する手順

PrivateLinkの作成

今回はプライベートサブネットにタスクを配置します。
プライベートサブネットはインターネットに接続されていないためDockerイメージのpullなどができず、タスクを起動できません。

そこでPrivateLinkを作成し、AWSサービス間をプライベート接続でアクセスできるようにします。
PrivateLinkはプライベートサブネットにタスクを配置する際に必要な設定であるため、パブリックサブネットにタスクを配置する場合は設定不要です。

VPCでプライベートDNSを設定をできるようにする

PrivateLinkを作成する際、PrivateLinkのエンドポイントに対してプライベートDNSを割り当てます。
プライベートDNSを割り当てるには、VPCのenableDnsSupportenableDnsHostnamestrueになっている必要があります。

PrivateLink作成対象のVPCにチェックをし、『DNS解決の編集』と『DNSホスト名の編集』から『有効化』にチェックがついているか確認してください。

PrivateLink用のセキュリティグループの作成

PrivateLinkはプライベートサブネットの通信で利用されます。
よって、プライベートサブネット用のセキュリティグループからのインバウンドアクセスを許可するセキュリティグループを作成します。プロトコルはHTTPSです。

エンドポイントの作成

ECSの実行環境によって必要となるAWSサービス(エンドポイント)は異なります。ECSの実行環境と必要になるPrivateLinkのエンドポイントの対応は以下の通りです。2 3

ECSエンドポイント

エンドポイント名 EC2実行 Fargate実行
ecs-agent 必要 不要
ecs-telemetry 必要 不要
ecs 必要 不要

ECRエンドポイント

エンドポイント名 EC2実行 Fargate実行
ecr.dkr 必要 必要
ecr.api 必要 不要

S3エンドポイント

エンドポイント名 EC2実行 Fargate実行
s3 必要 必要

CloudWatchエンドポイント

エンドポイント名 EC2実行 Fargate実行
logs 用途による 必要

S3にはDockerイメージの実体が配置されているため、ECR利用時にはS3エンドポイント用のPrivateLinkを作成する必要があります。

なお、各サービス名の頭にはcom.amazonaws.[リージョン名]がつきます。
例えば、ap-northeast-1logsであればcom.amazonaws.ap-northeast-1.logsが正式なエンドポイント名となります。

今回はFargateを利用するため、ecr.dkrs3logsのエンドポイントに対するPrivateLinkを作成します。
もしPrivateLinkを作成する際、Enabling private DNS requires both enableDnsSupport and enableDnsHostnames VPC attributes set to true for vpc-xxxというエラーが表示された場合は、VPCの『DNS ホスト名の編集』と『DNS 解決の編集』が有効になっていないのでVPCの編集を先に行ってください。

VPCダッシュボードの『エンドポイント』→『エンドポイントの作成』を選択します。

『サービスカテゴリ』に『AWSサービス』を選択し、PrivateLinkを作成するエンドポイントを検索します。

『サブネット』はタスクが配置されているプライベートサブネットを指定します。

『プライベートDNS名を有効にする』にチェックをつけます。

セキュリティグループは事前に作成したPrivateLink用のセキュリティグループを指定します。

上記の手順で必要なエンドポイントのPrivateLinkを作成します。

s3のエンドポイントのタイプは『Gateway』であるため選択肢が多少異なりますが、プライベートサブネットにPrivateLinkを作成するという方針は同じです。

ECRの作成

ローカルのDockerイメージをECRへpushします。手順の詳細はAWS CLIをインストールし、ECRへDockerイメージをpushする手順を参照してください。

AWS CLIをインストールし、ECRへDockerイメージをpushする手順

ECSの作成

今回はECSの実行環境にFargateを利用します。

クラスターの作成

クラスターとはECSでDockerコンテナを動かすときのホストマシンの論理グループで、ECSの一番大枠の概念にあたります。

Amazon ECSの『クラスター』→『クラスターの作成』を選択します。

『ネットワーキングのみ』を選択します。

任意のクラスター名を設定すればクラスターの作成は完了です。

タスク定義の作成

タスクとはアプリケーションを構成する1つ以上のコンテナ(群)のことをいいます。
タスク定義とは、タスク内でのコンテナ間のやりとりの方法やコンテナ数、使用ポートといったコンテナ情報を明記したものです。

Amazon ECSの『タスク定義』→『新しいタスク定義の作成』を選択します。

『Fargate』を選択します。

タスク定義の詳細設定は【AWS】ECR + ECS + RDSを利用したDocker環境構築手順『タスク定義を作成する』で紹介した内容とほぼ同じです。

Fargateのタスク定義のうち、EC2のそれと異なる点は以下の点です。

  • awsvpcを利用するため、ポートマッピングはコンテナポートのみ指定
  • タスクサイズ(『タスクメモリ』と『タスク CPU』)を指定
  • 『タスクの実行 IAMロール』を『ecsTaskExecutionRole』にする

サービスの作成

サービスとはクラスター内で実行されるタスク数やタスクの配置方法を制御する機能です。

クラスターの『サービス』タブの『作成』を選択します。

『起動タイプ』にFARGATEを選択します。

今回は2つのタスクを『最小ヘルス率』50、『最大率』200でロードバランシングします。
これは、タスクは少なくとも1つ起動していればOK(タスク数2 x 最小ヘルス率0.5 = 1)、タスク数4までhealty状態のタスクができることを許容する(タスク数2 x 最大率2.0 = 4)という方針です。

『VPCとセキュリティグループ』はタスクを配置するプライベートサブネットの情報を設定します。プライベートサブネットなので『パブリック IP の自動割り当て』は不要です。

『ロードバランシング』はALBを選択し、事前に作成したロードバランサー名を指定します。

『ロードバランス用のコンテナ』は『ターゲットグループ名』にロードバランサーのターゲットグループを指定します。

これでサービスの作成はOKです。

動作確認

サービスを更新したらデプロイメントは自動で実行されるので特に行うことはありません。しばらくするとデプロイメントが実行され、アプリケーションが起動します。

デプロイメントが正常に実行されるとタスク一覧にタスクが表示されます。今回はタスク数を2つにしたため、2つのタスクがRUNNING状態になっています。

ALBのDNS名でアクセスして画面が正しく表示されればOKです。

まとめ

以上でPrivateLinkを利用したECS Fargateのロードバランシング環境の構築手順の紹介を終わります。

今回のまとめ
  • Fargateをロードバランシングする場合はロードバランサーのターゲットは『ip』にする
  • PrivateLinkを利用することでプライベート通信でAWSサービス連携が可能になる
  • Fargateをプライベートサブネットで起動させる場合はs3、logs、ecr.dkrのPrivateLinkが必要

この記事がいいなと思いましたらTwitter(@nishina555)のフォローもよろしくお願いします!

AWSオススメ参考書