NAT Gatewayを集約したらECRが動かなくなった話

2022.07.01

こんにちは!AWS事業本部コンサルティング部のたかくに(@takakuni_)です。

今回は、タイトルの通り「NAT Gateway集約したらECRが動かなくなった話」をご紹介したいと思います。

はじめに

皆さんは、Transit Gatewayを使用したNAT Gatewayの集約した構成をご存知でしょうか?

ざっくりご説明するとTransit Gatewayを使用すると複数VPCのアウトバウンドを集約することができます。

「各VPCにNAT Gatewayを配置すると高いので、ネットワークを集約したVPCのパブリックサブネットにNAT Gatewayを配置して共有しよう」といった構成になります。

詳しくは以下のブログをご覧ください。

本題

私も上記のコスト最適化を行いたく、Transit Gatewayを使用してNAT Gatewayを集約しました。

図にすると以下のイメージです。

明らかにS3のエンドポイントが怪しいですが今は気にしないでください。

私の場合、以下のようなエラーが起き、ECSタスクがECRからイメージを取得できないエラーが発生しました。

CannotPullContainerError: ref pull has been retried 5 time(s): failed to copy: httpReadSeeker: failed open: failed to do request: Get https://prod-ap-northeast-1-starport-layer-bucket.s3.ap-northeast-1.amazonaws.com/

starport-layer-bucketとは

ドキュメントにも記載がありますが、ECRはAmazon S3を使用してイメージレイヤーを保存する仕組みとなっているそうです。そのため、ECRからイメージを取得する際は、S3への経路も考慮する必要があります。

prod-ap-northeast-1-starport-layer-bucket」は、ECSタスクからECRへプルする際に使用するバケットの1つです。具体的には東京リージョンでECSタスクをデプロイした場合に使用されるS3バケットになります。

つまり何が起こっているの?

エラーの原因を図示すると以下になります。

ECSタスクは、Transit Gateway先のS3ゲートウェイエンドポイントを経由して、「starport-layer-bucket」バケットに到達しようとします。しかし、ゲートウェイ型 VPCエンドポイントの場合、VPC外からはエンドポイントを使用できないためエラーを返す状態になっています。

解決方法

ゲートウェイエンドポイントを各VPCに配置する

各VPCにゲートウェイエンドポイントを配置することでS3への経路を変更します。コスト的にもゲートウェイ型エンドポイントは、各VPCに作成することをお勧めします。

ただし、ネットワークを集約しているVPCでNetwork Firewall等のアプライアンス製品を使用している場合は注意が必要です。

まとめ

今回は、「NAT Gatewayを集約したらECRが動かなくなった話」をご紹介しました。

意外とS3起点でサービスが成り立っているものもあるので、今まで動いていたものがNAT Gatewayを集約したら動かなくなった場合の解決方法の1つとして使えるかもしれません。

(余談ですが、Amazon Linux2のyum updateもデフォルトではS3起点のため動かなかったです。)

このブログがどなたかの参考になれば幸いです。

以上、AWS事業本部コンサルティング部のたかくに(@takakuni_)でした!