kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

kickstartのpostscript処理をコンソール出力するメモ

kickstartのpostscript処理ですがリアルなマシンだと

にあるように、chvt すればいんだけど、KVM仮想マシンにインストールするときはこれでは動作しない。

シリアルコンソールに出力しているので、結局、上記を参考にキックスタートファイルに

%post
exec < /dev/tty3 > /dev/ttyS0

yum -y update

のようにしたらできた。

これでいいのかよくわからない。
正しい方法あればコメントいただけるとうれしいです。

SpotInstance + ENI(固定IP)in VPC で財布に優しいテスト環境を作る

久しぶりの更新です。

Amazon VPCのいいところの1つは、固定プライベートIPを設定できるところですよね。
で、ちょうど固定プライベートIPで作業する必要があったので、オンデマンドm1.smallをVPC内に数インスタンス起動してたのですが、そこそこ費用がいってしまいました。
t1.microはまだVPCで使えないし、SpotInstanceだと固定プライベートIP指定で起動できないし、オンデマンドm1.smallでもそこそこ費用いくしと悩んでいたのですが、Elastic Network Interface(ENI)を使うことで、財布に優しい環境をつくることができました。
以下、やったことのメモです。

まずVPCを作っておきます。たとえば CIDR 10.0.0.0/16 で作って、Subnet を 10.0.0.0/24 としておく。このあたりは Wizardのデフォルト通りでOK。
で、もう1つSubnetを作っておく。ここでは10.0.1.0/24としておく。

この状態で、SpotInstanceを10.0.0.0/24で起動する。この10.0.0.0/24に接続するeth0はdhcpにより動的にIPが定まる。一応、このインスタンスに直接アクセスするために、EIPも割り当てておく。

ここで10.0.1.0/24に接続するENIをIP指定(例:10.0.1.11)で作成し、作成したインスタンスにアタッチする。インスタンスでは/etc/sysconfig/network-scripts/ifcfg-eth1(Amazon Linuxの場合)に

DEVICE=eth1
BOOTPROTO=static
IPADDR=10.0.1.11
NETMASK=255.255.255.0
ONBOOT=yes
TYPE=Ethernet

を記述し、ネットワークを再起動する。これで、このSpotInstanceは固定プライベートIPが使える。

そして、この状態でAMIを作って、以降はこのAMIからSpotIntanceを起動し、同じ固定IPを持つENIをアタッチすればSpotInstanceであっても特定のサブネットに対しては常に同じIPを持つ環境を容易に再現できるようになる。

これで、財布に優しい固定プライベートIP環境ができたので実験がしやすくなりました。Yeah!

これLTネタになるかな?いや、ショボすぎだろ。

ところで

SpotInstanceはm1.mediumってお得感がありますよね。東京リージョンだとこのブログ書いている時点で

タイプ オンデマンド スポット
m1.small $0.092 $0.041
m1.medium $0.184 $0.058

という価格。割引率もm1.mediumの方がいいですし、$1=\80とすれば、スポットの価格差は1時間あたり1.36円。
オンデマンドのm1.smallより安いし、この価格差ならコスパ的にm1.mediumかなって感じで、m1.mediumのSpotInstanceをよく使ってます。

価格も安定していて、m1.smallだと

な感じですが、m1.mediumだと

な感じ。
まぁたまーに跳ね上がるのはSpotInstanceってことで割り切れば、m1.mediumの方が突然落とされる確率は低そうですね。今後はどうなるかわかりませんが。。。

Amazon VPCに接続するためのVyatta向け設定ファイルを作成するWebツールを作ってみました

さくらのクラウド(β)とAmazon VPCをつなげるテストをいろいろやっているのだけど、毎度Vyattaの設定ファイルとかを書くのが面倒なので、Amazon VPCからダウンロードする設定情報をVyatta向けに変換するツールを作成してみました。

ローカルで使うのであればrubyで多分書くのですが、需要があるか不明ですが他の方にも使いやすいように、Webツールという感じで公開してみました。

http://gen-vyatta-conf.fluxflex.com/
http://gen-vyatta-conf.peachbeach.info/

Javascript のみで完結していて、通信は一切しないのでPSKなどを抜くようなことは一切していません。ちなみに、Javascript はまだ勉強不足なので、いたらないところは多々あると思います、、、ご容赦を!

