フォーム読み込み中
こんにちは!
ソフトバンクのクラウドデザイン統括部SE第2部 舩渡です。
現在、パブリッククラウドに興味を持ち勉強中です。
AzureやAWSは知っていましたが、「Alibaba Cloud」については最近知りました。操作感や他のサービスとの違いなど、どういうものか気になったため、実際に触ってみることにしました。
今回は簡単に「IaaSとPaaSをつなげてみる」というテーマでやってみようと思います。
IaaSの「ECS(Linux)」をWebサーバ替わりとして、PaaSのデータベースである「RDS(MySQL)」に登録されているデータをPHPを利用して参照し、ブラウザ画面に表示させる。
下記図のような構成を目指して作りました。(負荷分散やバックアップ、セキュリティ類はかなり省略しております)
それでは、作っていきます。
必要なリソースを用意します。まずはVPCから。
AlibabCloudポータルより「Virtual Private Cloud」を選択し、VPCの作成をします。
(VPC名には適当な値を入れます。)
ここで指定したIPv4 CIDRブロックは、RDSホワイトリスト登録時に利用するため覚えておきます。
(RDSホワイトリストへ登録し、構築するECSのIPレンジからの接続を許可します。)
VPC設定時に、VSwitchも設定します。
右側に”アーキテクチャプレビュー”が出てきて、イメージ化してくれるのは見やすいですね。
(今回の構成はかなり単純ですが笑)
あっというまにVPCとVSwitchが作成されました。
ECSに使用するSecurity groupを作成します。
基本的にはECS接続検証をする時まで、インバウンドは全て「拒否」としておきます。
設定を進めていき、問題なく作成されました。
次に、ECSを立ち上げます。
今回は課金方法を”従量課金”タイプ、リージョンは”日本(東京)"のゾーンAを選択しました。
インスタンスタイプを選んでいきます。今回は特にスペックを必要としないため、最もスペックの低いものを選択。
なお、OSイメージは「Alibaba Cloud Linux」を使用しました。
ディスク設定、ログイン設定(PW設定含む)なども完了させると、インスタンスが作成されます。
ECSインスタンスは、上記で作成したVPC内に作成しました。
AlibabaCloudでは、”VNC”というManagement Terminalを利用してインスタンスに接続可能です。
TerminalのようなCLIで操作できるようになります。
作成したインスタンスの詳細を開き、VNC接続をすると下記のような画面に。
まずはrootユーザでログインしました。(ログインパスワードはECS作成時に設定)
ここで、ECSからRDSへMySQLコマンドを実行するためMySQLドライバ、Mysqlの機能拡張版であるmysqli、およびPHPもインストールしておきます。
MySQLインストール
# yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
# yum install -y mysql-community-server
mysqliインストール
# yum install php-mysqli
PHPインストール
# yum -y install --enablerepo=remi,remi-php73 php php-devel php-mbstring php-pdo php-mysql php-gd php-xml php-mcrypt
この流れでECSに対し事前にApacheをインストールしておきます。
# yum -y install httpd
せっかくなので、Apacheを起動させておきます。
ブラウザからグローバルIPでWebサーバ(ECS)に接続するめ、ElasticIPを取得してECSへアタッチします。
これでいったん接続してみると、、
接続できたようです!
(デフォルトのページだと面白くないため、直前にテストページとしてApacheのドキュメントルート(/var/www/html/)にhtmlファイルをおいておきました。)
これで一先ずECS側の作業は終了です。
今度はMySQLを利用するためのRDSを立ち上げます。
タイプは従量課金で、
「リージョン」、「データベースタイプ」、「エディション」など設定を決めていきます。
「エディション」の部分、カーソルを合わせるとイメージが出てくるのですね。これはありがたいです。
設定登録後、無事にインスタンスが作成されました。
作成されたインスタンスを選択すると「インスタンス管理」画面へ遷移します。
そこで「ユーザ」、「データベース」の作成をポータルから行うことができます。
(もちろんDBへ接続してSQL実行でも可能ですが、せっかくなのでポータルから作成を。)
今回使用するユーザを作成します。
データベースも作成します。
データベース管理画面の上部にある「データベースへログインする」ボタンより、作成したRDSへログインが可能です。
ログイン後、参照先のデータを登録します。
まずはテーブル作成を。(CREATE文)
続いてデータの登録をします。(INSERT文)
最後に登録データの確認をします。(SELECT文)
参照先のデータをRDSに登録することができました。
データは登録しましたが、このままではRDSへ接続できません。
ECSからの接続を許可するために、RDS側の「ホワイトリスト」にECSが所属するVPCのIPアドレスレンジを登録する必要があります。
今回使ったECSが格納されているVPCのIPv4アドレスは「10.0.0.0/8」としていたため、「10.0.0.0/8」からの接続を許可してみます。
RDSインスタンスを選択し、「データベースの接続」を開くと、画面左上あたりに「内部エンドポイント」とある部分があります。
「内部エンドポイント」はRDSへ接続する際に必要となる情報ですが、初期では何も表示されていません。
RDSのホワイトリストを登録することにより表示されます。
「セキュリティコントロール」を開きホワイトリストをみると、Defaultの「127.0.0.1」が入っています。
このままではどこからも接続できない状態となっているため、この値を上記で作成した”VPCアドレスレンジ”に置き換えます。
(入力値は”IP指定”、”IPレンジ”のどちらでも可能です。)
”10.0.0.0/8”に置き換えます。
これでECSから接続できるようになったはずです。
必要なコンポーネントは揃ったため、ECSからRDSへMySQL接続ができるかを確認してみます。
ECSからRDSへMySQL接続する際、接続先ホストに”RDSの「内部エンドポイント」”を指定する必要があるため、事前に確認しておきます。
RDSの「内部エンドポイント」欄に記載があるため、メモをしておきます。
※赤枠部分
ECSのコンソールからコマンドを発行して確認するため、ECSへログインします。
RDSへの接続をする際、接続先ホストに「RDSの内部エンドポイント」を指定します。
発行コマンドは下記の通りです。
# mysql -h [RDS内部エンドポイント] -u [RDSユーザ名] -p -D [接続先DB名]
コマンドを実行すると、MySQLへログインが成功しました。
そのままSELECT文を実行しましたが、問題なくテーブルの中身もみれました!
この時点で、ECSからRDSのデータ参照は問題なくできたということがわかりました。
ECS-RDS間の接続は確認できたため、最後はブラウザ画面から参照できるようにします。
RDSのテーブルからデータ取得した結果をブラウザに表示させるため、PHPファイルをECSのドキュメントルート(/var/www/html/)に配置します。
(PHPファイル名は「select.php」)
その後、ブラウザからECS(Webサーバ)へ接続できるように、Security groupの設定でインバウンド「http」を「許可」に変更したうえで、ブラウザのURL欄に直接「ECSのIP + PHPファイル名」を入力してみます。
すると、RDSへ登録していた”CLOUD”テーブルのデータが表示されました!
流石はクラウドサービス、インフラ面でもアプリ面(ミドルウェア)でも、さくっと操作するだけで簡単にWebサーバとDBを接続させることができました。
過去にオンプレシステムのアプリ担当SEをやっていたのですが、オンプレ環境でインフラ担当と連携しながらこのようなことを実施すると調整など大変だった記憶があります。
そのため一人でサクッと作れるのは、クラウドサービスとしての利点の一つだと改めて実感しました。
(繰り返しですが、本来は構成やらセキュリティ面も気にして作るべき...)
作業自体だけでいえばさほど時間もかかりませんでした。
AlibabaCloudに触れたのは初めてでしたが、設定時にイメージ図のガイドが表示されるなどユーザにとって親切な場面がある印象も受けました。
(VSwichやRDSの設定時など)
基本的にリソースに対する操作に関して、困る点はありませんでした。
今回は簡単な操作をしてみましたが、今後もAlibabaCloudの知識を深めていき、ご提案/構築時にお客様へ良いものをお届けしていきたいと思います。
以上です!
<?php
$server = "[接続ホスト名]";
$userName = "[MySQLユーザ名]";
$password = "[MySQLユーザパスワード]";
$dbName = "[接続DB名]";
$db = new mysqli($server, $userName, $password,$dbName);
if (!$db) {
die('Connect Error');
}
$sql = "SELECT * FROM cloud";
$result = $db -> query($sql);
if (!$result) {
die('Query Error');
}
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
$rows[] = $row;
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Cloud Table</title>
<meta charset="utf-8">
</head>
<body>
<h1>Cloud Table</h1>>
<table border='2'>
<tr>
<th>ID</th>
<th>NAME</th>
<th>ABBREVIATE</th>
</tr>
<?php
foreach($rows as $row){
?>
<tr>
<td><?php echo $row['ID']; ?></td>
<td><?php echo $row['NAME']; ?></td>
<td><?php echo $row['ABBREVIATE']; ?></td>
</tr>
<?php
}
?>
</table>
</body>
</html>
条件に該当するページがございません