はじめに
こんにちは!BBSakura NetworksでOCXのバックエンド開発をしている秋山です。
OCXとはBBSakura Networksが提供している、オンデマンドで閉域網を構築できるネットワークサービスです。
OCXの詳細や仕組みなどは以下の記事にて解説しています。
OCXはより使いやすく、より多様なネットワークの構築ができるように日々アップデートを重ねており、先日新たなクラウドの接続先としてOracleの提供を開始しました。
本記事ではOCXの使い方の一例として、Amazon Web Services (AWS)と新たに追加されたOracle Cloud infrastructure(OCI)を閉域接続する手順について解説します。記事の終盤では各インスタンスを実際に動かし、クラウド間閉域接続を取り入れた簡単な口コミ投稿サイトの作り方についても解説します。
構成
本記事では最終的に以下のような構成を作ります。AWSのインスタンスとOCIのインスタンスを閉域網で疎通できるようにします。 今回の構成はあくまで一例であるため、環境によって適宜入力項目を書き換えて下さい。
目次
本記事は以下の順番で説明をします。
本記事ではAWS、OCI、OCXそれぞれのアカウント設定(IAMやコンパートメントなど)は完了していることを前提としています。
- 0. 下準備(AWSとOCIの内部ネットワーク構築)
- このセクションではAWSとOCIの内部ネットワークの構成手順について解説します。OCXとの接続は次のセクションで行うため、OCXとの接続方法だけを知りたい方、既に内部ネットワークを構築済みの方は読み飛ばして下さい。
- 1. OCXの活用(CloudConnectionとOCXRouterを用いた閉域網構築)
- このセクションではOCXポータルを用いてOCX内で閉域網を構築する手順や各クラウドとOCXを繋ぐ手順について解説します。
- 2. webサーバ及びDBサーバの構築
- 各クラウドに作ったインスタンスを実際にwebサーバ、DBサーバとして動かしてみます。OCXでの操作等はなく、できるものもおまけ程度なので読み飛ばしても大丈夫です。
0. 下準備(AWSとOCIの内部ネットワーク構築)
AWSの構築手順
AWSコンソールを操作し、以下のようなネットワークを作ることを目指します。
VPCの作成
まずAWSコンソールからVPCを作成します。
- AWSコンソールで「VPC」と検索し、VPCの作成を押します。
以下の情報を参考に、VPCを作成します 。
作成するリソース:VPCなど 名前タグの自動生成:自動生成有効、ocx-techblog IPv4CIDRブロック:10.30.0.0/16 IPv6CIDRブロック:IPv6 CIDR ブロックなし テナンシー:デフォルト アベイラビリティゾーン (AZ) の数 :1 パブリックサブネットの数:1 プライベートサブネットの数:0 ap-northeast-1a のパブリックサブネット CIDR ブロック:10.30.0.0/24 NAT ゲートウェイ:なし VPC エンドポイント:なし DNSオプション:両方有効
インスタンスの作成
先ほど作成したVPC内にインスタンスを作成します。
AWSコンソールで「EC2」と検索し、インスタンスを起動を押します。
以下の情報を参考に、インスタンスを起動します。
名前とタグ:ocx-techblog-webserver アプリケーションおよび OS イメージ (Amazon マシンイメージ): クイックスタート→Amazon Linux→Amazon Linux 2 AMI (HVM), Kernel 5.10 x86_64 インスタンスタイプ:t2.micro キーペア:新しいキーペアの作成 ネットワーク設定:編集ボタンを押す VPC :(ocx-techblog-vpc)を選択 サブネット: ocx-techblog-subnet-public パブリック IP の自動割り当て:有効化 ファイアウォール (セキュリティグループ):セキュリティグループを作成する セキュリティグループ名:ocx-teckblog-sg それ以下の項目:デフォルトのまま
なお、インスタンスのキーペアは以下のように作成し、ダウンロードしておきます。
インスタンスを作成したら、インスタンスの詳細から「セキュリティ」→「セキュリティグループ」と移動します。
- セキュリティグループの詳細からインバウンドルールのインバウンドルールを編集を押し、全てのソースからのSSH、ICMP、HTTPアクセスを有効にします。
仮想プライベートゲートウェイの作成
VPC内にさらに仮想プライベートゲートウェイを作成します。
AWSコンソールで「Direct Connect」と検索して「仮想プライベートゲートウェイを作成する」を押し、以下を参考に作成します。この時、リージョンが作りたい場所を指しているかに注意します。
名前タグ:ocx-techblog-vgw 自律システム番号 (ASN):Amazon デフォルト ASN タグ:デフォルトのまま
作成した仮想プライベートゲートウェイを選択し、「アクション」から「VPCへアタッチ」を選択します。アタッチ先には自分のVPCを指定します。
作成後は仮想プライベートゲートウェイの詳細からASNを確認します。
OCIの構築手順
OCIコンソールを操作し、以下のようなネットワークを作ることを目指します。
VCNの作成
まずOCIコンソールからVCNを作成します。
OCIコンソールで「VCN」と検索し、「Start VCN Wizard」を押し、Create VCN with Internet Connectivityを選択します。
以下の情報を参考に、VCNを作成します。
名前タグ:ocx-techblog-vgw 自律システム番号 (ASN):Amazon デフォルト ASN タグ:デフォルトのまま
VCNの詳細からパブリックサブネットの詳細を選択します。
セキュリティリストの詳細からイングレスルールの追加を押し、全てのソースからのSSH、ICMP、作成したAWSVPCのアドレスからのMySQLアクセスを有効にします。
インスタンスの作成
先ほど作成したVCN内にインスタンスを作成します。
OCIコンソールで「インスタンス」と検索し、インスタンスの作成を押します。
以下の情報を参考に、インスタンスを起動します。
Name: instance-20231005-ocx-techblog Create in compartment: 自分のCompartment Placement: AD1(Tokyo-1) Shielded instance: Disabled Image: Oracle Linux 8 Shape: VM.Standard.E4.Flex(デフォルト) VNIC name: なし Primary network: Select existing virtual cloud network VCN in 自分の :ocx-techblog Subnet: Select existing subnet Subnet in 自分の: ocx-techblog-public Private IPv4 address: Automatically assign private IPv4 address Public IPv4 address: Automatically assign public IPv4 address Add SSH keys: Generate a key pair for me→Save private keyからダウンロード その他項目:デフォルトのまま
DRGの作成
VCN内にさらにDynamic Routing Gateway(DRG)を作成します。
- OCIコンソールで「DRG」と検索して「ダイナミックルーティングゲートウェイの作成」を押し、作成します。
- 作成したDRGの詳細を選択し、作成したVCNへのアタッチメントの作成を行います。
1. OCXの活用(CloudConnectionとOCXRouterを用いた閉域網構築)
AWSとOCI内にそれぞれ、以下のような基本的な構成を持っているとします。 それぞれのネットワークはインターネットへの疎通性があるため、サーバ間をインターネット経由で接続することが可能です。 しかし、ビジネスやシステムの要件が高まるにつれ、BGP経路ジャックやDDoS攻撃など、インターネット経由の接続がリスクを伴う可能性が増してきます。 このような背景を考慮して、OCXはインターネットを介さない閉域網をオンデマンドで構築・提供するサービスを提供しています。このセクションではOCXポータルから実際に閉域網を構築し、その閉域網とクラウド間を接続する手順について説明します。
AWSとの接続
OCX及びAWSのコンソールを操作し、以下のようなネットワークを構築することを目指します。
Cloud Connectionの作成
OCXポータルからCloud Connectionを作成し、AWSとの接続を行います。
OCXポータルのメニューから「Cloud Connection」→「Create」→「AWS」を選択します。
ロケーション、名前、速度を入力して次へを押します。
AWS Account IDを入力します。
各項目を確認したら作成します。
AWSコンソールからDirect Connectの「接続」を確認し、先ほど作成したCloud Connectionと同じdxconのIDを持つ回線の詳細へ移動します。
接続を承認します。
承認完了後、その回線の仮想インターフェース(VIF)を作成します。
以下を参考にVIFの各項目を入力します。
仮想インターフェイスのタイプ:プライベート 仮想インターフェイス名: ocx-techblog-vif 接続:デフォルト(CC指定のsiteと一致しているか確認) 仮想インターフェイスの所有者:自分の AWS アカウント ゲートウェイタイプ:仮想プライベートゲートウェイ 仮想プライベートゲートウェイ:ocx-techblog-vgw Virtual Local Area Network (VLAN):2 BGP ASN:65000 追加設定 アドレスファミリー:IPv4 ルーターのピア IP:10.128.30.1/24 Amazon ルーターのピア IP:10.128.30.2/24 BGP 認証キー:helloocx その他項目:デフォルトのまま
ピアリング設定が作られていることを確認します。
OCX Routerの作成
OCX内にOCX Routerを作成し、BGPセッションの準備をします。 1. OCXポータルのメニューから「OCX Router(v1)」→ +マークを選択し、以下を参考にOCX Routerのインスタンスを作成します。 2. 各項目を確認して作成します。 3. OCX Routerのインスタンスを選択し、「Create Interface」を選択し、Local IPv4 Addressに10.128.30.1/24を指定してOCX RouterのInterfaceを作成します。 4. 各項目を確認して作成します。 5. 作成したOCX RouterのInterfaceを選択し、「BGP Parametersタブ」からBGP Parameterの作成をします。 6. 以下を参考にOCX RouterのBGP Parameterを作成します。
Virtual Circuit(VC)の作成
OCX内に作ったOCX RouterとCloud Connection間をVCを使って接続し、BGPセッションを確立します。 1. OCXポータルのメニューから「Virtual Circuits(VCs)」→「Create」を選択し、名前を入力し作成します。 2. 作成したVCのアタッチアイコンを選択します。 3. VCのアタッチ先としてCloud Connectionを選択します。 4. 表示されるCloud Connection一覧から先ほど作ったAWSのCloud Connectionを選択し、VCにアタッチします。 5. 同じようにして「VCのアタッチアイコン」→「OCX Router(v1)」→「先ほど作ったOCX RouterのInterface」を選択し、OCX Router InterfaceをVCにアタッチします。 6. しばらく待ってから。AWSコンソールからDirect Connectの「仮想インターフェース」を確認し、ピアリングのステータスがupになっていることを確認します。
OCIとの接続
OCX及びOCIのコンソールを操作し、以下のようなネットワークを構築することを目指します。
AWSとの接続は先にOCXでCloud Connectionを作り、AWSコンソールでそれを承認し、VIFを作る方式でした。
OCIとの接続は先にOCIコンソールでFastConnectを作り、Cloud Connectionを作った際に接続するという方式になります。
OCXとクラウドとの接続方法はクラウド事業者によって方式が変わるため、注意が必要です。
FastConnectの作成
OCIコンソールからFastConnectを作成し、OCXネットワークとの接続準備を行います。
OCIコンソールから「FastConnect」と検索し、作成を押します。
ConnectionタイプにFastConnectPartner、PartnerにBBIX Multi-Cloud Serviceを選択して、次へを押します。
以下を参考に情報を入力し、FastConnectを作成します。
Name: ocx-techblog Compartment: 自分の Virtual circuit type: Private virtual circuit Traffic: All traffic Dynamic routing gateway in 自分の: ocx-techblog-drg Provisioned bandwidth: 1Gbps Customer BGP IPv4 address: 10.128.40.1/30 Oracle BGP IPv4 address: 10.128.40.2/30 Customer BGP ASN: 65000 Use a BGP MD5 authentication key: 有効 BGP MD5 authentication key: worldocx その他項目: デフォルトのまま
作成したFastConnectの詳細から、OCIDとASNを確認します。
Cloud Connectionの作成
OCXポータルからCloud Connectionを作成し、OCIとの接続を行います。
- OCXポータルのメニューから「Cloud Connection」→「Create」→「Oracle」を選択します。
ロケーション、名前、速度を入力して次へを押します。
先ほど作成したFastConnectのOCIDを入力し、各項目を確認したら作成します。
OCIコンソールに移動し、作成したFastConnectのStatusが「Provisioning」もしくは「Provisioned」になっていることを確認します。
OCX RouterのInterfaceを作成し、BGPセッションを確立
AWSとの接続に用いたOCX Routerのインスタンスに、新たに作成したInterfaceとVCと組み合わせることでBGPセッションを確立します。
- AWSと接続するのに利用したOCX Routerのインスタンスの「+マーク」→「Primary Interface作成」を選択し、以下の情報を参考にOCX Router Interfaceを作成します。
- 作ったOCX Router Interfaceから「BGP Parametersタブ」→「BGP Parameter作成」を選択し、以下の情報を参考にBGP Parameterを作成します。
- OCIとの接続に使うVCはAWSとの接続に使ったVCとは違う回線に当たるため、VCを新たに作成します。OCXポータルのメニューから「Virtual Circuits(VCs)」→「Create」を選択し、名前を入力し作成します。
- VCに先ほど作成したOracle Cloud ConnectionとOCX Router Interfaceをアタッチします。
- しばらく待ってからOCIコンソールに移動し、接続したFastConnectのピアリングステータスがupになっていることを確認します。
ルートテーブルの編集と疎通確認
ここまででOCXを用いてAWSとOCIを閉域網で接続する方法を確認しました。最後に特定の通信が構築した閉域網を通るようにルートテーブルを編集し、疎通確認をします。
AWSでの設定
AWSコンソールに移動し、作成したAWSインスタンスの詳細からパブリック、プライベートIPを確認します。
同じくAWSコンソールから作成したVPCの詳細へ移動し、パブリックサブネットに紐づいているルートテーブルを選択します。
ルートの編集を選択し、OCI向けの通信はVGWを通るようにルートを追加します。
OCIでの設定
OCIコンソールに移動し、作成したOCIインスタンスの詳細からパブリック、プライベートIPを確認します。
同じくOCIコンソールから作成したVCNの詳細へ移動し、ルートテーブルを選択します。
ルートの編集を選択し、AWS向けの通信はDRGを通るようにルートを追加します。
ログインと疎通確認
AWSとOCIのインスタンスを作った際にダウンロードした秘密鍵を~/.sshへコピーします。ターミナルを開き、以下のコマンドを順番に入力します。yyyy-mm-ddは鍵の名称に合わせて入力して下さい。
cd Downloads/ cp ocx-techblog.pem ~/.ssh cp ssh-key-yyyy-mm-dd.key ~/.ssh cd ~/.ssh
以下のコマンドを入力し、AWSインスタンスにログインして疎通確認を行います。各IPアドレスは各自で前セクションで確認したものを使用します。
sudo ssh ec2-user@X.X.X.X -i ocx-techblog.pem sudo su yum update –y ping 10.40.0.185
以下の画像のように疎通していることが確認できると思います。
OCIのインスタンスでも同様に行います。
まとめ
今回はOCXを用いて2つのクラウドサービス間をつなぐ閉域網の構築を行いました。OCXは物理的な工事の手配や発注からのリードタイムが短いことが特徴として挙げられており、ここまでの実際の作業も1時間以内に終わらせることができます。
Cloud Connection、OCX Router、VCを始めとした様々なリソースを組み合わせて自由に構築を行えることも特徴で、本例ではOCX Routerを1インスタンスしか使っていませんが、2インスタンス使った冗長構成を作ることも可能なので是非お試しください。
2. webサーバ及びDBサーバの構築
ここでは、実際に口コミサイトを作るという体でAWSのインスタンスをwebサーバ、OCIのインスタンスをDBサーバとして利用します。
インターネットを通じたユーザからのhttpアクセスに対しwebページを表示し、webページに入力された口コミはOCXで構築した閉域網を通じてDBへ登録されるという仕組みになります。このようにアプリケーションレイヤとデータベースレイヤを分け、その間にインターネット経由でないプライベートな接続を用意してあげることで、セキュリティリスクの軽減や帯域確保による動作の向上が期待できます。
OCIインスタンスでの設定
まず最初にOCIインスタンスをMySQLサーバとして利用できるように設定を行います。
MySQLのインストールと設定
以下のコマンドを実行してMySQLのインストールを行います。sudo suのsuperuser権限はこれ以降の手順でも適用します。
sudo su yum module install mysql:8.0/server –y
以下のコマンドを実行してMySQLのコンフィグファイルを開きます。
cd /etc/my.cnf.d nano mysql-server.cnf
[mysqld]の項目に以下を追加して保存します。
character-set-server=utf8 collation-server=utf8_unicode_ci bind-address = 0.0.0.0
ファイアウォールの設定をします。
firewall-cmd --add-port=3306/tcp –permanent firewall-cmd --reload
MySQLを実行し、ログインします。
systemctl start mysqld systemctl enable mysqld mysql -u root
以下のSQLコマンドを実行し、データベースとユーザの設定をします。awsuserとAwsuser00$$はユーザとパスワードに当たるので、好きなものを設定して下さい。
create database sampledb; use sampledb; CREATE TABLE userdata ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50), message TEXT ); CREATE USER 'awsuser'@'10.30.0.66' IDENTIFIED BY 'Awsuser00$$'; GRANT ALL PRIVILEGES ON sampledb.* TO 'awsuser'@'10.30.0.66’; FLUSH PRIVILEGES;
OCI側の設定は完了したため、ルートテーブルを以下のように設定し、インターネットとの疎通性をなくします。こうすることで、MySQLサーバを擬似的にプライベートサブネット内に置きます。
AWSインスタンスでの設定
次にAWSインスタンスをwebサーバとして利用できるように設定を行います。
MySQLのインストールと疎通確認
以下のコマンドを実行してMySQLのインストールを行います。sudo suのsuperuser権限はこれ以降の手順でも使います。
sudo su yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm -y yum install mysql-community-server –y
以下のコマンドを実行して、OCXで構築した閉域網を通じて、OCI側のMySQLサーバにアクセスできるか確認します。パスワードを聞かれるので、設定したものを入力します。MySQLにログインできることを確認したらquitコマンドから切断します。
mysql -u awsuser -h 10.40.0.185 –p
以下のコマンドを実行してapacheのインストールを行います。
yum install httpd –y yum install php php-mysql -y
以下のコマンドからapacheを実行します。
systemctl start httpd systemctl enable httpd
AWSインスタンスから確認できるパブリックIPにhttpでアクセスします。http://X.X.X.Xにアクセスしてapacheの初期画面が表示されたら成功です。httpsではアクセスできないので注意して下さい。
以下のコマンドを実行し、index.phpを作成、編集します。
cd /var/www/html nano index.php
index.phpに以下をペーストして保存します。$host, $user, $passにはそれぞれOCIインスタンスのプライベートIP、設定したユーザとパスワードを入力します。
<?php $host = '10.40.0.185'; $db = 'sampledb'; $user = 'awsuser'; $pass = 'Awsuser00$$'; $charset = 'utf8mb4'; $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; if ($_SERVER["REQUEST_METHOD"] == "POST") { $username = $_POST["username"]; $message = $_POST["message"]; try { $pdo = new PDO($dsn, $user, $pass, $options); $stmt = $pdo->prepare("INSERT INTO userdata (username, message) VALUES (?, ?)"); $stmt->execute([$username, $message]); echo "Data saved successfully!"; } catch (\PDOException $e) { throw new \PDOException($e->getMessage(), (int)$e->getCode()); } } ?> <form action="index.php" method="post"> Username: <input type="text" name="username"><br> Message: <textarea name="message"></textarea><br> <input type="submit" value="Submit"> </form>
以下のコマンドを実行して、apacheを更新します。
systemctl restart httpd
AWSインスタンスから確認できるパブリックIPにhttpでアクセスします。http://X.X.X.Xにアクセスして以下の画面が出てきたら成功です。
- usernameとmessageを入力してsubmitボタンを押すと、以下のようにデータベースに情報が登録されることを確認します。