概要
Oracle Cloud Infrastructure (OCI)で作成したMySQL HeatWave DBシステムは、セキュリティのためプライベートIPアドレスしか持ちません。これを外部(今回はMac)のMySQLクライアントから接続するために、ネットワーク・ロード・バランサ(NLB)を経由する方法を試しました。その際の手順と、つまずいたポイントをメモとしてまとめます。
1. 前提
- OCI上にVCN(仮想クラウド・ネットワーク)とサブネットが作成済み。
- MySQL HeatWave DBシステムが作成済みで、プライベートIPアドレス(例:
10.0.0.172
)がわかっている。 - 【今回の構成】 DBシステムと、後から作成するNLBは、両方とも同じパブリック・サブネットに配置。
2. ネットワーク・ロード・バランサ (NLB) の作成
インターネットからの接続を受け付けるためのパブリックな窓口としてNLBを作成します。
- 可視性タイプ: 「パブリック」を選択し、パブリックIPアドレスを割り当てる。
- VCNとサブネット: DBシステムと同じVCNとパブリック・サブネットを選択。
-
リスナーの構成:
- プロトコル:
TCP
- ポート:
3306
(MySQLのデフォルトポート)
- プロトコル:
-
バックエンド・セットの構成:
- 【重要ポイント①】 「ソースの保持」のチェックボックスをオフにする。これをしないと、バックエンドにIPアドレスを指定できません。
-
バックエンドの追加:
- バックエンド・タイプとして「IPアドレス」を選択。
- DBシステムのプライベートIPアドレス(例:
10.0.0.172
)とポート3306
を指定する。
3. ヘルスチェックの設定修正
NLBがDBシステムの状態を正しく監視できるように設定します。ここの設定ミスが原因で、ヘルスチェックが長時間「クリティカル」(赤色)のままでした。
- NLBの「バックエンド・セット」の詳細画面に移動。
- 「ヘルス・チェック」の項目を編集。
-
【重要ポイント②】 プロトコルを
HTTP
からTCP
に変更する。- (理由: MySQLはHTTPプロトコルに応答しないため、HTTPのままだとヘルスチェックが必ず失敗します。)
4. ファイアウォールの設定(2段階)
OCIのファイアウォールは「セキュリティ・リスト」と「ネットワーク・セキュリティ・グループ(NSG)」の2層構造です。
【重要】AWSとの違い:ファイアウォールの評価ルール
OCIのファイアウォール用語は、AWSの用語に以下のように対応付けると理解しやすいです。
-
OCI: セキュリティ・リスト (Security List)
- AWSでいう「ネットワークACL」に相当します。サブネット全体に適用されるファイアウォールです。
-
OCI: ネットワーク・セキュリティ・グループ (NSG)
- AWSの「セキュリティグループ」に相当します。インスタンスなどのリソース単位で適用されるファイアウォールです。
ここからが重要なのですが、これらのファイアウォールの関係性は、OCIとAWSで根本的に異なります。
-
OCIの場合:「OR条件」
- 通信は、「セキュリティ・リスト」か「NSG」のどちらか一方でも許可されていれば通過します。
-
AWSの場合:「AND条件」
- 通信は、「ネットワークACL」と「セキュリティグループ」の両方で許可されていなければ通過できません。
この違いのため、AWSの感覚で「サブネット側(セキュリティ・リスト)は広く全許可にしておき、インスタンス側(NSG)で厳しく絞る」という設定をOCIで行うと、NSGのルールは実質的に無視され、意図せず全世界にポートを公開してしまう危険性があります。
この「OR条件」は、AWS経験者がOCIを触る際に最もつまずきやすいポイントの一つなので、特に注意が必要です。
a) ネットワーク・セキュリティ・グループ (NSG) の設定
目的: 自分のMacからの接続のみを許可する。
- 新しいNSGを作成する。(例:
NSG-for-MySQL-NLB
) - 作成したNSGに イングレス・ルール(内向き) を追加する。
-
ソースCIDR: 自分のPCのグローバルIPアドレス/32 (例:
72.14.201.171/32
) -
IPプロトコル:
TCP
-
宛先ポート範囲:
3306
-
ソースCIDR: 自分のPCのグローバルIPアドレス/32 (例:
- 作成したNSGをネットワーク・ロード・バランサに関連付ける。
b) セキュリティ・リストの設定
目的: NLBからDBシステムへのヘルスチェック通信を許可する。
- DBシステムとNLBが属するパブリック・サブネットのセキュリティ・リストを編集する。
-
イングレス・ルール(内向き) を追加する。
-
ソースCIDR: サブネット自体のCIDRブロック (例:
10.0.0.0/24
) -
IPプロトコル:
TCP
-
宛先ポート範囲:
3306
- (理由: このルールがないと、同じサブネット内であってもNLBからDBへの通信がブロックされ、ヘルスチェックが失敗します。)
-
ソースCIDR: サブネット自体のCIDRブロック (例:
5. MacのMySQLクライアントから接続
すべての設定が完了すると、NLBのヘルスチェックが「OK」(緑色)になります。
-
接続情報:
- ホスト: ネットワーク・ロード・バランサのパブリックIPアドレス
-
ポート:
3306
- ユーザー: DBシステム作成時に設定したデータベースのユーザー名
- パスワード: 上記ユーザーのパスワード
-
コマンドラインでの接続:
mysql -h <NLBのパブリックIP> -u <DBユーザー名> -p
以上の手順で、無事に外部からMySQL HeatWaveに接続できるようになりました。特にヘルスチェックのプロトコルと、2段階のファイアウォール設定(特にAWSとのルールの違い)が重要なポイントでした。