想定環境

とりあえず自分で試したときの環境は以下のようなイメージです。さくらのクラウド(β)で、Vyatta(6.3)をたてて、プライベートネットワーク(192.168.1.0/24)内にサーバを起動している感じです。このサーバのデフォルトゲートウェイは、Vyattaを向くように設定しておきます。
AWS では、VPC を構築して、その中に EC2 Instance を起動しているという感じとなります。

VPCの構築は以前の記事(さくらのVPSにVyattaを入れて、Amazon VPCにVPN接続 - kikumotoのメモ帳)を参照してください。

使い方

http://gen-vyatta-conf.peachbeach.info/ の使い方を簡単に説明します。

VyattaでIPSecを利用するネットワークインターフェイス」には、Vyattaがインターネットに接しているネットワークインターフェイスを入力します。上記の図では eth0 となります。

ローカルネットワーク情報」には、VPNで接続したいローカルネットワークを入力します。上記の図では 192.168.1.0/24 となります。

Amazon VPC のネットワーク情報」には、Amazon VPCを構築する時に設定したVPC IP CIDR Blockを入力します。上記の図では、10.0.0.0/16 となります。

Amazon VPCからダウンロードした設定情報」では、Amazon VPCを構築するときに Vendor を Generic としてダウンロードしたIPSec VPNの設定ファイルの内容をそのままコピペします。

以上4つのすべてを入力したら、「作成」ボタンを押します。

そうすると、下側に「Vyatta設定」と「Vyattaパケット転送スクリプト」が出力されます。これらの内容を持つファイルをVyatta内に作成します。ここでは、Vyatta設定を vpc_config.txt、Vyattaパケット転送スクリプトvpc_setup.sh として保存したとして話を進めます。

Vyatta にて以下のように実行して設定をマージします。(警告の原因はよくわかってません)

$ configure
# merge /path/to/vpc_config.txt
Warning: file does NOT appear to be a valid config file.
Do you want to continue? [no] Y
# commit
# save
# exit

次に、vpc_setup.sh を実行します。

$ sudo sh /path/to/vpc_setup.sh

以上で、VPNで2つのネットワークが接続されるので、例えばさくらのサーバ側から

$ ping 10.0.1.101
PING 10.0.1.101 (10.0.1.101) 56(84) bytes of data.
64 bytes from 10.0.1.101: icmp_req=1 ttl=62 time=10.9 ms
64 bytes from 10.0.1.101: icmp_req=2 ttl=62 time=10.7 ms

とすれば、接続されていることが確認できます。

もちろん、EC2 Instance にもログインできます。

公開サイトについて

http://gen-vyatta-conf.fluxflex.com/ ですが、URLからわかるように fluxflexを使っています。
ソース自体は https://github.com/kikumoto/gen-vyatta-conf-for-vpc にあります。fluxflex の github 連携を使うようにしました。

この fluxflex の github 連携はとっても便利ですね。git pushしたらすぐデプロイされて、サイトが更新されるのでよけいなコマンドの実行が減ってとてもいいです。

2012/06/30 に fluxflex が終了なので DotCloud に移行しました。(2012/06/17)

さいごに

需要あるのか疑わしいですが、使ってもらえるとうれしいです。

Diablo版Swiftインストール:ストレージサーバ編

前回、前々回からの続きで最後にストレージサーバを構築したときの手順をメモしておく。

構成とOS環境

keystone やプロクシサーバと同様。

パッケージインストール

ストレージサーバに必要なパッケージは以下のようにしてインストールした。

# yum install python-greenlet python-netifaces
# yum --disablerepo=diablo install openstack-swift-object openstack-swift-account openstack-swift-container xinetd

データ保存ディスクの準備

今回は、/dev/sdb に接続されたディスクにデータを保存する構成とした。そのために、fdisk で /dev/sdb 全体を1つのパーティションをつくり /dev/sdb1 として構成した。
これを以下のように XFS でフォーマットし、マウントしておく。

# yum -y install xfsprogs
# mkfs.xfs -i size=1024 /dev/sdb1
# echo "/dev/sdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0" >> /etc/fstab
# mkdir -p /srv/node/sdb1
# mount /srv/node/sdb1
# chown -R swift:swift /srv/node

rsync

