AWS VPC に設定された PrivateLink の VPC Endpoint を
から実行するための設定例を記載します。
PrivateLink または Route53 による Private hosted zone (PHZ) を利用するためには、DNS hostnames と DNS resolution が両方とも Enabled になっている必要があります。
VPC Endpoint (VPCE) には PrivateLink によるものと、S3 および DynamoDB のみが対応する Gateway 型のものがあります。
PrivateLink による VPCE は Subnet 内のプライベート IP を持ちます。この VPCE を、VPN 接続された GCP VPC や別の AWS VPC から利用する設定を考えます。
補足: Gateway endpoints はプライベートIP を持たないため、他のネットワークから利用することができません。S3 は Gateway 型の他に Interface 型によってもサポートされているため、他のネットワークから利用するためには、Interface 型を利用します。ただし、S3 へのアクセスを行うクライアントが、VPCE 用に生成されたエンドポイントを明示的に使用する必要が発生します。参考: Amazon Simple Storage Service endpoints and quotas、AWS PrivateLink for Amazon S3
To access Amazon S3 using AWS PrivateLink, you must update your applications to use endpoint-specific DNS names.
そのために、まずは Interface endpoints を作成してみます。例として Amazon Comprehend の VPCE を作成します。
VPCE のネットワークインターフェースを作成する Subnet を一つ以上選択します。選択した個数分だけ、VPCE のプライベートIP が払出されます。
Private DNS Name のチェックを外します。
チェックを入れると、comprehend.ap-northeast-1.amazonaws.com
が VPCE のプライベートIP に解決されるような DNS レコードが自動で作成されます。
VPCE を一つの VPC からのみ利用する場合はそれで問題になりませんが、今回は別のネットワークである GCP VPC や他の AWS VPC からの VPCE 利用を考えているため、チェックを外して、別途 Route53 を用いて DNS レコードを作成します。
HTTPS (TCP 443) 通信が許可されるようなセキュリティグループを指定します。また、VPCE にポリシーを設定して、より細かいアクセス制御を行なうことも可能です。
VPCE は、プライベートなIP と、プライベートなIP に名前解決されるパブリックな DNS レコードを持ちます。
$ host vpce-0780d5a06cb1566c0-27y4uqrc.comprehend.ap-northeast-1.vpce.amazonaws.com
vpce-0780d5a06cb1566c0-27y4uqrc.comprehend.ap-northeast-1.vpce.amazonaws.com has address 10.2.3.136
vpce-0780d5a06cb1566c0-27y4uqrc.comprehend.ap-northeast-1.vpce.amazonaws.com has address 10.2.2.156
$ host vpce-0780d5a06cb1566c0-27y4uqrc-ap-northeast-1b.comprehend.ap-northeast-1.vpce.amazonaws.com
vpce-0780d5a06cb1566c0-27y4uqrc-ap-northeast-1b.comprehend.ap-northeast-1.vpce.amazonaws.com has address 10.2.2.156
$ host vpce-0780d5a06cb1566c0-27y4uqrc-ap-northeast-1c.comprehend.ap-northeast-1.vpce.amazonaws.com
vpce-0780d5a06cb1566c0-27y4uqrc-ap-northeast-1c.comprehend.ap-northeast-1.vpce.amazonaws.com has address 10.2.3.136
先程の Private DNS Name のチェックを入れたままにしておくと、更に、プライベートなIP に名前解決されるプライベートな DNS レコード comprehend.ap-northeast-1.amazonaws.com
が利用できますが、今回は Route53 を利用して別途作成します。
comprehend.ap-northeast-1.amazonaws.com
ゾーンを Private Hosted Zone (PHZ) として作成して、VPC に紐付けます。
VPC Peering や Transit Gateway でネットワーク的に接続された、他の AWS VPC から VPCE を利用するためには、上記 Route53 PHZ を紐付けます。
VPCE の IP アドレスに解決されるような A レコードを、エイリアス機能を用いて作成します。
他の AWS VPC については、Route53 PHZ を関連付けることで、VPCE のプライベートIP に名前解決可能な A レコードが利用できます。
VPN 接続された GCP VPC の場合は PHZ を直接利用できないため、GCP Cloud DNS からのアクセス先となる Route53 Inbound Endpoint を作成します。
UDP 53 へのアクセスが許可されているセキュリティグループを指定します。
Route53 Inbound Endpoint は VPCE と同様に、subnet 内にプライベート IP を持ちます。少なくとも二つの subnet を指定する必要があります。
Cloud DNS から利用するための IP アドレスです。
Route53 Inbound Endpoint の IP にクエリを転送するような Zone を作成します。
VPN 接続に利用している Cloud Router に対して、35.199.192.0/19
へのルートが GCP VPC 側に存在することを Advertise する設定を追加します。
AWS Route テーブルの Route Propagation を Yes に設定します。
35.199.192.0/19
に対するルーティング情報が Propagated Yes で追加されたことが確認できます。
補足: 35.199.192.0/19
への経路情報は Route53 Inbound Endpoint を利用するために必須です。
Route Propagation を利用できない場合は手動で Route テーブルに設定を追加する必要があります。
何らかの事情により、経路情報を設定できない場合は、Route53 Inbound Endpoint を利用せずに、静的に Cloud DNS レコードに対して comprehend.ap-northeast-1.amazonaws.com
に関する A レコードを作成することが回避策として考えられます。
GCP VM から Amazon Comprehend の API が VPCE 経由で利用できることを確認します。
$ host comprehend.ap-northeast-1.amazonaws.com
comprehend.ap-northeast-1.amazonaws.com has address 10.2.3.136
comprehend.ap-northeast-1.amazonaws.com has address 10.2.2.156
$ python -m awscli comprehend detect-dominant-language --text "It is raining today in Seat
tle."
{
"Languages": [
{
"LanguageCode": "en",
"Score": 0.9925304651260376
}
]
}
今回の例では以下の一つのセキュリティグループを VPCE、Route53 Inbound Endpoint、EC2 インスタンス の三つに対して使い回していますが、実際には用途毎に分けて運用します。
動作確認の例
[ec2-user@ip-10-3-3-134 ~]$ host comprehend.ap-northeast-1.amazonaws.com
comprehend.ap-northeast-1.amazonaws.com has address 10.2.2.33
comprehend.ap-northeast-1.amazonaws.com has address 10.2.3.113
[ec2-user@ip-10-3-3-134 ~]$ aws comprehend detect-dominant-language --text "It is raining today in Seattle."
{
"Languages": [
{
"LanguageCode": "en",
"Score": 0.9925304651260376
}
]
}
Interface 型 VPCE は時間毎に料金が発生します。PrivateLink を集約することによって、コストの削減が可能です。
一方で、集約することによって、一つの VPCE ポリシーで複雑なアクセス制御をする必要が発生します。ポリシーには文字数制限が存在することにも注意が必要です。
Note: A distributed VPC endpoint approach that is, an endpoint per VPC allows you to apply least privilege policies on VPC endpoints. In a centralized approach, you will apply and manage policies for all spoke VPC access on a single endpoint. With growing number of VPCs, the complexity of maintaining least privilege with a single policy document might grow. Single policy document also results in larger blast radius. You are also restricted on the size of the policy document (20,480 characters).
Centralized access to VPC private endpoints
0.014 USD * 2 AZ * 24 hours * 30 days * 110 JPY/USD → 2217.6 JPY /month
集約しない場合で 10 VPC 存在
0.014 USD * 2 AZ * 24 hours * 30 days * 110 JPY/USD * 10 VPC → 22176 JPY /month
Private Link が存在する AWS VPC に接続する GCP VPC が一つであれば問題になりませんが、以下の図のように複数の GCP VPC が接続する場合に問題が発生します。
補足: 図における On premise を AWS VPC に置き換えても同じです。
35.199.192.0/19 へのルーティングを VPC A と VPC B のどちらか一方にしか設定できないため、以下の構成は成り立ちません。
Hub となる GCP VPC を用意する回避策が考えられます。
Understanding forwarding, peering, and private zones in Cloud DNS