読者です 読者をやめる 読者になる 読者になる

HDE BLOG

コードもサーバも、雲の上

「cloudn (クラウド・エヌ)」を使ってみました

ソリューション推進部 開発&ASPチームの大久保です。

2015/04/17 に開催された社内勉強会にて、NTTコミュニケーションズが提供するパブリッククラウドサービス「cloudn(クラウド・エヌ)」について概要を紹介したところ、AWSが大好きなはず(と勝手に私が思っている)な社内メンバーから、意外やブログで詳しく紹介してほしいというご要望を頂き、ありがたくブログを書かせて頂くことになりました。

cloudn とは?

お決まりの書き出しですみません。URLだけ紹介させてください。

www.ntt.com

使ってみる

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(クラウド・エヌ)」 なかなか良いサービスではないかなと思います。