Swiftではデータの復旧などにrsyncを使うので、rsyncに関する設定をおこなっておく。まず、/etc/rsyncd.confを以下の内容で作成。address 部分は各ストレージサーバのIPに対応したものとなる。

uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
address = 192.168.0.101

[account]
max connections = 25
path = /srv/node/
read only = false
lock file = /var/lock/account.lock

[container]
max connections = 25
path = /srv/node/
read only = false
lock file = /var/lock/container.lock

[object]
max connections = 25
path = /srv/node/
read only = false
lock file = /var/lock/object.lock

サービスと起動させるために、/etc/xinetd.d/rsync を以下のように記述し

service rsync
{
	disable	= no
	flags		= IPv4
	socket_type     = stream
	wait            = no
	user            = root
	server          = /usr/bin/rsync
	server_args     = --daemon
	log_on_failure  += USERID
}

xinetd サービスを再起動する。

# service xinetd restart

swift共通設定

プロクシサーバから /etc/swift 配下にある

  • swift.conf
  • account.ring.gz
  • container.ring.gz
  • object.ring.gz

を scp などで/etc/swiftにコピーしてくる。

ストレージサーバ設定

/etc/swift に account-server.conf, container-server.conf, object-server.conf を以下の内容で作成。各ファイルのbind_ipが、各ストレージサーバのIPに対応するように記述する。

account-server.conf
[DEFAULT]
bind_ip = 192.168.0.101
workers = 2
mount_check = false
user = swift
log_facility = LOG_LOCAL2

[pipeline:main]
pipeline = account-server

[app:account-server]
use = egg:swift#account

[account-replicator]

[account-auditor]

[account-reaper]
container-server.conf
[DEFAULT]
bind_ip = 192.168.0.101
workers = 2
mount_check = false
user = swift
log_facility = LOG_LOCAL2

[pipeline:main]
pipeline = container-server

[app:container-server]
use = egg:swift#container

[container-replicator]

[container-updater]

[container-auditor]
object-server.conf
[DEFAULT]
bind_ip = 192.168.0.101
workers = 2
mount_check = false
user = swift
log_facility = LOG_LOCAL2

[pipeline:main]
pipeline = object-server

[app:object-server]
use = egg:swift#object

[object-replicator]

[object-updater]

[object-auditor]

ファイルのオーナーを修正しておく。

# chown -R swift.swift /etc/swift

以上で設定ができたので、

# swift-init main start

で起動する。

動作確認

すべてのストレージサーバをセットアップした後、以下のようにして動作確認を行った。

コンテナを作成する。

$ swift -A http://172.16.0.99:5000/v1.0 -U demo -K secrete post folder1

コンテナにファイルをアップする。

$ swift -A http://172.16.0.99:5000/v1.0 -U demo -K secrete upload folder1 file1.txt

コンテナの内容を確認

$ swift -A http://172.16.0.99:5000/v1.0 -U demo -K secrete list folder1

以上で、DiabloSwiftの環境ができた。
今後は、これをベースにいろいろいじっていきたい。。。けれど、はたして。。。

Diablo版Swiftインストール:プロクシサーバ編

前回の記事 Diablo版Swiftインストール:keystone編 に引き続き、Swift環境として必要となるプロクシサーバを構築した時のメモ。

構成とOS環境

前回の記事の通りであるが、今回はストレージサーバのIP情報も必要となるので、それらについては以下の通り。

ストレージ1 192.168.0.101/24
ストレージ2 192.168.0.102/24
ストレージ3 192.168.0.103/24
ストレージ4 192.168.0.104/24

また、各ストレージには /dev/sdb としてデータ保存用ディスクが1つ接続されており、/dev/sdb1 という1つのパーティションのみ存在するものとしている。これについてはストレージサーバ編でも記述予定。

パッケージインストール

プロクシサーバに必要なパッケージは以下のようにしてインストールした。

# yum install python-greenlet python-httplib2 python-netifaces
# yum --disablerepo=diablo install openstack-swift-proxy openstack-keystone memcached python-memcached xinetd

openstack-keystone はプロクシサーバが Keystone にアクセスするために利用しているので必要。

プロクシサーバの設定

まずは memcached を起動しておく。

# chkconfig memcached on
#service memcached start

/etc/swift/swift.conf の記述。適当な文字列を設定しておく。

