PrivateLink を使用した Private または Shield Space 内の Heroku Data for Redis への接続
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2023年09月20日(水)
Table of Contents
この記事では、AWS PrivateLink を使用して、AWS VPC と、Private Space または Shield Private Space で実行されている Heroku Data for Redis アドオンの間の安全な接続を作成する方法について説明します。このプロセスは、大きく分けて 3 つの手順で構成されます。
- Private または Shield Heroku Data for Redis アドオンでのエンドポイントサービスを作成する
- エンドポイントネットワークインターフェースを AWS VPC に作成する
- 2 つのエンドポイント間に安全な接続を確立する
接続の設定の一部として、承認されたアカウントのリストを指定し、VPC からプライベートアドオンへのアクセスを制限することができます。
この機能を使用するには、作成する Amazon VPC エンドポイントが、Heroku Data for Redis アドオンと同じリージョンにあるサブネットにプロビジョニングされている必要があります。
Heroku の前提条件
PrivateLink エンドポイントを設定するには、次の Heroku リソースが必要です。
Private Space または Shield Private Space。Heroku Dashboard か Heroku CLI のどちらかを使用して Private Space または Shield Private Space を作成します。
Heroku Data for Redis アドオンがアタッチされた、Private Space または Shield Private Space で実行されている Heroku アプリ。Private Space で実行されている Heroku Data for Redis インスタンスはすべて、
private
プランタイプのいずれかを使用します。Shield Private Space で実行されている Heroku Shield for Redis インスタンスはすべて、shield
プランタイプのいずれかを使用します。
Heroku エンドポイントのプロビジョニング
手順 1: PrivateLink CLI プラグインを使用して Heroku Data をインストールする
$ heroku plugins:install 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 REDIS_ADDON_NAME --aws-account-id ACCOUNT_ID --app APP_NAME
REDIS_ADDON_NAME
は、Redis アドオンの名前に置き換えます (例: redis-sushi-12345
)。APP_NAME
を自分のアプリ名に置き換えます。ACCOUNT_ID
は、Redis アドオンへのアクセスを受け取るべき AWS アカウントに置き換えます。次のいずれかのパターンに一致する ID を指定してください。- account-id
- account-id:user/username
- account-id:role/rolename
--aws-account-id
フラグを複数回指定して、複数のアカウントを含めることができます。
次に示すのは、コマンドとそれに伴う出力の例です。
$ heroku data:privatelink:create redis-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 redis-sushi-12345.
Run heroku data:privatelink:wait REDIS_URL -a APP to check the creation process.
新しい PrivateLink エンドポイントが利用可能になるまで、通常 5 ~ 10 分かかります。heroku data:privatelink:wait REDIS_URL --app APP_NAME
で進捗状況を追跡できます。
手順 4: エンドポイントのサービス名を取得する
PrivateLink エンドポイントのプロビジョニングが終了したら、次のコマンドを使用してその詳細を表示します。
$ heroku data:privatelink REDIS_ADDON_NAME --app APP_NAME
REDIS_ADDON_NAME
を Private Redis アドオンの名前に置き換え、APP_NAME
をアプリの名前に置き換えます。
次に示すのは、コマンドとそれに伴う出力の例です。
$ heroku data:privatelink redis-sushi-12345 --app privatelink-vpc-endpoint-demo
=== privatelinks for redis-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-redis-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 (セキュリティグループの作成) をクリックします。
適切なセキュリティグループ名と説明を指定し、目的の VPC を選択してから Create (作成) をクリックします。
一覧から新しく作成されたセキュリティグループを選択し、Actions > Edit inbound rules (アクション> インバウンドルールの編集) をクリックします。
すべての有効な IP アドレスからポート 6379
への 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 Data for Redis アドオンと通信できるようにするための URL を取得できます。
まず、PrivateLink エンドポイントのエンドポイント ID を取得し、その末尾の 17 文字の文字列を抽出します。この文字列を大文字に変換して、下記のコマンドで使用します。
たとえば、エンドポイント ID が vpce-01c87ae3c05563935
である場合、このエンドポイント ID は 01C87AE3C05563935
になります。
取得した文字列でプレースホルダーを置き換えて、次のコマンドを実行します。
$ heroku config --app your_app_name | grep ENDPOINT_ID_HERE
このコマンドは、AWS VPC エンドポイントの接続 URL と、Redis アドオンの対応する接続文字列を表示します。接続文字列は次の形式です。
redis://user:password@vpc-endpoint-dns-name:6379
これで、この接続文字列を使用して、AWS VPC 内のアプリケーションをプライベートの Heroku Data for Redis アドオンに接続できるようになりました。次に示すのは、コマンドとそれに伴う出力の例です。
$ heroku config --app privatelink-vpc-endpoint-demo | grep 01C87AE3C05563935
REDIS_ENDPOINT_01C87AE3C05563935_URL: redis://user:password@vpc-endpoint-dns-name:6379
この機能の使用に関して問題または気になる点がある場合は、サポートチケットを開いてください。
VPC エンドポイントを使用した EC2 から Heroku Data for Redis への接続
VPC エンドポイントを設定したら、AWS VPC 内に Heroku Data for Redis に接続するための EC2 インスタンスを作成できます。
EC2 ダッシュボードで Launch Instance (インスタンスの起動) をクリックし、AMI とインスタンスの種類を選択します。この例では、Ubuntu t2.micro インスタンスが作成されます。
インスタンスの詳細を設定するときは、以前に作成したセキュリティグループがある VPC ネットワークを選択し、適切なサブネットを選択します。Review and Launch (確認して起動) をクリックし、EC2 インスタンスを起動します。
インスタンスのステータスが running
に移行し、すべてのステータスチェックに合格したら、インスタンスの作成中に指定した SSH キーのペアを使用してそのインスタンスに接続します。
インスタンスに接続されたら、接続文字列を使用して Redis に安全に接続します。ただし、ポート番号は、Stunnel 経由で接続するときの 6380
ではなく、6379
であることに注意してください。
次の出力は、Ruby でサンプルの EC2 インスタンス内から Heroku Data for Redis アドオンに接続するために使用されている接続文字列を示しています。
ᐅ ssh ubuntu@ec2-1-2-3-4.compute-1.amazonaws.com
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-1021-aws x86_64)
...<snip>...
ubuntu@ip:~$ sudo apt install ruby && sudo gem install redis
...<snip>...
ubuntu@ip:~$ irb
irb(main)> require "redis"
=> true
irb(main)> url = URI.parse("redis://password@vpce-id-secret.vpce-svc-id.us-east-1.vpce.amazonaws.com:6379")
irb(main)> url.scheme = "rediss"
irb(main)> $redis = Redis.new(url: url, driver: :ruby, ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE })
irb(main)> $redis.ping
=> "PONG"
制限
- 作成する Amazon VPC エンドポイントは、Heroku Data for Redis アドオンと同じリージョンにあるサブネットにプロビジョニングされている必要があります。
- ユーザー独自の VPC と Heroku Data VPC の間で共通のアベイラビリティーゾーン内の Private Redis アドオンにしか接続できません。
- Heroku Data for Redis アドオンへの完全に安全なアクセスを確保するために VPC のセキュリティを確認することはユーザーの責任です。