やりたかったこと
AWS Private Link についてはこちらを参照ください
AWS PrivateLinkのアップデート – お客様のアプリケーション&サービス向けのVPCエンドポイント
一言で言うとSaaSサービスのような用途のエンドポイントを、インターネット介さずにAWS間のネットワークでセキュアにアクセスできるよ。ってやつです。
で、やりたかったのは以下のような構成です。
ほぼTerraformで構築した。
ハマったこと
User AccountのSubnet Cからは、Endpoint経由でService AccountのEC2にアクセスできたけど、なぜかSubnet A, Bからは Service AccountのEC2にアクセスできない
調べたこと
1. どこからならアクセス可能か
Service AccountのEC2
localhostからアクセス可能
Service AccountのEC2の横にあるインスタンス
Private IPでアクセス可能
且つ、NLBのDNS名でアクセス可能
User AccountのSubnet AのEC2
Endpoint名でアクセス不可
User AccountのSubnet BのEC2
Endpoint名でアクセス不可
User AccountのSubnet CのEC2
Endpoint名でアクセス可能
結論
Endpoint -> Endpoint Service -> NLB -> EC2自体の 設定
は問題なさそう
ネットワーク周りが怪しい
2. セキュリティグループ
Endpoint
Endpointにセキュリティグループが設定できるので確認した。
User AccountのVPC丸ごと開けていた
もちろんOutboundは制限なし
Endpoint Service
セキュリティグループは設定できないので関係なし
NLB
セキュリティグループは設定できないので関係なし
EC2
NLBはクライアントIPをそのまま持ってくるため、User AccountのIPアドレスの開放が必要
User AccountのVPCとService AccountのVPCを丸ごと開けていた
もちろんOutboundは制限なし
結論
Subnet CのEC2からアクセスできていて、全てのSubnetを包括したCIDRで開けているから問題ないはず
3. NLBの設定しているSubnet
全てのSubnet(AZ)を設定済み
4. NACL
デフォなので特に制限無し
5. ルートテーブル
Subnet A, Bのルートテーブルがおかしいのか・・?と思い確認
どちらのアカウントもSubnet毎に分けているわけではないので差異は無し。
その日は諦めました
そして一日経過し判明
なんてことはない、NLBの クロスゾーン負荷分散
がオフになっていました。
つまり、クロスゾーン負荷分散が有効では無い、且つEC2が無いので分散しない状態でした。
しかも、EC2の横から確認したインスタンスは同じゾーンだったのでNLB経由でも自ゾーン内で通信するため問題ありませんでした。
そして クロスゾーン負荷分散
を有効にするとこうなりました。
なぜクロスゾーン負荷分散を有効にしていなかったのか
そう。冒頭に申し上げましたが、私はTerraformでNLBを構築したのですが、
設定を明示していなかったため、デフォルトとなり無効状態となっていたようです。。
みなさん、 クロスゾーン負荷分散 は有効にしない理由がほぼ無いので、有効にしておきましょう。
気が向けばTerraformにPR投げておきます。
補足
今回でわかったことは、アカウント跨いでもゾーンが同じならやっぱりゾーン内で通信は解決してるのね。と言うことを身に沁みました。