[swift-hash]
# random unique string that can never change, keep it secret and do NOT lose it
swift_hash_path_suffix = hogehoge_2011_10_24_xxxxxx

今回はSSLは使わないので、証明書などの作成は行わなかった。

そのうえで、/etc/swift/proxy-server.conf を以下のように作成した。

[DEFAULT]
# Enter these next two values if using SSL certifications
#cert_file = /etc/swift/cert.crt
#key_file = /etc/swift/cert.key
bind_port = 8080
workers = 8
user = swift

[pipeline:main]
#pipeline = healthcheck cache tempauth proxy-server
pipeline = healthcheck cache swift3 keystone proxy-server

[app:proxy-server]
use = egg:swift#proxy
allow_account_management = true
account_autocreate = true

#[filter:tempauth]
#use = egg:swift#tempauth
#user_system_root = testpass .admin https://192.168.30.133:8080/v1/AUTH_system

[filter:keystone]
use = egg:keystone#tokenauth
auth_protocol = http
auth_host = 172.16.0.99
auth_port = 5001
admin_token = 999888777666
delay_auth_decision = 0
service_protocol = http
service_host = 172.16.0.99
service_port = 5000
service_pass = dTpw

[filter:swift3]
use = egg:swift#swift3

[filter:healthcheck]
use = egg:swift#healthcheck

[filter:cache]
use = egg:swift#memcache
memcache_servers = 172.16.0.100:11211

ringファイルの作成

ringファイルの作成は以下のスクリプトで行った。パラメータの説明などはOpenStackの大容量ストレージサービス、Swiftの使い方 − TechTargetジャパン 仮想化が詳しい。

#!/bin/bash
export LANG=C
set -x
cd /etc/swift

PART_POWER=10
REPLICAS=3
MIN_PART_HOURS=1

#
# (1) Initialize builder files
#
swift-ring-builder account.builder create ${PART_POWER} ${REPLICAS} ${MIN_PART_HOURS}
swift-ring-builder container.builder create ${PART_POWER} ${REPLICAS} ${MIN_PART_HOURS}
swift-ring-builder object.builder create ${PART_POWER} ${REPLICAS} ${MIN_PART_HOURS}

#
# (2) Add devices
#
# zone 1
swift-ring-builder account.builder   add z1-192.168.0.101:6002/sdb1 1
swift-ring-builder container.builder add z1-192.168.0.101:6001/sdb1 1
swift-ring-builder object.builder    add z1-192.168.0.101:6000/sdb1 1

# zone 2
swift-ring-builder account.builder   add z2-192.168.0.102:6002/sdb1 1
swift-ring-builder container.builder add z2-192.168.0.102:6001/sdb1 1
swift-ring-builder object.builder    add z2-192.168.0.102:6000/sdb1 1

# zone 3
swift-ring-builder account.builder   add z3-192.168.0.103:6002/sdb1 1
swift-ring-builder container.builder add z3-192.168.0.103:6001/sdb1 1
swift-ring-builder object.builder    add z3-192.168.0.103:6000/sdb1 1

# zone 4
swift-ring-builder account.builder   add z4-192.168.0.104:6002/sdb1 1
swift-ring-builder container.builder add z4-192.168.0.104:6001/sdb1 1
swift-ring-builder object.builder    add z4-192.168.0.104:6000/sdb1 1

#
# (3) create ring files (rebalance)
#
swift-ring-builder account.builder rebalance
swift-ring-builder container.builder rebalance
swift-ring-builder object.builder rebalance

ここで、オーナの設定をしておく。

# chown -R swift:swift /etc/swift

以上で設定が完了なので

# swift-init proxy start

プロクシサーバを起動する。

現時点で動作確認する手段が不明なので、とりあえず 8080 ポートが python プロセスにより LISTEN されていればOK。

以上で、プロクシサーバの構築は終了。次回は最後に残ったストレージサーバについて記述予定。

Diablo版Swiftインストール:keystone編

久しぶりにSwiftをさわることなり、以前からバージョンアップもされ、特に認証機能が大きく変わったので、再度インストールを試みたのでそのときのメモ。

今回は、認証機能である keystone のインストールについてメモっておく。参考にしたのは以下のサイト。

