インフラ

AWS CDKでECS Fargateに必要なVPCエンドポイントを作成する

ECS

こんにちは、ちゃりおです。

ECSのデプロイ時のPullはNATGWを通すと通信量が高額になることがあると思います。
VPCエンドポイントを使うことで料金を節約できます。

CDKでECS用のVPCエンドポイント作ってみました。

Contents

インターフェースVPCエンドポイントとは

まずは、インターフェースVPCエンドポイントの概要についてです。

VPCエンドポイント概要

VPCエンドポイントは、インターネットやNATGWを経由せずにAWSのサービスにアクセスできるサービスです。

例えば、プライベートサブネットにあるECSの場合、ECRからイメージをPullする際はNATGWを経由してインターネットに行きます。
VPCエンドポイントを使えばNATGWを経由せずにVPCエンドポイントを経由してECRにアクセスできます。

AWS PrivateLink は、データをインターネットに公開することなく、AWS またはオンプレミスでホストされているサービスと仮想プライベートクラウド (VPC) との間のプライベート接続を確立します。

VPC エンドポイントでは、AWS PrivateLink を使用する AWS のサービスや VPC エンドポイントサービスに VPC をプライベートに接続できます。インターネットゲートウェイ、NAT デバイス、VPN 接続、または AWS Direct Connect 接続は必要ありません。VPC のインスタンスは、サービスのリソースと通信するためにパブリック IP アドレスを必要としません。VPC と他のサービス間のトラフィックは、Amazon ネットワークを離れません。

AWS PrivateLink および VPC エンドポイント

VPCエンドポイントには、InterfaceとGatewayの2種類があります。
違いは以下のサイトがわかりやすいです。

Amazon VPC エンドポイント の GatewayとInterface

InterfaceVPCエンドポイントとは

VPCエンドポイント用のENIを作成されます。
そのENIに、プライベートDNSが割り当てられます。

各サービスからは、作成されたENIを経由してAWSのサービスと通信します。
プライベートDNSを経由するため、ルートテーブルの設定変更は不要です。

VPCエンドポイントの嬉しい点

  • NATGWと比べるとデータ通信量が安価
  • セキュリティの向上

NATGWのデータ通信料: 0.062USD/GB
VPCエンドポイントのデータ通信料: 0.01USD/GB

料金がNATGWと比べて安価になります。(約6分の1)
ECSのイメージPullとかがあるとデータ通信量が増えがちなのでありがたいです。
各AZのVPCエンドポイント1つあたりにも料金がかかりますが、通信量にかかる料金を考えれば安くなると思います。

また、インターネットを経由していた通信がプライベートになるためセキュリティも向上します。

※料金は東京リージョンの2021/4月時点

CDKで作ってみた

AWS公式のドキュメントを参考にECS Fargateに必要なVPCエンドポイントをCDKで作ってみました。

isolatedサブネット(IGW/NATGWなし)にECSを作成して、VPCエンドポイントから取得できることを確認しました。

事前準備

ECRの作成とimageのpushを行います。
imageはrunningになれば何でもいいです。今回は、nginxのイメージを使いました。

まずは、ECRの作成です。

$ aws ecr create-repository --repository-name vpc-endpoint-demo #ECRリポジトリ作成
$ aws ecr describe-repositories --query "repositories[].repositoryName" #ECRリポジトリの作成確認

作成したECRにnginxのイメージをpushします。

$ docker pull nginx
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker tag nginx:latest <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/vpcendpoint-demo:latest
$ docker push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/vpcendpoint-demo:latest

CDKでVPCエンドポイントとECS作成

$ cdk deploy EcsEndpointStack

デプロイすると、無事にタスクがRUNNINGになりました。

上記のCDKのVPCエンドポイント部分だけコメントアウトすると、こんな感じのエラーになりECRからpullできません。
pull faile

まとめ

InterfaceVpcエンドポイント、指定したサブネットでしか使えないと最初勘違いしていました。
ここで指定するサブネットは、ENIが作成されるサブネットでした。

VPC内にプライベートDNSが作成されるので、VPC内であればどのサブネットからでも使えました。
CDKで作るとサブネットもよしなに設定してくれて便利でした。

Aamzonで「AWS」の本を見てみる

楽天で「AWS」の本をみてみる!!

ECS
ECSのスロットリングをCloudwatch+ContainerInsightで検知するこんにちは、ちゃりおです。 以前、ECSのスロットリング(設定に不備がありタスクが起動せず、startとstopを繰り返す)事象が発生...
cdk
CDKで複数コンテナのECSタスクを作成する際はDefaultコンテナの指定を忘れずやろうこんにちは、ちゃりおです。 ECSで複数コンテナを動かすタスク定義をCDKで書いていました。 しかし、想定したコンテナがALBのターゲ...
ECR
別アカウントから使用できるECRをCDKで書いてみたこんにちは、ちゃりおです。 AWSアカウントを分けているのですが、共通のDockerイメージを使いたいため 別アカウントで同じECRを...