PrivateLink 経由で Private または Shield の Heroku Postgres データベースに接続する
最終更新日 2023年05月30日(火)
Table of Contents
この記事では、AWS PrivateLink を使用して、AWS VPC と、Private Space または Shield Private Space で実行されている Heroku Postgres データベースの間に安全な接続を作成する方法について説明します。このプロセスは、大きく分けて 3 つの手順で構成されます。
- エンドポイントサービスを Heroku Postgres データベース上に作成する
- エンドポイントネットワークインターフェースを AWS VPC に作成する
- 2 つのエンドポイント間に安全な接続を確立する
接続のセットアップの一環として、承認されたアカウントのリストを指定し、VPC から Heroku Postgres データベースへのアクセスを制限することができます。
この機能を使用するには、作成した Amazon VPC エンドポイントを、Heroku Postgres データベースと同じリージョンにあるサブネットにプロビジョニングする必要があります。
Heroku の前提条件
PrivateLink エンドポイントをセットアップするには、次の Heroku リソースが必要です。
Private Space。この記事で、Heroku Dashboard または Heroku CLI を使用して Private Space を作成する方法を説明しています。
Shield Private Space。この記事で、Heroku Dashboard または Heroku CLI を使用して Shield Private Space を作成する方法を説明しています。
Private Space または Shield Private Space で、Heroku Postgres データベースをアタッチした状態で実行されている Heroku アプリ。Private Space または Shield Private Space で実行されているすべての Heroku Postgres インスタンスでは、それぞれ
private
またはshield
プランタイプのいずれかを使用します。
Heroku エンドポイントのプロビジョニング
手順 1: PrivateLink CLI プラグインを使用して Heroku Data をインストールする
$ heroku plugins:install @heroku-cli/plugin-data-privatelink
手順 2: AWS アカウント ID を取得する
AWS アカウント ID は、次のように AWS CLI を使用して取得できます。
$ aws sts get-caller-identity --output text --query 'Account'
123456789101
このコマンド例では、アカウント ID 123456789101
が返されています。
アカウント ID は AWS アカウントの My Account (マイアカウント) ページから取得することもできます。アカウント ID は Account Settings (アカウント設定) セクションに表示されます。
手順 3: PrivateLink エンドポイントの作成
次の Heroku CLI コマンドを使用して、PrivateLink エンドポイントを作成します (値の置き換えに注意してください)。
$ heroku data:privatelink:create POSTGRESQL_ADDON_NAME --aws-account-id ACCOUNT_ID --app APP_NAME
POSTGRESQL_ADDON_NAME
は、Heroku Postgres データベースの名前に置き換えます (例: postgresql-sushi-12345
)。APP_NAME
を自分のアプリ名に置き換えます。ACCOUNT_ID
は、Heroku Postgres データベースへのアクセスを許可する AWS アカウントに置き換えます。次のいずれかのパターンに一致する ID を指定してください。- account-id
- account-id:user/username
- account-id:role/rolename
--aws-account-id
フラグを複数回指定して、複数のアカウントを含めることができます。
次に示すのは、コマンドとそれに伴う出力の例です。
$ heroku data:privatelink:create postgresql-sushi-12345 --aws-account-id 123456789101:user/abc.xyz --app privatelink-vpc-endpoint-demo
Creating privatelink... done
Service Name: Provisioning
Status: Provisioning
The privatelink is now being provisioned for postgresql-sushi-12345.
Run heroku data:privatelink:wait postgresql-sushi-12345 -a APP to check the creation process.
新しい PrivateLink エンドポイントが利用可能になるまで、通常 5 ~ 10 分かかります。heroku data:privatelink:wait postgresql-sushi-12345 --app APP_NAME
で進捗状況を追跡できます。
手順 4: エンドポイントのサービス名を取得する
PrivateLink エンドポイントのプロビジョニングが終了したら、次のコマンドを使用してその詳細を表示します。
$ heroku data:privatelink POSTGRESQL_ADDON_NAME --app APP_NAME
POSTGRESQL_ADDON_NAME
は Heroku Postgres データベースの名前に、APP_NAME
はアプリの名前にそれぞれ置き換えます。
次に示すのは、コマンドとそれに伴う出力の例です。
$ heroku data:privatelink postgresql-sushi-12345 --app privatelink-vpc-endpoint-demo
=== privatelinks for postgresql-sushi-12345
Service Name: com.amazonaws.vpce.us-east-1.vpce-svc-0410a2e25933fe8ec
Status: Operational
=== Allowed Accounts
ARN Status
arn:aws:iam::123456789101:user/abc.xyz Active
Your privatelink is now operational.
You must now copy the Service Name and follow the rest of the steps listed in https://devcenter.heroku.com/articles/heroku-postgres-via-privatelink.
コマンドの出力から Service Name
フィールドの値をコピーします (上記の例では、値は com.amazonaws.vpce.us-east-1.vpce-svc-0410a2e25933fe8ec
)。この値は、Amazon VPC エンドポイントをプロビジョニングするために必要になります。
Amazon VPC エンドポイントのプロビジョニング
このセクションの手順は、Amazon VPC ダッシュボードから実行します。
手順 1: セキュリティグループを作成して設定する
適切な ingress セキュリティルールを持つセキュリティグループがエンドポイントに必要です。VPC ダッシュボードの Security Groups
(セキュリティグループ) タブで Create security group
(セキュリティグループの作成) をクリックします。
Create
(作成) をクリックする前に、適切なセキュリティグループの名前と説明を指定し、目的の VPC を選択します。
新しく作成したセキュリティグループをリストから選択して Actions > Edit inbound rules
(アクション > インバウンドルールの編集) をクリックします。
任意の有効な IP アドレスからポート 5432–5433
への TCP アクセスを有効にして Save rules
(ルールの保存) をクリックします。
手順 2: エンドポイントの作成
VPC ダッシュボードの Endpoints
(エンドポイント) タブに移動して Create Endpoint
(エンドポイントの作成) をクリックします。
表示された 「Create Endpoint」 (エンドポイントの作成) フォームで、Find service by name (サービスを名前で検索) オプションを選択して、以前に取得した Service Name
の値を貼り付けます。
Verify
(確認) をクリックして、利用可能なサブネットのリストを表示します。
以前に作成したセキュリティグループを VPC エンドポイントにアタッチして Create endpoint
(エンドポイントの作成) をクリックします。
エンドポイントは pending acceptance
の初期ステータスで作成され、5 ~ 10 分後に available
に遷移します。
Heroku と Amazon VPC エンドポイントの接続
Amazon VPC エンドポイントが available
になったら、VPC が Heroku Postgres データベース (DATABASE_ENDPOINT_ID_URL
) および PgBouncer (DATABASE_ENDPOINT_ID_PGBOUNCER_URL
) と通信できるようにするために、Heroku によって作成される環境設定から URL を取得できます。
PgBouncer は、Heroku Postgres データベース用の接続プールを設定できるようにするサービスです。Heroku Postgres での接続プールの詳細を参照してください。
まず、PrivateLink エンドポイントのエンドポイント ID を取得し、その末尾の 17 文字の文字列を抽出します。この文字列を大文字に変換して、下記のコマンドで使用します。
たとえば、エンドポイント ID が vpce-01c87ae3c05563935
の場合、使用する文字列は 01C87AE3C05563935
です。
取得した文字列でプレースホルダーを置き換えて、次のコマンドを実行します。
$ heroku config --app your_app_name | grep ENDPOINT_ID_HERE
AWS VPC エンドポイント接続 URL と、それに対応した Heroku Postgres データベース用の接続文字列が表示されます。接続文字列は次の形式です。
postgres://user:password@vpc-endpoint-dns-name:5432/database
この接続文字列を使用して、AWS VPC 内のアプリケーションをプライベートの Heroku Postgres データベースと PgBouncer インスタンスに接続できるようになりました。次に示すのは、コマンドとそれに伴う出力の例です。
$ heroku config --app privatelink-vpc-endpoint-demo | grep 01C87AE3C05563935
DATABASE_ENDPOINT_01C87AE3C05563935_URL: postgres://abcdefghijklmn:abcdefghijklmnopqrstuvwxyz123456789101112131415161718192021222324@ec2-3-83-63-168.compute-1.amazonaws.com:5432/dd0k757ojc5qt
DATABASE_ENDPOINT_01C87AE3C05563935_PGBOUNCER_URL: postgres://abcdefghijklmn:abcdefghijklmnopqrstuvwxyz123456789101112131415161718192021222324@ec2-3-83-63-168.compute-1.amazonaws.com:5433/dd0k757ojc5qt
この機能の使用に関して問題または気になる点がある場合は、サポートチケットを開いてください。
VPC エンドポイント経由で EC2 から Heroku Postgres に接続する
VPC エンドポイントを設定し終えたら、AWS VPC に EC2 インスタンスを作成して、Heroku Postgres に接続できます。
EC2 ダッシュボードで Launch Instance
(インスタンスの起動) をクリックして、AMI とインスタンスの種類を選択します。この例では、Ubuntu t2.micro インスタンスが作成されます。
インスタンスの詳細を設定するときは、以前に作成したセキュリティグループがある VPC ネットワークを選択し、適切なサブネットを選択します。Review and Launch
(確認と起動) をクリックして EC2 インスタンスを起動します。
インスタンスのステータスが running
に遷移し、すべてのステータスチェックに合格したら、インスタンスの作成中に指定した SSH キーペアを使用してインスタンスに接続します。
接続したら、次のコマンドで EC2 インスタンスに Postgres をインストールします。
$ sudo apt-get -qq update && sudo apt-get install -y curl ca-certificates
$ curl -s https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
$ sudo apt-get -qq update
$ sudo apt-get install -y postgresql-client-10
その後、次のコマンドを使用して、EC2 インスタンスから Heroku Postgres データベースに接続できます。
$ psql postgres://user:password@vpc-endpoint-dns-name:5432/database
次のスクリーンショットは、サンプルの EC2 インスタンスの内部から Heroku Postgres データベースに接続するために使用する接続文字列を示しています。
制限
- 作成した Amazon VPC エンドポイントは、Heroku Postgres データベースと同じリージョンにあるサブネットにプロビジョニングする必要があります。
- Heroku Postgres データベースへのアクセスが 100% 安全であることを保証するために VPC のセキュリティを検証するのはお客様の責任です。
Private Space の信頼済み IP 範囲との比較
Private Spaces では、データサービス用の信頼済み IP 範囲をベータ機能としてサポートしています。この機能は、Private Space 境界の外側から Heroku Postgres データベースに接続する必要がある場合の選択肢です。ただし、この機能を有効にするには Heroku に連絡する必要があり、きめ細かなアクセス制御はこの機能には利用できません。
AWS PrivateLink 経由で接続することにより、データベースはお客様自身の VPC の一部として扱われ、ユーザーとロールの集合へのアクセスをお客様が制限できます。したがって、お客様のユースケースで利用可能な場合は常に、こちらの手法を推奨します。