ちなみに、この記事を書いている段階ではまだ各機能の詳細については理解してない。とりあえず、上記サイトを参考にして動かすことだけを目的とした。

構成

今回試した構成は以下のようなもの。

          +ーー[認証サーバ(keystone)]
[クライアント]ーー+
          +ーー[プロクシサーバ]ーー+ーー[ストレージ1]
                        +ーー[ストレージ2]
                        +ーー[ストレージ3]
                        +ーー[ストレージ4]

ゾーンはストレージノードごとに別々としたので、都合4ゾーンの構成。

なお今回は、すべて http でのアクセスを想定しての設定とした。SSL の場合はまた別途考えるかもしれないけれど。。。

認証サーバとプロクシサーバ(クライアント側に見える)のIPはそれぞれ以下の通りとしている。

認証サーバ 172.16.0.99/16
プロクシサーバ 172.16.0.100/16

OS環境

今回は Scientific Linux 6.1(64bit)を利用した。実際はさくらのクラウド(β)のテンプレートを使ったので特にOS自体のインストールはしていないので、インストール方法は省略。

OpenStack Diablo 版の公開リポジトリhttp://yum.griddynamics.net/yum/ にあるので、こちらを利用することにした。その準備として、まず以下のようにリポジトリ情報の元となるrpmをインストールした。

# wget http://yum.griddynamics.net/yum/master/openstack/openstack-repo-2011.3-0.2.noarch.rpm
# rpm -ivh openstack-repo-2011.3-0.2.noarch.rpm

その後、diablo-centos, diablo からパッケージを取得するように /etc/yum.repos.d/openstack.repo を以下のように修正した。

[diablo-centos]
name=OpenStack Diablo for CentOS
baseurl=http://yum.griddynamics.net/yum/diablo-centos
enabled=1
gpgcheck=1
metadata_expire=90
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-OPENSTACK

[diablo]
name=OpenStack Diablo
baseurl=http://yum.griddynamics.net/yum/diablo
enabled=1
gpgcheck=1
metadata_expire=90
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-OPENSTACK

パッケージインストール

認証サーバに必要なパッケージは以下のようにしてインストールした。

# yum install python-greenlet python-httplib2
# yum --disablerepo=diablo install openstack-keystone start-stop-daemon python-paste-deploy python-setuptools python-webob

keystoneの設定

keystoneの設定は /etc/keystone/keystone.conf に記述する。とりあえず、パッケージからインストールされたそのままを使った。

その後、keystoneを起動。

# chkconfig --add openstack-keystone
# chkconfig openstack-keystone on
# service openstack-keystone start

keystone が起動したらユーザやリージョンなどの初期データを登録する。このときのデータに少し嵌った。
TechTarget の記事は Diablo-4 の時のもので、このときはServiceを登録しなくてもよかったのか、Serviceの登録コマンドがなかった。このため動作しなかったのだと思うけど、github の情報や動作しなかった時のデバッグログから、Serviceの登録が必須のようであったので、初期データスクリプトを以下のようにし実行した。

#!/bin/bash
BIN_DIR=/usr/bin
# Tenants
$BIN_DIR/keystone-manage $* tenant add admin
$BIN_DIR/keystone-manage $* tenant add demo

# Users
$BIN_DIR/keystone-manage $* user add demo secrete demo
$BIN_DIR/keystone-manage $* user add admin secrete admin

# Roles
$BIN_DIR/keystone-manage $* role add Admin
$BIN_DIR/keystone-manage $* role add Member
$BIN_DIR/keystone-manage $* role grant Admin admin

SWIFT=172.16.0.100
KEYSTONE=172.16.0.99

# Services
$BIN_DIR/keystone-manage $* service add swift object-store 'Swift-compatible service'
$BIN_DIR/keystone-manage $* service add identity identity 'OpenStack Identity Service'

#endpointTemplates
$BIN_DIR/keystone-manage $* endpointTemplates add RegionOne 1 http://${SWIFT}:8080/v1/AUTH_%tenant_id% http://${SWIFT}:8080/ http://${SWIFT}:8080/v1/AUTH_%tenant_id% 1 1
$BIN_DIR/keystone-manage $* endpointTemplates add RegionOne 2 http://${KEYSTONE}:5000/v2.0 http://${KEYSTONE}:5001/v2.0 http://${KEYSTONE}:5000/v2.0 1 1

