こんにちは、ちゃりおです。
ECSのデプロイ時のPullはNATGWを通すと通信量が高額になることがあると思います。
VPCエンドポイントを使うことで料金を節約できます。
CDKでECS用のVPCエンドポイント作ってみました。
インターフェース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できません。
まとめ
InterfaceVpcエンドポイント、指定したサブネットでしか使えないと最初勘違いしていました。
ここで指定するサブネットは、ENIが作成されるサブネットでした。
VPC内にプライベートDNSが作成されるので、VPC内であればどのサブネットからでも使えました。
CDKで作るとサブネットもよしなに設定してくれて便利でした。


