ソリューション推進部 開発&ASPチームの大久保です。
2015/04/17 に開催された社内勉強会にて、NTTコミュニケーションズが提供するパブリッククラウドサービス「cloudn(クラウド・エヌ)」について概要を紹介したところ、AWSが大好きなはず(と勝手に私が思っている)な社内メンバーから、意外やブログで詳しく紹介してほしいというご要望を頂き、ありがたくブログを書かせて頂くことになりました。
cloudn とは?
お決まりの書き出しですみません。URLだけ紹介させてください。
使ってみる
cloudn が提供する 仮想サーバ(Compute)を使ってみました。仮想サーバには、FLATタイプ、VPCタイプ OpenNW, VPCタイプ ClosedNW の3タイプが提供されています。AWSと機能比較すると、FLATタイプ = EC2-Classic, VPCタイプ = EC2-VPC となります。今回は、FLATタイプの仮想サーバを管理コンソールとAPIを使って作成してみます。
仮想サーバを作成する
管理コンソールの操作方法についてはマニュアルに大変わかりやすく書いてありますのでこちらをご覧ください。ここでのポイントはブラウザに Firefox を使用することです。IEやChromeだと管理コンソールが正常に動作しないことがあります。ウィザードでの設定が終了してから、仮想サーバが起動するまでは 30秒~1分程度です。
3.1. 仮想サーバーを作成する — Cloudn Compute FLATタイプ 操作マニュアル v2.20.2
仮想サーバを設定する
今回、オフィシャルテンプレートの CentOS 6.5 64bit から仮想サーバを作成しました。開発やサービスで複数台の仮想サーバを作成する場合、OSの基本設定などはあらかじめ済ませた状態のテンプレートがあると便利なので、まずはテンプレートの元になる仮想サーバの設定を行います。
タイムゾーン・言語
cloudn の仮想サーバはデフォルトでは、タイムゾーンが UTC になっています。/root/tzconfigurator.sh というシェルスクリプトが用意されており、対話形式でタイムゾーンの設定が行えます。が、私はいつものやり方でささっと設定します。
タイムゾーンの設定
# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime # cat /etc/sysconfig/clock ZONE="Asia/Tokyo"
言語の設定
# cat /etc/sysconfig/i18n LANG="en_US.UTF-8" -> 日本語にしたい場合、ja_JP.utf8 に変更 SYSFONT="latarcyrheb-sun16"
ネットワーク
ホスト名、iptables などささっと設定します。セキュリティグループの設定が必須なので不正アクセスされるリスクは低いですが、デフォルトだと iptables は全開放、かつ、chkconfig off という状態で起動します。かなり豪快です。
ホスト名
# cat /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=no (IPv6無効) HOSTNAME=template.localhost.localdomain (ホストFQDNを設定)
iptables
# cat setting-iptables.sh iptables -F iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -s 接続元IP/32 -p tcp -m tcp --dport 22 -j ACCEPT iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # sh setting-iptables.sh # service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] # chkconfig iptables on # chkconfig --list | grep iptables iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
時刻同期(NTP)
仮想サーバはOS停止していると時間が止まりますので、NTPを使用してサーバの時刻をあわせます。cloudn FLATタイプは 直接インターネットに接続されているので、CentOS 標準の /etc/ntp.conf でタイムサーバと通信できます。国内のタイムサーバですと、 MFEEDなどが利用できます。ntpd もデフォルトで起動しているので、タイムサーバがデフォルト設定でよければ、NTPを動作させるための設定は特にありません。
# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== -secure.opticner 223.255.185.2 2 u 15 64 377 13.196 9.558 6.019 *v157-7-235-92.z 10.84.87.146 2 u 24 64 377 15.089 -14.547 3.478 +c-kint.tv 133.243.238.243 2 u 17 64 377 13.842 -9.597 4.046 +x.ns.gin.ntt.ne 103.1.106.69 2 u 11 64 377 12.129 -13.728 3.157
DNS
DNSサーバは cloudn から提供されており、/etc/resolv.conf に設定されています。そのまま利用できます。
ユーザ・グループ
サーバへのアクセスポリシーは様々あるかと思いますが、私は root への昇格が可能なシステム管理ユーザを作成し、SSH では、root ログイン禁止にしています。ユーザを作成したら SSHキーも登録しておきましょう。以下、/etc/ssh/sshd_config の設定例です。
# diff sshd_config sshd_config.org 42c42 < PermitRootLogin no (rootユーザのログイン禁止) --- > #PermitRootLogin yes 47,49c47,49 < RSAAuthentication yes (RSA公開鍵認証を有効化) < PubkeyAuthentication yes < AuthorizedKeysFile .ssh/authorized_keys --- > #RSAAuthentication yes > #PubkeyAuthentication yes > #AuthorizedKeysFile .ssh/authorized_keys 66c66 < PasswordAuthentication no (パスワードログインを無効化) --- > PasswordAuthentication yes 139,140d138 < < AllowUsers hoge fuga (SSHログイン可能なユーザを限定)
ディスク
cloudn はルートディスクに 15GB の容量を割り当ててくれます。AWSではスワップ領域が確保されておらず、必要であればEBSにスワップファイルを作成する必要がありますが、cloudn はデフォルトで 2GB のスワップ領域が確保されています。以下、vQプランのディスクとメモリの割り当て状況です。
# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 13G 755M 11G 7% / tmpfs 246M 0 246M 0% /dev/shm /dev/vda1 485M 33M 427M 8% /boot # free -m total used free shared buffers cached Mem: 490 122 367 0 6 38 -/+ buffers/cache: 77 413 Swap: 2047 0 2047
テンプレートを作成する
その他監視エージェントやら必要なパッケージやらインストールしてOS設定が完了したらテンプレートを作成します。またしてもマニュアル参照ですみません。マニュアル通りにテンプレートを作成します。
3.15. テンプレートを作成する — Cloudn Compute FLATタイプ 操作マニュアル v2.20.2
テンプレートをコピーする
cloudn をサービスで使用する場合、冗長化のために異なるゾーンにAP, DBサーバを配置します。一方で、テンプレートはゾーンごとに有効です。(ゾーン jp-e1a で作成したテンプレートを使用して、ゾーン jp-e1b に仮想サーバを作成することはできません)ですので、作成したテンプレートは各ゾーンにコピーする必要があります。
8.3. テンプレートをコピーする — Cloudn Compute FLATタイプ 操作マニュアル v2.20.2
APIを使う準備をする
cloudn は オープンソースのクラウド基盤 Apache CloudStack をベースとしたサービスであるため、APIの操作に cloudmonkey CLIを使用することができます。マニュアルにも書いてあります。マニュアルに従って cloudmonkey をインストールし、URL, apikey, secretkey を設定します。apikey, secretkey は、管理コンソールにログインした直後のページの下の方に「portal contents」>「APIアクセスキー秘密鍵管理」というメニューがあります。これをクリックすると取得できます。
1.3. APIクライアントの利用 — Cloudn Compute FLATタイプ APIリファレンス v2.20.2
今回は仮想サーバの作成/起動/停止/削除、アプリケーションのプロビジョニング、SSHログインなど何かと便利な Vagrant と cloudmonkey を組み合わせて使用します。Vagrant はこのあたりを読んでインストールしてください。
cloudmonkey と vagrant がインストールできたら、vagrant-cloudstack プラグインをインストールします(これで合体します)。
$ vagrant plugin install vagrant-cloudstack Installing the 'vagrant-cloudstack' plugin. This can take a few minutes... Installed the plugin 'vagrant-cloudstack (1.0.0)'!
いよいよ仮想サーバの量産体制が整いました。APIを使って仮想サーバを作成するためには以下のパラメータが必要です。
セキュリティグループID
管理コンソールの「ネットワーク」>ビューの選択「セキュリティグループ」>一覧から仮想サーバに適用するセキュリティグループをクリック>「詳細タブ」にIDが記載されています。これをメモ。
テンプレートID
管理コンソールの「テンプレート」>テンプレート名をクリック>「詳細タブ」にID(テンプレートID)が記載されています。これをメモ。
ゾーンID
cloudmonkey CLI を使って取得できます。
$ cloudmonkey list zones count = 2 zone: name = jp-e1a id = 1b02e74c-6c21-4aa3-b96c-51042de8fccd :
インスタンスタイプID
同じく cloudmonkey CLI を使って取得します。
$ cloudmonkey list serviceofferings count = 7 serviceoffering: name = t1.micro id = 200c6378-8ae9-4718-9b25-b8c4f6c1dfc8 :
これで、「どのテンプレートを使って」、「どのセキュリティグループを適用して」、「どこ(ゾーン)に」、「何の(インスタンスタイプ)」仮想サーバを作るかを指定できます。
APIを使って仮想サーバを作成する
上記のパラメータがあれば、Vagrant を使ってさくっと仮想サーバが作成できます。今回ご紹介している Vagrantfile は、仮想サーバを作成し、Vagrantを実行したサーバと作成した仮想サーバ間でディスクを共有することでアプリケーションに必要なファイルを転送し、vagrant/init/setup.sh をプロビジョニング時にキックすることにより、アプリケーションのインストール・設定まで実行しているテンプレートです。小中規模のシステムであれば、ChefやPuppetなどのプロビジョニングツールを使わなくても自動化できるかと思います。Vagrantは環境変数を読んでくれるのでパラメータは環境変数に定義しています。
作業ディレクトリを作成 $ mkdir vagrant $ cd vagrant Vagrantを初期化 $ vagrant init Vagrantfile を以下の通り作成する。 $ cat Vagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # Every Vagrant virtual environment requires a box to build off of. config.vm.box = "dummy" config.ssh.private_key_path = "~/.ssh/id_rsa" config.ssh.username = "cmcadmin" config.vm.synced_folder ".", "/vagrant", disabled: true config.vm.synced_folder "provision/", "/home/***/vagrant" config.vm.synced_folder "conf/", "/home/***/vagrant/conf" config.vm.provider :cloudstack do |cloudstack, override| cloudstack.host = "comp-api.jp-e1.cloudn-service.com" cloudstack.path = "/client/api" cloudstack.port = "443" cloudstack.scheme = "https" cloudstack.api_key = "${APIKEY}" -> cloudn のアクセスキー cloudstack.secret_key = "${SECRET}" -> clooudn の秘密鍵 cloudstack.instance_ready_timeout = 1800 cloudstack.display_name = "${VM_HOSTNAME}" -> 仮想サーバの表示名(管理コンソール上に表示される) cloudstack.name = "${VM_NAME}" -> 仮想サーバの名前(管理コンソール上に表示される) cloudstack.group = "${VM_GROUP}" -> 仮想サーバのグループ(管理コンソール上に表示される) cloudstack.template_id = "${CLOUDN_JPE1A_TEMPLATE_ID}" -> テンプレート cloudstack.service_offering_id = "${CLOUDN_SERVICE_OFFERING_ID}" -> インスタンスタイプ cloudstack.zone_id = "${CLOUDN_JPE1A_ZONE_ID}" -> ゾーン cloudstack.security_group_ids = ["${CLOUDN_SECURITY_GROUP_ID}"] -> セキュリティグループ cloudstack.network_type = "Basic" end config.vm.provision :shell do |shell| shell.privileged = false shell.inline = "vagrant/init/setup.sh" end end 仮想サーバを作成・起動する $ vagrant up
vagrant up してからサーバが起動するまでは調子がいいと5分程度でです。アプリケーションの インストールなどを除くと、1~2分程度で仮想サーバの作成と起動が出来ているように思います。
終わりに
今回は仮想サーバの作成方法を中心にレポートしましたが、データディスクのアタッチや、DNSへの正引き・逆引きレコード登録などもAPIでできますし、VPCタイプでは、セキュアな3層モデルのウェブアプリケーションを構築することも可能です。コスト競争力もありますし、「cloudn(クラウド・エヌ)」 なかなか良いサービスではないかなと思います。