# Tokens
$BIN_DIR/keystone-manage $* token add 999888777666 admin admin 2015-02-05T00:00

#Tenant endpoints
$BIN_DIR/keystone-manage $* endpoint add admin 1
$BIN_DIR/keystone-manage $* endpoint add admin 2

$BIN_DIR/keystone-manage $* endpoint add demo 1
$BIN_DIR/keystone-manage $* endpoint add demo 2

ちなみに、Diablo のリリース後に keystone/manage/api.py が修正されていて、endpointTemplates の add では service id ではなく service name を記述するようになっている。なので、上記の #endpointTemplates の部分は

#endpointTemplates
$BIN_DIR/keystone-manage $* endpointTemplates add RegionOne swift http://${SWIFT}:8080/v1/AUTH_%tenant_id% http://${SWIFT}:8080/ http://${SWIFT}:8080/v1/AUTH_%tenant_id% 1 1
$BIN_DIR/keystone-manage $* endpointTemplates add RegionOne identity http://${KEYSTONE}:5000/v2.0 http://${KEYSTONE}:5001/v2.0 http://${KEYSTONE}:5000/v2.0 1 1

と書くように変更しなければならないようだ。

また、もし設定をミスったりして最初からデータ登録をやり直したい場合は、openstack-keystone を停止後に /var/lib/keystone/keystone.db を削除して、再度 openstack-keystone を開始すればよい。

動作確認

以上で必要最低限の設定までできたので動作確認できる。

# curl -d '{ "auth" : {"passwordCredentials":{"username": "admin", "password": "secrete"}}}' -H "Content-type: application/json" http://localhost:5000/v2.0/tokens

と実行して

{"access": {"token": {"expires": "2011-10-23T23:29:11.643318", "id": "5bb58e2c-dd73-4858-9133-7a0e809146ec", "tenant": {"id": "1", "name": "admin"}}, "serviceCatalog": [{"endpoints": [{"adminURL": "http://172.16.0.100:8080/", "region": "RegionOne", "internalURL": "http://172.16.0.100:8080/v1/AUTH_1", "publicURL": "http://172.16.0.100:8080/v1/AUTH_1"}], "type": "object-store", "name": "swift"}, {"endpoints": [{"adminURL": "http://172.16.0.99:5001/v2.0", "region": "RegionOne", "internalURL": "http://172.16.0.99:5000/v2.0", "publicURL": "http://172.16.0.99/v2.0"}], "type": "identity", "name": "identity"}], "user": {"id": "2", "roles": [{"id": "1", "name": "Admin"}], "name": "admin"}}}

のような出力が得られる。
ポート5001に対しても同様なコマンドを実行して、同様な出力が得られることを確認できる。

その他気づいたこと

OpenStack Docs: Current では

# curl http://localhost:5001/v2.0/

のようにして動作確認をするような記述がある。しかし、これを実行するとエラーとなった。

調べた感じでは、rpmパッケージとしてkeystoneを入れると、keystoneコマンドは /usr/bin/keystone というパスに存在する。しかし、/usr/lib/python2.6/site-packages/keystone 配下のソースのいくつかでは

possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
                                   os.pardir,
                                   os.pardir))

という記述がある。おそらく、github のディレクトリ構成そのままで動かす場合は問題ないのだと思うが、rpmパッケージ化により、この部分が機能していないように見える。
なので、とりあえずは

possible_topdir = '/usr/lib/python2.6/site-packages'

とすれば、エラーは起きなくなった。

ただし、今回Swiftを動かした範囲においてはこの修正がなくとも動作はした。

以上で、keyston の設定はおしまい。次回はプロクシサーバについて記述予定。

EC2にSwiftをインストール

分散ストレージ的なものを探していたら、OpenStackSwiftというS3的なストレージがあることを知ったので、まずはどんなものか知るためにインストールしてみることにした。

そのときのインストールメモ。

インストール時に固定IPがあったほうがSwiftの手順に従いやすかったので、Amazon VPC内にEC2インスタンスをたててインストールしてみた。

対象の LinuxUbuntu 10.04 で、これは UbuntuEC2StartersGuide - Community Help Wiki に載っている AMI を利用した。

