AWS private link 構築時のルーティング
概要
private link 作成後に AWS サービスへアクセスしたところ、自分の想定とは異なる経路での通信を確認しました。
なぜ違う経路を使用したのか、気になったので調べました。
本題
前提
以下の構成を構築。
public subnet 内EC2内からECRへは、インターネット経由でアクセスできた。
その後、private subnet に紐づける形で ECR への private link を作成。
private subnet 内のEC2からも、 作成した private link 経由で ECR へアクセスできた。
ここまでは想定通り。
何が発生したか
publc subnet 内の EC2 から ECR へアクセスすると、private link を経由してアクセスした。
public subnet 内のEC2は、引き続き Internet Gateway 経由(≒インターネット経由)でアクセスすると思っていたため、困惑した。
一体何故、private link を経由するようになったのか。
結論
メインルートテーブルが、ルーティングテーブルに沿って通信を制御しただけだった。
どういうことか?
ルートテーブルのエントリーは、以下の通り。
Internet Gateway 付きで作成した場合のデフォルト状態。
2つ存在するECRへの経路
private link を作成したことで、ECRへの経路が二つできたことになる。
- Internet Gateway を経由する経路 =>
0.0.0.0 => igw
- private link を経由する経路 =>
10.0.0.0/16 => local
では、どちらの経路を優先するか?
一般的に、 0.0.0.0
は、ルーティング不能な宛先の受け口。
まずは、0.0.0.0
を除く、他のエントリーに当てはまるか調べることになる。
- 当てはまるエントリーがあれば、そこへルーティング
- いずれにも当てはまらない場合は
0.0.0.0
(今回であれば Internet Gateway)へルーティング
という挙動となる。
つまり ... ?
private link を作成したことで、 10.0.0.0/16
レンジでECRへアクセスできる経路が爆誕したため、こちらが優先された、というお話でした。
気付いてしまえば、簡単な問題でした。
おしまい。
余談
ECR のエンドポイントは NLB?
ECR のドメインネームに対して host
コマンドを叩いたりして経路を探っていました。
インターネット経由でECRにアクセスする(≒private link を作成しない)場合、 host
コマンドは以下のような応答を返しました。
[ec2-user@ip-10-0-1-91 bin]$ host {AWS_ID}.dkr.ecr.ap-northeast-1.amazonaws.com
{AWS_ID}.dkr.ecr.ap-northeast-1.amazonaws.com is an alias for nlb3-a01fc3168d6b4c7e.elb.ap-northeast-1.amazonaws.com.
nlb3-a01fc3168d6b4c7e.elb.ap-northeast-1.amazonaws.com has address 52.192.36.247
結果から分かる通り、 NLB と思われる別名で名前解決がなされました。
(多分、正しくはECRのドメイン名が別名)
private link を作成後、名前解決で得られるIPアドレスは...?
private link 作成後、ECRドメイン名に対して host
コマンドを実行すると、プライベートIPが返ってくる。
[ec2-user@ip-10-0-1-91 bin]$ host {AWS_ID}.dkr.ecr.ap-northeast-1.amazonaws.com
{AWS_ID}.dkr.ecr.ap-northeast-1.amazonaws.com has address 10.0.1.157
このプライベートIPの正体は、private link (ENI)に割り当てられたIPアドレスだった。
ECRのドメイン名を解決すると、 private link の IPアドレスが返ってきたことになる。
そもそも、private link を作成しただけで、名前解決結果が private link のIPアドレスとなったのか?
大変興味はあるが、そこまでは追えなかった。
private link を作成する動機は、「private link経由でAWSサービスにアクセスしたい」ばかりなので、有難いのは間違いない。
Discussion