はじめに
こんにちは。ACS事業部)土居です。
先日Aivenについて紹介しましたが、今回はAivenのVirtual Private Cloud(以降VPCと呼びます。)を試してみます。
Aivenはデフォルトでサービスを作成すると、パブリックに公開にされます。
これは昨今のクラウドサービスを利用する上では当たり前な所ではありますが、昨今はセキュリティの観点もありリソースをそれぞれ閉域ネットワークに閉じる事で通信アクセスもプライベートに制限するケースも多いです。
また、AivenはOSSのデータプラットフォームなので、各パブリッククラウドで利用されているシステムから接続したり相互に連携することが前提であります。
データを取り扱うプラットフォームなので、当然その通信アクセス経路もデフォルトのパブリックではなくプライベートにしたいというニーズがあります。
前置きが長くなりましたが、AivenのVPCはAivenのサービスをパブリッククラウドの仮想ネットワークに作成するサービスです。利用ユーザー側の仮想ネットワークとPeeringができるので、システム側からもAivenサービスにプライベートなアクセスが可能になります。
VPC上でAivenサービスを利用する
AivenのVPCをサービスで利用する流れとしては以下になります。
- AivenでVPCを作成する
- サービスを1.で作成したVPC上に展開する
今回はAzureでPostgreSQLを利用する想定で作成していきます。
まずはAivenコンソールで「VPC」-「Create VPC」を選択し、VPCを作成しましょう。
作成する際に、利用するパブリッククラウドとIPレンジを指定します。IPレンジはPeeringする予定の仮想ネットワークと被らないように注意しましょう。 今回は、Azureの東日本リージョンでIPレンジは「10.0.0.0/24」で作成します。
次はVPC上にPostgreSQLを作成します。「Services」-「Create Service」から作成していきましょう。 Azureのリージョン選択時に、先程作成したVPCが選択できるようになっていますので、VPCを選択してサービスを作成しましょう。
作成されたPostgreSQLですが、デフォルトではパブリックからのアクセスは許可されていません。
When you move your service to a VPC, access from public networks is blocked by default. docs.aiven.io
psql postgres://avnadmin:***********************@doi-test-**-****.aivencloud.com:19872/defaultdb?sslmode=require psql: error: connection to server at "doi-test-**-****.aivencloud.com" (10.0.0.4), port 19872 failed: Connection timed out (0x0000274C/10060) Is the server running on that host and accepting TCP/IP connections?
もしパブリックアクセスも許可したい場合は、「Advanced configuration」から「public_access.pg」を有効にすると、Access Routeに表示される「Public」のURIからアクセスできます。
Aiven VPCとAzureのVirtual NetworkをPeeringする
では、ここからAzure Virtual Networkを準備して、先程作成したAiven VPCとPeeringを設定します。Azure上のVirtual MachineからPostgreSQLにアクセスできるかどうか、Aivenのチュートリアルを参考に進めていきます。
構成の全体像は下記のような形になります。
ポイントとしては、AivenのVPCはAiven社が所有しているAzureサブスクリプション上で管理されているため、テナントを跨いだVirtual NetworkのPeeringの設定が必要になる事です。
そのため、サービスプリンシパル(アプリケーション)をマルチテナントで利用できる形で発行し、必要なAzure権限を割り当てる必要があります。
- まずは、自社のサブスクリプションにVirtual Network(
aiven-test-nw
)とVirtual Machineを作成します。
- 次は赤枠のアプリケーションオブジェクトとサービスプリンシパルの作成を行っていきます。
Azure Active Directoryの「アプリの登録」から新規アプリの作成を行います。
※アプリの登録は、組織として許可されているか、アプリケーション管理者のRoleが必要になります。
適当な表示名を付け、アカウントの種類を「マルチテナント」に設定します。これは、アプリケーション(サービスプリンシパル)をAivenのサブスクリプションからも利用するためです。
アプリケーションの作成ができたら、サービスプリンシパルのクライアントシークレットを発行します。発行されたシークレットの値は必ずコピペしてメモっておきましょう。
- 続いて、赤枠のアプリケーションオブジェクトとサービスプリンシパルを準備していきます。
以下コマンドを使って、グローバルに登録されているAivenアプリケーションオブジェクト(55f300d4-fc50-4c5e-9222-e90a6e2187fb
)に対してサービスプリンシパルを設定します。
az ad sp create --id 55f300d4-fc50-4c5e-9222-e90a6e2187fb
サービスプリンシパルが作成されると、「Azure Active Directory」-「エンタープライズアプリケーション」の画面で、以下のようにaiven-prod-executor
が表示されます。
- 作成した2つのサービスプリンシパルに
aiven-test-nw
への権限を付与していきます。
Aivenから利用するサービスプリンシパルへの権限付与は、できるだけ特定の機能に限定するほうがセキュリティ上好ましいです。
そのため、Azureの組み込みRoleではなくカスタムロールを利用します。
下記を参考に「サブスクリプション」-「アクセス制御(IAM)」-「カスタムロールを作成する」からPeeringのActionのみ実行できるRoleを作成しましょう。
カスタムロールの作成が完了したら、各サービスプリンシパルにaiven-test-nw
をスコープに適切なRoleを付与します。
- Aivenコンソールから、VPCのPeering設定を行います。
Aivenコンソールの「VPC」から作成したVPCを選択し、「VPC Peering connections」を設定します。
設定項目 | 設置値 |
---|---|
Azure Subscription ID | 自社のサブスクリプションIDを入力します |
Resource Group | aiven-test-nw が所属するResource Group名(aiven-test )を入力します |
Network name | aiven-test-nw を入力します |
Active Directory tenant ID | 自社のAzure Active DirectoryのテナントIDを入力します |
Application Object ID | ここには、作成したアプリケーションオブジェクト(aiven-vpc-app )のIDを入力します |
Application Object ID
にaiven-vpc-app
のIDを入力することで、Aiven側のテナントでも自動的にVPCへの権限を付与したサービスプリンシパルが作成されます。
これにより、サービスプリンシパルで複数テナントにアクセスすることが可能となります。
設定後、しばらく経過するとPeering connectionsのState
がPending peer
と表示されます。
ここで、Pending peer
にカーソルを合わせると、Peeringの設定詳細を確認できます。
ここで表示される、Aiven tenant ID
とVPCのリソースID
は控えておきましょう。
- 最後に、
aiven-test-nw
側からもPeeringの設定を行います。
aiven-test-nw
側のPeeringを行うには、AivenのVPCとaiven-test-nw
の両方を触れるように、作成したサービスプリンシパルにログインを行う必要があります。
発行したクライアントシークレットを使ってサービスプリンシパルにaz login
で各テナントにログインしましょう。
az login --service-principal -u <Service Principal Client ID> -p <Client Secret> --tenant <自社のtenant ID> az login --service-principal -u <Service Principal Client ID> -p <Client Secret> --tenant <Aiven tenant ID>
両方のテナントにログインできたら、az network vnet peering create
コマンドでPeeringの設定を行います。
az network vnet peering create --name <peering name> --remote-vnet <VPCのリソースID> --vnet-name aiven-test-nw --resource-groupaiven-test --subscription <自社のtenant ID> --allow-vnet-access
az network vnet peering create
が正常に完了したら、
aiven-test-nw
のピアリング状態が接続済み
、VPCのPeering connectionsのState
がPending peer
からActive
に変更されます。
これでAivenのVPCとaiven-test-nw
が正常にPeeringできました。
- Virtual Machineから疎通確認を行います。
Virtual Machineからnslookup
とpsqlを実行してみました。
無事Peeringされた閉域ネットワーク経路でアクセスされていることが分かります。
C:\Users\azureuser>nslookup Default Server: UnKnown Address: 168.63.129.16 > doi-test-**-****.aivencloud.com Server: UnKnown Address: 168.63.129.16 Non-authoritative answer: Name: doi-test-**-****.aivencloud.com Address: 10.0.0.4
C:\Program Files\PostgreSQL\15\bin>psql postgres://avnadmin:***********************@doi-test-**-****.aivencloud.com:19872/defaultdb?sslmode=require psql (15.2, server 14.6) WARNING: Console code page (437) differs from Windows code page (1252) 8-bit characters might not work correctly. See psql reference page "Notes for Windows users" for details. SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off) Type "help" for help. defaultdb=>
おわりに
いかがだったでしょうか?AivenのVPCを利用すると、既存で利用しているシステムのネットワークとも柔軟な接続が可能です。
是非Aivenをお手元でも活用してみて下さい。
私達ACS事業部はAzureのクラウドネイティブ技術を軸に内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。
また、一緒に働いていただける仲間も募集中です!
切磋琢磨しながらスキルを向上できる、エンジニアには良い環境だと思います。ご興味を持っていただけたら嬉しく思います。