手順の基本はChapter 3. Installing and Configuring OpenStack Object Storageの通り。若干、EC2のせい(?)なのか修正したところと、ドキュメント通りではうまくいかなかったところもあったので、その部分をメモっておく。

ちなみに、構成としては

  • Porxy 兼 Auth ノード1台(IP: 10.0.0.11)
  • Storage ノード5台(IP: 10.0.0.12 〜 16)

というドキュメント通りの構成。

なお、Storage ノードについては、EBS 1GB を /dev/sdb としてアタッチした。

Amzon VPC ではNICそのものに割り当てるIPを指定できるのがいいところですね。もっとも、現状だと東京リージョンにないので、US-east を使用。そのため若干コマンドうつのにストレスを感じつつ作業をしましたが。。。あと、micro 使えないので少しお財布を気にする必要もあり。立ち上げっぱなしは個人としては大変!

Ubuntuのapt設定修正

利用したAMIでは /etc/apt/sources.list で指定されている apt サーバが us-east-1.ec2.archive.ubuntu.com を指していたけれど、少なくとも試した時点ではこのサーバがいなかったので、source.list を結局以下のように記述した。

deb http://archive.ubuntu.com/ubuntu/ lucid main universe
deb-src http://archive.ubuntu.com/ubuntu/ lucid main universe
deb http://archive.ubuntu.com/ubuntu/ lucid-updates main universe
deb-src http://archive.ubuntu.com/ubuntu/ lucid-updates main universe
deb http://security.ubuntu.com/ubuntu lucid-security main universe
deb-src http://security.ubuntu.com/ubuntu lucid-security main universe

python netifaces でのエラー対策

apt-get install swift openssh-server

swiftのパッケージをインストールすると、依存関係により python-netifaces というのが入る。

EC2 での問題なのかわからないが、あとあとProxyとかのサーバを起動すると /usr/share/pyshared/swift/common/utils.py で

ValueError: You must specify a valid interface name.

というエラーが発生する。

そこで、少し調べてみた。

$ python
>>> import netifaces
>>> netifaces.interfaces()
['lo', 'eth0', 'dummy0', 'ifb0', 'ifb1', 'eql']
>>> netifaces.ifaddresses('eql')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: You must specify a valid interface name.

どうやら 'eql' というインターフェイス(?)に対して 'netifaces.ifaddresses' でアドレス情報を取得しようとして失敗しているということがわかった。

この 'eql' という文字列が取得されるのが EC2 のせいなのかどうかわからないけれど、以下のように utils.py にパッチをあてることで無理矢理回避を行った。

--- /usr/share/pyshared/swift/common/utils.py.bak
+++ utils.py
@@ -543,7 +543,9 @@
     :returns: list of Strings of ip addresses
     """
     addresses = []
-    for interface in netifaces.interfaces():
+    interfaces = netifaces.interfaces()
+    interfaces.remove('eql')
+    for interface in interfaces:
         iface_data = netifaces.ifaddresses(interface)
         for family in iface_data:
             if family not in (netifaces.AF_INET, netifaces.AF_INET6):

proxy-server.conf

Proxyノードの設定おいて、proxy-server.conf を記述したけれど、Installing and Configuring the Proxy Nodeの通りだと、後ほどの動作テストのときにうまくいかなった。 Wiki 側の情報(今日見たら、内容が変わっていたので、元情報がない)を見て、[filter:swauth] セクションに以下を記述した。

default_swift_cluster = local#https://10.0.0.11:8080/v1

動作確認前まで

あとはドキュメントの通りでいけた。

ちなみにZoneはノード毎にわけたので、ringにデバイスを追加するときのコマンドは以下のように実行した。

swift-ring-builder account.builder add z1-10.0.0.12:6002/sdb1 100
swift-ring-builder account.builder add z2-10.0.0.13:6002/sdb1 100
swift-ring-builder account.builder add z3-10.0.0.14:6002/sdb1 100
swift-ring-builder account.builder add z4-10.0.0.15:6002/sdb1 100
swift-ring-builder account.builder add z5-10.0.0.16:6002/sdb1 100

動作確認

動作確認 において指定するURLは以下のようにした。

swauth-prep -K swauthkey -A https://10.0.0.11:8080/auth/

要は、https を指定したということ。

これで、一通りの動作確認までできた。

実際の運用のためのオペレーションについてはまた機会があれば調べてみたい。