Private Space ピアリング
最終更新日 2023年06月14日(水)
Table of Contents
Private Space ピアリングを使用すると、Heroku Private Space で実行されている dyno と、お客様により制御される AWS VPC の間にプライベートネットワーク接続を確立できます。この接続はパブリックインターネットを経由しません。
ピアリングの前提条件
- VPC は、そのネットワーク設定において、互換性のある IPv4 CIDR ブロックを使用する必要があります。
- VPC は RFC1918 CIDR ブロック (
10.0.0.0/8
、172.16.0.0/12
、または192.168.0.0/16
) を使用する必要があります。 - VPC の CIDR ブロックは Private Space の CIDR 範囲と重複してはなりません。デフォルトの範囲は
10.0.0.0/16
、10.1.0.0/16
、および172.17.0.0/16
です。Private Space の CIDR 範囲は、新しい Space を作成するときに指定できます。 - お客様の AWS アカウントに、VPC ピアリング接続リクエストを実行するためのアクセス許可が必要です。
リージョン間ピアリングにはいくつかの制限があります。詳細は、VPC ピアリングに関する AWS ドキュメントを参照してください。
Private Space へのピアリング接続の作成
ピアリングを設定するには、AWS VPC からピアリングリクエストを送信した後、Heroku ダッシュボードまたは CLI でリクエストを確認します。
ピアリングリクエストを送信するには、AWS アカウント ID と、Private Space の VPC ID を知っている必要があります。heroku spaces:peering:info
コマンドを使用してこの情報を取得できます。
$ heroku spaces:peering:info spaces-peering-example
=== amerine-peering-demo Peering Info
AWS Account ID: 847227832372
AWS Region: us-east-1
AWS VPC ID: vpc-e291cc85
AWS VPC CIDR: 10.0.0.0/16
Space CIDRs: 10.0.128.0/20, 10.0.144.0/20, 10.0.0.0/20, 10.0.16.0/20
Unavailable CIDRs: 10.1.0.0/16
AWS Account ID
およびAWS VPC ID
フィールドには、AWS 経由でピアリングリクエストを実行するときに必要な情報が含まれます。AWS VPC CIDR
フィールドには、ピアリング相手の Private Space VPC によって使用されている CIDR ブロックが含まれます。Space CIDRs
は、dyno と ELB のアドレスの割り当て元になる CIDR ブロックです。この情報を使用して、(/16
ブロックである AWS VPC CIDR ではなく) CIDR ブロックを VPC 内でルーティングできます。
ピアリング接続を開始する前に、VPC が AWS VPC CIDR
または Unavailable CIDRs
の値と重複していないことを確認してください。
ピアリングリクエストは、AWS CLI または AWS 管理コンソールを使用して開始できます。このガイドでは、AWS コマンドラインユーティリティの create-vpc-peering-connection
コマンドを使用してピアリングを開始する方法を示します。
$ aws ec2 create-vpc-peering-connection --vpc-id vpc-YOUR_VPC_ID --peer-vpc-id vpc-e291cc85 --peer-owner-id 847227832372
{
"VpcPeeringConnection": {
"Status": {
"Message": "Initiating Request to 847227832372",
"Code": "initiating-request"
},
"Tags": [],
"RequesterVpcInfo": {
"OwnerId": "YOUR_AWS_ID",
"VpcId": "vpc-YOUR_VPC_ID",
"CidrBlock": "10.100.0.0/16"
},
"VpcPeeringConnectionId": "pcx-111aaa111",
"ExpirationTime": "2016-09-26T22:57:33.000Z",
"AccepterVpcInfo": {
"OwnerId": "847227832372",
"VpcId": "vpc-e291cc85"
}
}
}
AWS でピアリングリクエストを実行した後、Heroku CLI の spaces:peerings
コマンドを使用してリクエストを追跡できます。対象のピアリングリクエストは、Status
が pending-acceptance
であるエントリです。
$ heroku spaces:peerings spaces-peering-example
=== spaces-peering-example Peerings
PCX ID Type CIDR Block Status VPC ID AWS Region AWS Account ID Expires
──────────── ────────────── ───────────── ────────────────── ────────────────── ───────────────── ────────────── ────────────────────
pcx-111aaa111 unknown 10.100.0.0/16 pending-acceptance vpc-YOUR_VPC_ID YOUR_AWS_REGION YOUR_AWS_ID 2016-09-26T22:57:33Z
****** heroku-managed 10.1.0.0/16 active ****** ****** ******
CLI コマンド spaces:peerings:accept
を使用してピアリング接続を受け入れることができます。次のように、リクエストの PCX ID
を含めます。
$ heroku spaces:peerings:accept pcx-111aaa111 --space spaces-peering-example
Accepting and configuring peering connection pcx-111aaa111
ピアリングリクエストを受け入れた後、spaces:peerings
コマンドを使用して接続の詳細を検査できます。Type
が customer-managed
と表示されている接続が対象です。
$ heroku spaces:peerings spaces-peering-example
=== spaces-peering-example Peerings
PCX ID Type CIDR Block Status VPC ID AWS Region AWS Account ID Expires
──────────── ────────────── ───────────── ────────── ────────────────── ───────────────── ────────────── ────────────────────
pcx-111aaa111 unknown 10.100.0.0/16 active vpc-YOUR_VPC_ID YOUR_AWS_REGION YOUR_AWS_ID 2016-09-26T22:57:33Z
****** heroku-managed 10.1.0.0/16 active ****** ****** ******
Heroku では、特定のアドオンパートナーへのプライベートネットワーク接続を許可するために、Private Space 内の他のピアリング接続を管理します。これらの接続はタイプが heroku-managed
または heroku-postgresql
であり、変更できません。
ルートの設定
ピアリング接続を確立した後、Private Space と VPC の間でパケットをルーティングできるよう、VPC 内のルートテーブルを更新する必要があります。
まず、次の AWS CLI コマンドを使用して VPC のルーティングテーブル ID を取得します。
$ aws ec2 describe-route-tables
使用している VPC と同じ VPC ID を持つルートテーブルを探し、そのルートテーブル ID を取得します。
この時点で、Private Space CIDR 全体に対して 1 つのルートを追加する (こちらを推奨) か、VPC 内のコンポーネントが通信するリソースを含むサブネット用に特定のルートを追加するかを選択できます。
オプション 1: Private Space CIDR ブロック全体に対して 1 つのルートを追加する (推奨)
AWS CLI コマンドの create-route
で、ルーティングテーブルの ID を指定します。
$ aws ec2 create-route --route-table-id rtb-your-route-table-id --destination-cidr-block 10.0.0.0/16 --vpc-peering-connection-id pcx-111aaa111
destination-cidr-block
は Private Space の CIDR 範囲である必要があります。
オプション 2: 特定の Private Space サブネット用に複数のルートを追加する
$ aws ec2 create-route --route-table-id rtb-your-route-table-id --destination-cidr-block 10.0.1.0/20 --vpc-peering-connection-id pcx-111aaa111
destination-cidr-block
引数は、heroku spaces:peering:info
コマンドで指定された Space CIDRs
のいずれかと一致する必要があります。個々の Space CIDRs
に対して create-route
コマンドを実行する必要があります。
セキュリティグループの設定
VPC 内のリソースに割り当てられたセキュリティグループで、Private Space からのトラフィックを許可していることを確認する必要があります。
たとえば、EC2 インスタンス上の Web サーバーがポート 8000
でリッスンしている場合、Private Space 内の dyno IP 範囲 (例: 10.0.144.0/20 および 10.0.128.0/20) のそれぞれからポート 8000
へのアクセスを許可するインバウンドルールを作成する必要があります。
ネットワーク ACL の設定 (上級)
すべてのインバウンドおよびアウトバウンドトラフィックを許可するネットワーク ACL がデフォルトで VPC に設定されており、ほとんどのお客様はセキュリティグループによってリソースレベルでトラフィックを制限します。 組織でネットワーク ACL によってサブネットへのトラフィックを制限している場合、Private Space からのインバウンドトラフィックを許可するトラフィックルールを作成する必要があります。
たとえば、EC2 インスタンス上の Web サーバーがポート 8000
でリッスンしている場合、Private Space 内の dyno IP 範囲 (例: 10.0.144.0/20 および 10.0.128.0/20) のそれぞれからポート 8000
へのアクセスを許可するインバウンドルールを作成する必要があります。
ピアリング接続の破棄
ピアリング接続を削除する必要がある場合、heroku spaces:peerings:destroy
コマンドを使用できます。破棄する接続の PCX ID
を指定します。
$ heroku spaces:peerings:destroy pcx-111aaa111 --space amerine-peering-demo
▸ Destructive Action
▸ This command will attempt to destroy the peering connection pcx-111aaa111
▸ To proceed, type pcx-b3a62eda or re-run this command with --confirm pcx-111aaa111
> pcx-111aaa111
Tearing down peering connection pcx-111aaa111
その他の考慮事項と制限
<appname>-<random-identifier>.herokuapp.com
またはカスタムドメイン名にある Private Space 内の Web プロセスへの接続は、ピアリング接続ではなくパブリックインターネット経由で行われます (Internal Routing) を使用する場合を除く)。- VPC 内の IP アドレスのうち、プライマリ CIDR ブロックに含まれるアドレスにしか接続できません。セカンダリ CIDR ブロックを VPC に追加した場合、それらのブロックは Private Space から到達できなくなります。
- Private Space 内の dyno に VPC から接続することは可能ですが、事前に IP アドレスを知っている必要があります。dyno にはパブリック DNS レコードはありません (Internal Routing) を使用する場合を除く)。
- Private Space 内の Postgres、Kafka、Redis などのデータサービスに、ピアリングされた VPC から直接接続することはできません。
- dyno は、VPC にピアリングされている他のネットワークに直接接続できません。そのような接続を可能にするためには、代わりに VPC 内でプロキシまたはロードバランシングサービスを実行する必要があります。
- 最大 5 つの AWS VPC を Private Space にピアリングできます。5 つを超える VPC を Private Space にピアリングする必要がある場合は、サポートチケットを開いてください。