実践Linux TOP(HOME)へ
クラウド Amazon EC2 2010年11月
Amazon EC2にCentOS5.4仮想マシンを構築してみる。
作業はwindowsマシン(XP、Vista)からやってみた。
なお、このページは他のホームページから借用した部分もあります。そのまま掲載させていただきました。
♪ EC2導入
♪ 各種サーバー設定
VNCサーバー
データベース(postgreSQL)
データベース(MySQL)
ファイルサーバー(samba)
サービスの自動起動設定
♪ SSHのセキュリティ
♪ 静的IPアドレス(EIP)を使用する
♪ EBS(Elastic Block Store)をEC2から利用する
♪ S3ベースのEC2をEBSへ移行する
♪ /homeと/var/lib/pgsqlを外付けデバイス=EBSに移す
♪ Gladinet(Windows)でs3に直接アクセス
EC2導入
●Windowsマシンの下準備1
ここでは、Windowsマシン(ローカルマシン)からアクセスするので、まずWindowsマシンの下準備をしておく。
puttyとwinSCPのインストール。(インストールはSSHサーバーのページ参照)
なお、http://aws.amazon.com/jp/にアクセスして操作するとき、adobeのflash playerが必要となる(S3の管理画面)。
また、windowsXPの場合、Internet Explorerをバージョン8に更新しておく必要がある(バージョン6だとAWS Management Consoleが正しく表示されない)。
●導入 基本的には日経の「クラウドマガジンVol.1」を参照して導入。
http://aws.amazon.com/jp/にアクセス。
@AWSアカウント開設(登録は無料)
ユーザーアカウントはメールアドレスになる。
接続パスワードの設定。
A証明書の作成(秘密鍵を作るのに必要)
アカウント→セキュリティ証明書。
「X.509 Certificates」タブを開き、「Create a new Certificate」。
cert-******.pemとpk-******.pemを得る(ローカルに保存)。
BEC2の利用登録
コンピュータ処理のAmazon Elastic Compute Cloud(EC2)より「Amazon EC2の利用を申し込む」
途中で電話を使った確認作業があるが、これは登録とは別の電話番号(携帯等)を使ってもOK。表示された番号を押すだけ。
CEC2の仮想マシンを起動
EC2管理画面よりスタート。(最初からaws.amazon.com/jp/にアクセスし直した場合は、右上の「AWS Management Consoleを利用する」 ボタン。上の「Amazone EC2」タブを選択。)
Key Pairsの作成
EC2 DashboardのNETWORKING & SECURITY項目より「Key Pairs」。
キーの名前を適当に付ける。(ここではec2_01名)
ec2_01.pemがローカルPCにダウンロードされる。(WindowsVistaではセキュリティで失敗することがあるので注意。ダウンロードに失敗した場合は、いったんキーを削除して=チェック選択してから上の「Delete」ボタン、作り直せばよい。)
複数作成して仮想マシンごとに振り分けることもできる。
ファイウォールの設定
EC2 DashboardのNETWORKING & SECURITY項目より「Security Groups」。
セキュリティ・グループの名前を付ける。(ここではcloud01にしておいた。)
これはsshを許可する設定になっている。設定したら「Save」。
仮想マシンを起動する
「Launch Instance」ボタンを押す。
「Quick Start」、「My AMIs」、「Community AMIs」があるが、「Community AMIs」を開いてcentos5.4で検索する。
32bitを「select」。
マシンの選択は、とりあえずsmallにしておく。
キーやグループの選択は、上で作成したものを指定。
確認画面で「Launch」を押すと、仮想マシンが起動する。
EC2 DashboardのINSTANCES項目より「Instances」を開くと仮想マシンの状況が表示される。
●Windowsマシンの下準備2
WindowsローカルマシンからputtyやwinSCPでsshアクセスできるようにする。
キーの作成(変換)
\data\amazon-keyフォルダ(適当)を用意し、ここにダウンロードされたec2_01.pemキーを置き、putyのキー作成プログラムputtygen.exeをコピーしておく。
コマンドプロンプトから以下を実行。
> cd \data\amazon-key
> puttygen.exe ec2_01.pem -o ec2_01 ←キーをputty用等に変換
ここではec2_01.pubとec2_01.ppkを作る。ec2_01.ppkだけでよいかもしれない。
puttyjp.exeとwinSCPのsshアクセス設定
このec2_01.ppkを使って、puttyjp.exeとwinSCPのキー設定をしておく。キーを使うのでパスワードは空白。
接続先ホスト名は、EC2管理画面からEC2 DashboardのINSTANCES項目より「Instances」を開いて現れる仮想マシンをチェックし、下方に表示されるPublic
DNS項のホスト名をコピーして使うとよい。(または、そこに埋め込まれたIPアドレス)
接続テストをしておく。
●S3に仮想マシンを保存
起動した仮想マシンは、(EC2管理画面からEC2 DashboardのINSTANCES項目より「Instances」を開いて現れる仮想マシンをチェックし、)「Instance Action」の「Terminate」で終了できるが、仮想マシンに設定した内容等そのイメージはすべて消えてしまう。
これを残すためにはS3に仮想マシンのイメージ゙を保存しておく必要がある。
ここではS3操作コマンドを導入して保存してみる。
準備
アクセスキーとシークレットキーの調査
Accoun→(個人情報→)Security Credential→Accesskeys
Access Key ID とSecret Access Key の名称を記録またはメモ帳にコピーしておく。
S3操作コマンドs3cmdを導入する〜バケットの作成
putty(puttyjp.exe)でアクセスして、
# cd /etc/yum.repos.d
# wget http://s3cmd.org/repo/CentOS_5/s3tools.repo
# yum install s3cmd
# s3cmd --configure
ここで上で調べておいたアクセスキーとシークレットキー名の入力が必要。メモ帳からコピーして右クリックで貼り付けできる。
パスワードは空のまま。
後はenterを押していく。
テストは、yキー。
# s3cmd mb s3://mybucket bucketの作成。名称は適当に。これは1回だけ作ればよい。
S3への仮想マシンの保存
ここで使うコマンドはAmazon EC2 AMI toolsのインストールが必要となる。ところがCENTOS5.4仮想マシンにはインストールされていないので、まずこのインストールから。
Amazon EC2 AMI toolsのインストール
製品→Amazon Elastic Compute Cloud(EC2)→左下の方 「関連リソース-開発者ツール」→
Amazon EC2 AMI Tools→rpmファイルをダウンロード。
winSCPを使って、これを仮想マシンの/downloadにでも移動。
puttyでアクセスして、
# cd /download
# rpm -i --test ec2-ami-tools.noarch.rpm
rubyが必要と出る。
# yum install ruby
# rpm -ivh ec2-ami-tools.noarch.rpm
Account Number、アクセスキーID、シークレットアクセスキーの調査
アカウント→セキュリティ証明書。
右上に小さくあるAccount Number 1111-2222-3333。
「Access Keys」タブよりアクセスキーIDとシークレットアクセスキー。
pkファイルとcertファイルを仮想マシンにコピー
winSCPを使って~/(/root)に、証明書のcert-******.pemとpk-******.pemをコピー。
AMIイメージの作成
puttyで仮想マシンにログイン。
(/mntの中身が残っていたら削除しておく。winSCPで確認。仮想マシンを起動して最初なら必要なし。)
# cd /mnt
# ec2-bundle-vol -d /mnt --private ~/pk-******.pem --cert ~/cert-******.pem --user 1111-2222-3333 --fstab /etc/fstab キー名称等は、メモ帳からコピーして右クリックで貼り付けできる。キーが重複しなければワイルドカード*も使えるようだ。
ec2-bundle-volコマンド実行後、次のようにアーキテクチャの種別を問われます。
Please specify a value for arch [i386]: デフォルトのインスタンスタイプである「m1.small」なら、そのまま[Enter]を押してください。「m1.large」など、64ビットプラットフォームのインスタンスを利用している場合は、「x86_64」と入力します。
AMIイメージをS3へアップロード
(初めての場合は必要ないが、同じ仮想マシンのイメージを更新する場合は、前回のイメージを削除しておく。s3で保存ディレクトリ(ここではcentos5.4)を選択して、Actions→Delete。下に進行状況が%表示されるので、それが完了するまでしばらく待つ。)
# cd /mnt
# ec2-upload-bundle --bucket mybucket/centos5.4 --manifest image.manifest.xml
--access-key AKIA***************** --secret-key *********************
--bucketには保存先を示すバケット名を入力。「mybucket/centos5.4」ディレクトリ内にAMIイメージを保存。
仮想マシンのイメージ登録
EC2管理画面からEC2 DashboardのIMAGES項目より「AMIs」→「Register New AMI」。
(更新する場合は、IMAGES AMIsで当該イメージ登録をDe-registerで削除しておく。)
image.manifest.xmlファイルの保存場所を指定(mybucket/centos5.4/image.manifest.xmlを入力)して、「Register」。
これから仮想マシンのイメージを保存し直そうとするたびに、「AMIイメージの作成」以降を繰り返すことになる。
●保存したマシンの起動と停止
起動
AWSにアクセス→右上の「AWS Management Consoleを利用する」 ボタン→上の「Amazone EC2」を選択→(左のEC2 DashboardのINSTANCES項目より「Instances」を選択)→「Launch Instance」ボタンを押す。
「Quick Start」、「My AMIs」、「Community AMIs」があるが、「My AMIs」を開いて当該イメージを「Select」する。
あとは「仮想マシンを起動する」と同じ。
シャットダウン
EC2管理画面からEC2 DashboardのINSTANCES項目より「Instances」を開いて現れる仮想マシンをチェックし、「Instance Action」の「Terminate」で終了できる。ただし、仮想マシンに設定した内容等そのイメージはすべて消えてしまうので、設定等を変更した場合は、S3に保存しておく。
VNCサーバー
調査
# yum list installed | grep vnc ここではインストールされていなかった。
# yum list | grep vnc
インストール
# yum install vnc
vnc-serverも、これでインストールされる。
設定(「sshでVNC接続」参照)
/etc/sysconfig/vncserverの編集(編集はwinSCPで簡単にできる。)
VNCSERVERS="2:root"
VNCSERVERARGS[2]="-geometry 1680x1050 -nolisten tcp -nohttpd -localhost"
パスワードの設定(VNCサービスの起動する前にやっておく。)
パスワードの設定がないとVNCサービスが起動されないので注意。
まず接続したいユーザーでログイン(ここではroot)。
以下のコマンドを実行。
# vncpasswd
おなじみ2回入力。
~/.vnc/passwdができる。
# /etc/init.d/vncserver start
/root/.vnc/xstartupの編集。
#!/bin/sh
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
gnome-session & ←この1行で置き換える
# /etc/init.d/vncserver restart
ところがX Window SystemやGNOMEがインストールされていないので画像が送れない。
次のようにすると、一挙にインストールできるようだ。
# yum groupinstall "X Window System" "GNOME Desktop Environment"
仮想マシンをInstance Actionsでreboot。
これでwindowsXPのVNCクライアントからSSHトンネル接続すると、画像操作ができるようになり楽になる。
puttyのトンネル設定(追加)
源ポート 1234(適宜)
送り先 127.0.0.1:5902
VNCクライアントから接続
serverに「localhost::1234」を指定。
postgreSQL
postgresqlはインストールされているが、postgresql-serverがインストールされていない。
# yum install postgresql-server
◆データベースクラスタの初期化
# su - postgres
$ initdb -E EUC_JP --no-locale
$ exit
◆/var/lib/pgsql/data/pg_hba.confの設定
なにもしなくてよい。localhostからの接続扱いとなる?
◆postgresqlサービスを起動。
# /etc/init.d/postgresql start
◆ユーザーを作っておく。ここではzaikoにしておいた。
シェルは最初/bin/bashにしておかないとsuでログインできない=データベース作成のコマンド等が扱えないが、データベースを作ってしまえば/sbin/nologinに変更しておいてもよいようだ。
# useradd -g postgres -s /bin/bash zaiko
# passwd zaiko
◆ユーザー登録
# su - postgres postgreSQLの管理者postgresで作業
$ createuser zaiko
スパーユーザーになるか=n
このユーザーが新しいデータベースを作ることができるかどうか=y
このユーザーが新しいユーザーを追加できるか=n
$ exit
(パスワードの設定はしない。)
(グループは作らない。)
◆データベースの作成
# su - zaiko
$ createdb zaiko -E EUC_JP 普通、ユーザー名と同じ名前を付ける。
$ exit
puttyのトンネル設定(追加)
源ポート 1235(適宜)
送り先 127.0.0.1:5432
クライアントからの接続(excel)
SERVER=localhost;PORT=1235
※ 大量のデータをテーブルに登録するとき、かなり時間がかかる(3000件で17分も。インターネット越しのトラフィックが問題)。そこで初動で大量のデータを登録するときは、手元のpostgreSQLサーバーに登録してそれをコピーして使ったほうが早い。
テーブルは双方に全く同じ構造で作成し、手元のテーブルにはデータを登録しておく。
まずは、手元のデータベースへ接続。
# su - postgres
$ psql データベース名 データベースへ接続
=# COPY テーブル名 TO '/tmp/test.txt'; テーブルからファイルへ
=# \q 終了
$ exit
この/tmp/test.txtをEC2に移動。
EC2のターミナルを開いて、
# su - postgres
$ psql データベース名
=# COPY テーブル名 FROM '/tmp/test.txt'; ファイルからテーブルへ
シリアル型のデータがある場合、最大値を設定し直しておく。
=# SELECT SETVAL('テーブル名_id_seq',(SELECT MAX(id) FROM テーブル名)); 例えばフィールドidがシリアル型の場合
=# \q
$ exit
MySQL
# yum list installed | grep mysql で確認すると、MySQL(mysql、php-mysql等)はインストール済み。
しかし、mysql-serverがインストールされていないようなので、いったんmysqlを削除してインストールし直すことにする。
# yum remove mysql mysql、php-mysqlが削除される。
# yum install mysql-server mysql、mysql-serverがインストールされる。
# yum install php-mysql php-mysqlをインストール。
◆MySQLの基本設定
データベースの初期化
MySQLをインストールしたばかりのときは、データベースを初期化します。
(バージョンアップのための再インストール時には、絶対にしないこと。)
# /usr/bin/mysql_install_db --user=mysql
設定ファイル/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set=utf8 ← 追記(デフォルトのサーバ文字コードを指定する。ujis, sjis, utf8等が指定可能)
skip-character-set-client-handshake ← 追記(サーバーの文字コード設定をクライアントでもそのまま使うようにする)
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
◆mysqlサービスを起動 # /etc/init.d/mysqld start
◆rootのパスワード設定、ユーザーzaikoの作成、データベースzaikoの作成
# mysqladmin -u root password '**************'
# mysql -u root -p
> grant all privileges on zaiko.* to zaiko@localhost identified by '*********';
> select user from mysql.user where user='zaiko';
> exit
# mysql -u zaiko -p
> create database zaiko;
> show databases;
> exit
◆puttyのトンネル設定(追加)
源ポート 1237(適宜)
送り先 127.0.0.1:3306
◆クライアントからの接続(excel)
SERVER=localhost;PORT=1237
samba
sambaのインストール
# yum install samba
@sambaユーザーの登録
linuxユーザーとsambaユーザーの両方に作る必要がある。
パスワードはsamba独自のものが使われるので、linuxユーザーには設定する必要はない。
# groupadd sambauser グループの作成
# adduser -g sambauser -s /sbin/nologin user01
# pdbedit -a -u user01 user01のパスワードを2回入力
削除は、# pdbedit -x -u user01
一覧は、# pdbedit -L (# pdbedit -L -v user01 で詳細表示)
(pdbeditでなく従来のsmbpasswdを使ってもよいが、pdbeditのほうが汎用性がある。)
パスワードの変更は、従来通りsmbpasswdを使う。# smbpasswd -a user01
A/etc/samba/smb.confの編集
頭の#や;はコメントアウト行なので、使用するときは;をはずす。
[global]、[homes]、[printers]セクションだけは特別な意味をもっている。
[global]
workgroup = WORKGROUP
server string = Samba Server Version %v
hosts allow = 127.
security = user
passdb backend = tdbsam
load printers = yes
cups options = raw
[homes]
comment = Home Directories
browseable = no セクション名での表示をさせない。(そうでないとhomesとユーザーの2つになる。)
writable = yes
[public] ;をはずして使えるようにする。
comment = Public Stuff
path = /home/samba このディレクトリを作成して、グループ所有をsambauser、モードを770に。
public = yes
writable = yes
printable = no 印刷サービスを利用するかどうか。上のprintable = yesのとき有効。
write list = @sambauser 「sambauser」グループ以外のユーザからは読み出し専用となる。
vfs objects = recycle VFSモジュールのゴミ箱を設定。
recycle:keeptree = yes 削除時にディレクトリ構造を維持。
recycle:noversions = yes 同名の場合、新しく削除されたファイルをゴミ箱に保存する。
recycle:repository = .recycle/%u 各ユーザー毎のディレクトリを作る。(ゴミ箱配下のディレクトリは最初に削除した者の権限になってしまう。他の者がゴミ箱に入れられなくなってしまうのを回避する。)
create mask = 0770 この設定がないとファイルは744、ディレクトリは755で作成されてしまい、作成者以外の書き込み等ができい。
directory mask = 0770
B/home/sambaディレクトリを作成して、グループ所有をsambauser、モードを770に。
# chown :sambauser /home/samba
# chmod 770 /home/samba
Csambaを起動
# /etc/init.d/smb start
D[public]のゴミ箱は最初に削除した者の所有で.recycleが自動的に作成されるので、これを変更しておく。
# mkdir /home/samba/.recycle
# chmod -R 770 /home/samba/.recycle
# chown -R root:sambauser /home/samba/.recycle
Windows側
Windows側で用意するものは、Microsoft Loopback AdapterとPuTTYです。
Puttyはインストール済みなので、Microsoft Loopback Adapterをインストールします。
仮想ネットワークインターフェースMicrosoft Loopback Adapterのインストール
現在使用しているネットワークインターフェースとは別に,転送元となるためのネットワークインターフェースを用意します.物理的なインターフェースを増設する必要はなく,仮想的なインターフェースで良いので,以下の方法を紹介します.
・コントロールパネルを開きます.
・ハードウエアの追加を開きます.
・「次へ」を押します.
・「はい、ハードウエアを接続しています」を選択して次へいきます.
・一番下の「新しいハードウエアの追加」を選択して次へいきます.
・「一覧から選択したハードウエアをインストールする(詳細)」を選択して次へいきます.
・「ネットワーク アダプタ」を選択して次へいきます.
・「Microsoft」と「Microsoft Loopback Adaptor」を選択して次へいきます.
・インストールが完了するまで続行します.
Microsoft Loopback Adaptorの設定
・インストールが終わったら,ネットワーク→プロパティ(vistaはさらに →ネットワーク接続の管理).
・デバイス名が「Microsoft Loopback Adaptor」であるアイコンを探します.
・プロパティを開き,全般のタブで,「Microsoft ネットワーク用ファイルとプリンタ共有」のチェックを外します.
・「インターネットプロトコル(TCP/IP)」のチェックは入れたまま,選択し,プロパティを押します.
・他のマシンと重ならない IP アドレスとサブネットマスクを入力します.
プライベートアドレスや LINKLOCAL アドレス (169.254.*.*) のアドレス範囲を使うことになると思います.今後は 169.254.0.1/255.255.0.0 と設定した場合の例として説明します. ゲートウェイ,DNS の項目を入力する必要はありません.
・「詳細設定」を開きます. 「WINS」のタブで「NetBIOS over TCP/IP を無効にする」を選択します.
・それぞれ OK で決定して閉じます.
「詳細設定」→「IP 設定」タブ→「IP アドレス」で,さらに IP アドレスを追加できるので,それらも転送元にすることにより,複数拠点の Samba を同時に使うこともできます.
あとはPuTTYを使ってポートフォワードするだけです。
(「接続」→「SSH」→)「トンネル」を選択します.
源ポートに「169.254.0.1:139」,送り先に「127.0.0.1:139」(SSHサーバーから見た送り先)と入力し,「ローカル」にチェックが入っていることを確認して,追加を押します.
vistaの場合は、源ポート「169.254.0.1:445」,送り先「127.0.0.1:445」。
なお、vista用パッチ(KB94262)があてられていると445ポートのフォワーディングが無効になってしまいアクセスできなくなる。
解決策は、http://www.sshvpn.de/のLocalSMB.exeをダウンロードし、管理者権限(右クリック)で実行。PCを再起動するとアクセスできるようになる。
SSH接続ができたら、「ネットワーク」を開いて「\\169.254.0.1」を入力。
サービスの自動起動
現在のランレベルを調べる
# runlevel
runlevelコマンドを実行すると、1つ前のランレベルと現在のランレベルが表示される。1つ前のランレベルが存在しないときは、「N」が表示される。
EC2では「N 4」が表示された。
一覧を見る
# chkconfig --list
ランレベル3、4、5で自動起動にする
# chkconfig --level 345 smb on
# chkconfig --level 345 vncserver on
# chkconfig --level 345 postgresql on
# chkconfig --level 345 mysqld on
SSHのセキュリティ
・rootパスワードの変更
・SSHのポートNOを22から別のポートNOへ変更
・SSH認証を公開鍵認証のみ有効化しパスワード認証を無効化
rootのパスワードを設定(変更)します。
# passwd root
もし「Authentication token manipulation error」が出たら、
# pwconv
してからもう一度やってみてください。
パスワードが/etc/shadowと/etc/passwdとで整合性が取れなくなるとでるようです。
システム全体でパスワード認証を禁止する。
sshd_config設定ファイルのPasswordAuthenticationにnoを指定します。また、PAMが使用可能になっている場合はPAMのチャレンジレスポンス認証がパスワード認証と同じ機能を持っているため、ChallengeResponseAuthenticationにもnoを指定する必要があります。パスワード認証を禁止する場合は、PasswordAuthenticationとともに必ずChallengeResponseAuthenticationもnoを指定してください。ChallengeResponseAuthenticationがyesになっていると、PAMを使っている場合にパスワードによるログインを受け付けてしまうことがあります。
/etc/ssh/sshd_config
#Port 22 別のポートに変更する場合はここを編集
接続を受けつける (listen する) ポート番号を指定します。デフォルトは 22 です。複数指定することも可能です。
Protocol 2 SSH2のみ許可
プロトコルのバージョンを指定します。とりうる値は `1' と `2' です。複数のバージョンをカンマで区切って指定することもできます。デフォルトは"2"です。ここでのプロトコルの順番は、優先度を指定するものではないことに注意してください。なぜなら複数のプロトコルがサーバで使用可能な場合、選択するのはクライアント側だからです。よって"2,1"という指定は、"1,2"と同じです。
PermitRootLogin without-password
root がログインできるかどうか指定します。without-password=公開鍵認証のみ許可、no=いっさいのrootログインを禁止、yes=公開鍵認証/パスワード認証ともに許可、forced-commands-only=強制コマンドのみ。この設定項目を"without-password"にすると、root はパスワード認証ではログインできなくなります。デフォルトは"yes"です。
#PermitEmptyPasswords no
パスワード認証が許可されているとき、パスワード文字列が空のアカウントに対してサーバがログインを許可するかどうか指定します。デフォルトは"no"です。
PasswordAuthentication no yesをnoに変更する
パスワード認証を許可するかどうか指定します。デフォルトでは"yes"になっています。
ChallengeResponseAuthentication no
チャレンジ・レスポンス認証を許可するかどうか指定します。login.confに記されているすべての認証形式が使えます。デフォルトは"yes"です。
UsePAM yes
PAMインターフェイスによる認証を許可します。これが"yes"に設定されている場合、すべての認証形式に対してChallengeResponseAuthenticationを使用した PAM 認証と、PAM アカウントおよびセッションモジュールの処理が許可されます。ふつう PAM のチャレンジ・レスポンス認証はパスワード認証と等価な役割を提供しているので、PasswordAuthenticationあるいはChallengeResponseAuthentication.のどちらかを許可する必要があります。UsePAMを許可した場合、sshd を root 以外の一般ユーザで走らせることはできません。デフォルトは"no"です。
AWS Management ConsoleでSSHのIP制限
これはいろんなところからアクセスできないようにSSHポートの使用を許可するIPアドレスを限定する作業です。
AWS Management Consoleの左のメニューの「Security Groups」を選択します。
インスタンスに指定したSecurity Groupsを選択します。
Source (IP or group) 0.0.0.0/0 となっている部分を変更して許可するIPアドレスを限定する。
静的IPアドレス(EIP)を使用する
初期状態では、一つのインスタンスに、EC2の中だけで使えるPrivate IPと、外部からアクセスするためのPublic IP(グローバルアドレス)が割当てられています。インスタンス自体への割当IPはPrivate IPですが、上位のルータに1:1のNATがあり、これによって外部からPublic IPでアクセスできる様になっています。
さらに、今までのPrivate IPとPublic IPに加えて、新たに固定IPのグローバルアドレスが割り当てられるElastic IPを選択出来るようになりました。これは、Elastic IPはアカウントに対して割り当ててもらう静的なIPアドレスで、好きなインスタンスに対して紐付けることで、固定IPをインスタンスに割り当てることができます。これを使えば、EC2で最大の問題点であった、「インスタンスを再起動するとIPアドレスが代わる」という問題から解放され、DynamicDNSを使って更新を通知する等の必要がなくなります。
ただし、固定IPを取得した場合、インスタンスに割り当てないときは費用が発生するので注意が必要です。1つのアカウントに割り当てられる固定IPは最大5つまで
。Amazonに申請することで増やしてもらうことは可能のようです。
Elastic IPを使うために、EC2 API toolsをアップデートします。API Toolsもバージョンアップしているので、ダウンロード&置き換えが必要です。(インストールは前節を参照。)
※ ここでは EC2 API toolsを使った基本方法でやってみるが、EC2管理画面→EC2 DashboardのNETWORKING & SECURITY ?Elastic IPsで簡単に操作することもできる。
●自分のアカウントに割り当てるElastic IP(EC2の固定IP)を取得。
# ec2-allocate-address
ADDRESS 184.72.220.20
●取得している固定IP一覧
# ec2-describe-addresses
ADDRESS 184.72.220.20
●現在のアカウントで起動しているインスタンスを確認。
# ec2-describe-instances
RESERVATION r-6a705801 474864249150 cloud01
INSTANCE i-e759178d ami-a2719bcb ec2-72-44-37-232.compute-1.amazonaws.com domU-12-31-39-06-C4-E7.compute-1.internal
running ec2_01 0 m1.small 2010-09-03T20:20:19+0000 us-east-1a monitoring-disabled
72.44.37.232 10.208.203.21 instance-store paravirtual
●静的IPの関連付け
あとは既に立ち上げているサーバにこの静的IPアドレスを関連付けてやる。
# ec2-associate-address -i i-e759178d 184.72.220.20
ADDRESS 184.72.220.20 i-e759178d
注意する点はこのコマンドを打つと以前i-e759178dが持っていたグローバルIPは解除され、新しい静的IP(184.72.220.20)に関連付けられるので、今までのPublic IPではアクセス出来なくなります。インスタンスに割り当てられるグローバルアドレスはPublic IPかElastic IPのどちらかになります。
これで、Public IPの代わりに先ほど指定したElastic IPのアドレスが割り当てられます。
Private IPに変更はないので、インスタンスの再起動などは行われません。
※ 固定IPをインスタンスに割り当てた際は、反映されるまでしばらく待ち時間が発生する(数分)。
●確認
# ec2-describe-addresses
ADDRESS 184.72.220.20 i-e759178d
このElastic IPは剥がす事もできるので、別のインスタンスを上げておいて、そちらに振り直す事もできます。
この静的IPアドレスを違うサーバに割当てたり、解除するには
●割り当てを解除
# ec2-disassociate-address 184.72.220.20
ADDRESS 184.72.220.20
とする。
ここで割当てを解除されたサーバは前に持っていたIPとは別のグローバルIP(Public IP)を割当てられる。
※ 固定IPを解除した場合、反映されるまでしばらく待ち時間が発生する(数分)。
●確認
# ec2-describe-addresses
ADDRESS 184.72.220.20
●グローバルIPアドレスが変っていることを確認
# ec2-describe-instances i-e759178d
.... ec2-75-102-xxx-xxx.compute-1.amazonaws.com .....
●静的IPアドレスの開放
取得した静的IPアドレスを開放するには
# ec2-release-address 184.72.220.20
ADDRESS 184.72.220.20
EBS(Elastic Block Store)をEC2から利用する http://d.hatena.ne.jp/rx7/20080825/p1より借用
Amazon EBSは,Amazon EC2上で運用する仮想マシンに接続して利用する「外付けディスク」です。特にデータベース、ファイルシステム、または未使用のブロックレベルストレージが必要なアプリケーションに適しています。
EBSボリュームは、一度に1つのインスタンスにしかマウントできませんが、1つのインスタンスには複数のEBSボリュームがマウントできます。
●調査
インスタンスが稼動しているロケーションやインスタンスID
# ec2-describe-instances
RESERVATION r-4655572d 474864249150 cloud01
INSTANCE i-03dde969 ami-ea9a6f83 ec2-184-72-206-248.compute-1.amazonaws.com domU-12-31-39-0C-25-B7.compute-1.internal
running ec2_01 0m1.small 2010-09-17T23:20:10+0000 us-east-1a monitoring-disabled 184.72.206.248 10.215.38.69 instance-store paravirtual
上記の例では、インスタンスの稼動ロケーションは「us-east-1a」となります。
●EBSボリューム(仮想ディスク)の作成 ─GUIでも簡単にできる
# ec2-create-volume -z us-east-1a -s 5
VOLUME vol-30032f59 5 us-east-1a creating 2010-09-18T05:27:58+0000
"-z"オプションで、先程メモした稼動ロケーション(上記例だと"us-east-1b")を入力、"-s"でディスクのサイズ(単位はギガバイト[GB]、上記例では5GB)を入力します。
作成後、ボリュームID(上記例だと"vol-30032f59"の部分。"ec2-describe-volumes"コマンドでも確認できます)をメモしておきます。
●作成したEBSボリュームを、既に稼動しているEC2インスタンスにAttach(取り付け) ─GUIでも簡単にできる
# ll /dev/sd* で使用デバイスを確認。/dev/sdcは使用されてないことを確認。
# ec2-attach-volume -d /dev/sdc -i i-03dde969 vol-30032f59
ATTACHMENT vol-30032f59 i-03dde969 /dev/sdc attaching 2010-09-18T05:35:11+0000
上記例では、"-d"オプションでインスタンスで認識するデバイス名を指定、"-i"オプションで、どのマシンに接続するかを識別するインスタンスID(先程メモしたもの)、最後に先程作ったボリュームを示すボリュームIDを指定します。
尚、EC2インスタンスにAttachするEBSボリュームは、稼動ロケーションを揃えておく必要があります。
揃っていない場合は、下記のようなエラーが発生します。
Client.InvalidVolume.ZoneMismatch: The volume 'vol-30032f59' is not in the same availability zone as instance 'i-25c3194c'
Attachが正常終了すると、"ec2-describe-volumes"コマンドで確認できます。
Attachするときに指定した"/dev/sdc"で認識できているか確認
# ll /dev/sd*
brw-r----- 1 root disk 8, 1 Sep 17 19:22 /dev/sda1
brw-r----- 1 root disk 8, 2 Sep 17 19:22 /dev/sda2
brw-r----- 1 root disk 8, 3 Sep 17 19:22 /dev/sda3
brw-r----- 1 root disk 8, 32 Sep 18 01:35 /dev/sdc
●接続したボリュームにファイルシステムを作成
# mkfs -t ext3 /dev/sdc
●マウント
# mkdir /vol
# mount /dev/sdc /vol
確認
# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 10321208 2399336 7397584 25% /
none 870472 0 870472 0% /dev/shm
/dev/sda2 153899044 192072 145889348 1% /mnt
/dev/sdc 5160576 141440 4756992 3% /vol
●スナップショット機能を使ってボリュームのバックアップをとってみる
Amazon EBS は、リカバリー用にデータのスナップショットを Amazon S3 にバックアップする機能が装備されています。Amazon EBS スナップショットは、最後にスナップショットをとった時点から変更のあるブロックのみを保存する差分バックアップです。つまり、100 GBのデータを格納するデバイスのうち、最後にスナップショットをとってから 5GB のみに変更がある場合、Amazon S3 には、変更のあった 5GB のみが追加格納されます。
スナップショットとは、ストレージ上に置かれているデータ領域の「ある時点」のイメージです。また、スナップショットは「スナップショットを取得した時点」のデータを保持し続けますので、本番サーバ側でデータを更新してもスナップショットの内容は変わりません。
ここではテスト用の100Mほどのファイルをまず作成
# dd if=/dev/zero of=/vol/test.dump bs=1k count=102400
/dev/zero は、Unix系オペレーティングシステムにおけるスペシャルファイルの1つで、全てヌルキャラクタ(ASCII の NUL、0x00)の内容を読み出すことができる。典型的利用例として、何らかの情報を上書きするキャラクタストリームとして使う。あるいは、特定サイズの内容が何もないファイルを作成するのにも使われる。
1MiB のヌルキャラクタで埋め尽くされたファイル 'foobar' を作成するには、以下のようにする。
dd if=/dev/zero of=foobar count=1024 bs=1024
デフォルトのブロックサイズは 512 だが、bs で変更可能。
確認
# ll /vol/
total 102520
drwx------ 2 root root 16384 Sep 18 02:58 lost+found
-rw-r--r-- 1 root root 104857600 Sep 18 04:41 test.dump
ボリュームの状態を確認
# ec2-describe-volumes
VOLUME vol-30032f59 5 us-east-1a in-use 2010-09-18T05:27:58+0000
ATTACHMENT vol-30032f59 i-03dde969 /dev/sdc attached 2010-09-18T05:35:11+0000
ID"vol-30032f59"のボリュームのスナップショットを作成します。 ─GUIでも簡単にできる
# ec2-create-snapshot vol-30032f59
SNAPSHOT snap-e49cb38f vol-30032f59 pending 2010-09-18T08:45:24+0000474864249150 5
しばらく待って、スナップショットの状態を見ると、スナップショットが終了(100%と表示)していることが確認できます。
# ec2-describe-snapshots
SNAPSHOT snap-e49cb38f vol-30032f59 completed 2010-09-18T08:45:24+0000 100% 474864249150 5
以上で、ボリュームのバックアップは完了です。
ちなみに、上記スナップショットの作成元のボリュームは、EC2インスタンスにAttach、そしてマウントしたままの状態ですので、サービスを稼動したままスナップショットを作成することが可能です。
ただし、ボリュームへファイルの書き込みを行っている最中に、取得したスナップショットをリストアした際に整合性を保っているかどうかの確認はしていないので、注意が必要です。
尚、スナップショットID(上記例では"snap-e49cb38f")は復元(リストア)する際に必要となります。メモしておきます。
●作成したスナップショットより、ボリュームを復元(リストア)してみる
では、スナップショット(バックアップ)から、復元(リストア)する形でボリュームを作成します。
ボリュームを作成するコマンドと同じ"ec2-create-volume"コマンドに、"--snapshot"オプションを付けて、スナップショットID("ec2-describe-snapshots"コマンドで確認できます)を指定します。
尚、ボリューム作成時と同様に、稼動ロケーションも指定する必要があります。下記の例では、今回作成(復元)したボリュームIDは"vol-1ee6ca77"となります。
# ec2-create-volume --snapshot snap-e49cb38f -z us-east-1a
VOLUME vol-1ee6ca77 5 snap-e49cb38f us-east-1a creating 2010-09-18T08:54:10+0000
作成(復元)したボリュームをEC2インスタンスにAttachさせます。この辺は、前半のほうで紹介した手順と同じです。まだ、EC2インスタンスのOS内で使用されていないデバイスを指定するようにしましょう。
# ec2-attach-volume -d /dev/sdd -i i-03dde969 vol-1ee6ca77
ATTACHMENT vol-1ee6ca77 i-03dde969 /dev/sdd attaching 2010-09-18T08:55:31+0000
Attachしたボリュームをマウントします。
# mkdir /vol2
# mount /dev/sdd /vol2
確認
# ll /vol
total 102520
drwx------ 2 root root 16384 Sep 18 02:58 lost+found
-rw-r--r-- 1 root root 104857600 Sep 18 04:41 test.dump
# ll /vol2
total 102520
drwx------ 2 root root 16384 Sep 18 02:58 lost+found
-rw-r--r-- 1 root root 104857600 Sep 18 04:41 test.dump
今回の例で言うと、バックアップ元のボリュームをマウントしている"/vol"と、先程バックアップを復元(リストア)したボリュームをマウントしている"/vol2"の内容が(一応、簡単だけど)同じであることが確認できます。
●ボリュームやスナップショットの削除
まず、EC2インスタンスのOS上でマウントしているデバイスをアンマウントします。
# umount /vol
# umount /vol2
ボリュームの状況を確認
# ec2-describe-volumes
VOLUME vol-1ee6ca77 5 snap-e49cb38f us-east-1a in-use 2010-09-18T08:54:10+0000
ATTACHMENT vol-1ee6ca77 i-03dde969 /dev/sdd attached 2010-09-18T08:55:31+0000
VOLUME vol-30032f59 5 us-east-1a in-use 2010-09-18T05:27:58+0000
ATTACHMENT vol-30032f59 i-03dde969 /dev/sdc attached 2010-09-18T05:35:11+0000
AttachしているボリュームをDetach(取り外し)します。 ─GUIでも簡単にできる
# ec2-detach-volume vol-1ee6ca77
ATTACHMENT vol-1ee6ca77 i-03dde969 /dev/sdd detaching 2010-09-18T08:55:31+0000
# ec2-detach-volume vol-30032f59
ATTACHMENT vol-30032f59 i-03dde969 /dev/sdc detaching 2010-09-18T05:35:11+0000
確認
# ec2-describe-volumes
VOLUME vol-1ee6ca77 5 snap-e49cb38f us-east-1a available 2010-09-18T08:54:10+0000
VOLUME vol-30032f59 5 us-east-1a available 2010-09-18T05:27:58+0000
次に、ボリュームを削除します。 ─GUIでも簡単にできる
# ec2-delete-volume vol-1ee6ca77
VOLUME vol-1ee6ca77
# ec2-delete-volume vol-30032f59
VOLUME vol-30032f59
確認
# ec2-describe-volumes
VOLUME vol-1ee6ca77 5 snap-e49cb38f us-east-1a deleting 2010-09-18T08:54:10+0000
VOLUME vol-30032f59 5 us-east-1a deleting 2010-09-18T05:27:58+0000
"deleting"となっています。
時間が経てば削除が完了し、上記コマンドで表示されなくなります。
最後にスナップショットです。 ─GUIでも簡単にできる
スナップショットの状況を確認します。
# ec2-describe-snapshots
SNAPSHOT snap-e49cb38f vol-30032f59 completed 2010-09-18T08:45:24+0000 100% 474864249150 5
スナップショットの削除
# ec2-delete-snapshot snap-e49cb38f
SNAPSHOT snap-e49cb38f
S3ベースのEC2をEBSへ移行する
S3の場合は、Terminateで停止するときそのときのイメージを保存しておかないといけないが、EBSベースにすると通常のPCのようにstart、stopが使えて、いちいちイメージを保存する必要もなくなる。
●ファイル分割される前のイメージファイルを/mnt/preimgに書き込む。
# cd /mnt
# ec2-bundle-vol -d /mnt --private ~/pk-*.pem --cert ~/cert-*.pem --user
1111-2222-3333 --fstab /etc/fstab -p preimg (キーが重複しなければワイルドカード*が使えるようだ。)
/mnt/preimagのサイズを調べておく。(winSCP等で)
●EBSボリューム(仮想ディスク)の作成
EC2のDashboardよりELASTIC BLOCK STORE ?Volumes
Create Volumeでボリュームの作成。
サイズは/mnt/preimagのサイズより充分大きなものにしておく。
ロケーション(zone)は、EC2インスタンスと同じものを選択。
●作成したEBSボリュームを、EC2インスタンス(仮想マシン)にAttach
作成したボリュームをチェックして、一度右上のrefreshボタンを押しておく。
statusがavailableになっていれば、Attach Volumeボタン。(デバイスを確認しておく。ここでは、/dev/sdf)
statusがin-useに変わる。
●接続したボリュームにファイルシステムを作成
# mkfs -t ext3 /dev/sdf
●ファイル分割される前のイメージファイル(上記例では /mnt/preimg)をEBS 領域に書き込みます。
# dd if=/mnt/preimg of=/dev/sdf かなり時間がかかる。
ddコマンドの進捗状況を確認する
別ウィンドで端末を開き、psコマンドでPIDを確認する。
# ps ax|grep dd
2579 pts/0 R+ 0:00 dd if /mnt/preimg of /dev/sdf
2623 pts/1 R+ 0:00 grep --color=auto dd
killコマンドを実行する。
# kill -SIGUSR1 2579
最初の端末画面に進捗状況を表示します。
●fstab の編集
マウント
# mkdir /ebs
# mount /dev/sdf /ebs
fstabをバックアップする。
# cp /ebs/etc/fstab /ebs/etc/fstab.bak
/ebs/etc/fstabの編集
/dev/sda1 / ext3 defaults 1 1
none /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
/dev/sda2 /mnt ext3 defaults 0 0
/dev/sda3 swap swap defaults 0 0
/dev/sdf /opt/ebs ext3 defaults 0 0
fstab の編集を忘れると Linux 起動時に mount できず起動しませんが、復帰の手段はあります。
- instance を stop
- EBS 領域を開放し、別の linux instance から mount
- fstab を編集
- AMI に再登録
- 新規に instance を起動
●スナップショットの作成
EBSボリュームをデタッチする。
まずアマウントしてから、デタッチ。
# umount /ebs
Detach Volumeボタン。
ブートAMIが格納されているEBSボリュームのスナップショットを作成する。
当該EBSボリュームをチェックしておいて、Create Snapshotボタン。
ELASTIC BLOCK STORE ?Snapshotsで進行状況(refreshボタンを押す)がわかる。
●スナップショットからAMIを登録する
スナップショット情報の確認
# ec2-describe-snapshots
SNAPSHOT snap-46dff12d vol-2ecee247 completed 2010-09-18T14:49:32+0000 100% 474864249150 20
登録
# ec2-register --root-device-name /dev/sda1 --name 'boot from ebs' -b /dev/sda1=snap-46dff12d::false
●起動
IMAGES ?AMIs 当該AMIをッチェックして、launchボタン。
start、stopが使えるようになる。
●通常の起動(stopで停止したものをstartで起動)
EC2 Dashboard → INSTANCES → Instances
当該Instanceをチェックして上の「Instance Actions」よりstart。
稼働中のインスタンス上からAMIの作成と登録が一度に行えるようになっている。
当該インスタンスをチェックして、Instance Actions→Create Image(EBS AMI)。
時間がかかるが、スナップショットが作成されて、AMIに登録される。
スナップショット共有機能
作成したスナップショットを、ほかのAWSユーザーに公開できるようになった。共有は、ユーザーIDを指定してアクセス権を設定できるほか、AWSコミュニティ全体への公開も可能。設定は管理ツール、AWS Management Consoleから行える。
当該スナップショットをチェックして、Permissions。
/homeと/var/lib/pgsqlを外付けデバイス=EBSに移す
●新しいボリュームを2つ作る
ELASTIC BLOCK STORE ?VolumesよりCreate Volume
テスト用に7GB(/home用)と3GB(/var/lib/pgsql用)で作成。
ロケーション(zone)は、EC2インスタンスと同じものを選択。
Volume IDがvol-f8486691、vol-1648667fとする。
●確認
# ll /dev/sd* で使用デバイスを確認。/dev/sdc、/dev/sddは使用されてないことを確認。
●作成したEBSボリュームを、EC2インスタンス(仮想マシン)にAttach
一度右上のrefreshボタンを押しておく。statusがavailableになっていればよい。
作成したボリュームをチェックして、Attach Volumeボタン。
インスタンスを選択し、7GBに/dev/sdc、3GBに/dev/sddを割り付ける。
statusがin-useに変わる。
●接続したボリュームにファイルシステムを作成
# mkfs -t ext3 /dev/sdc
# mkfs -t ext3 /dev/sdd
●/homeの引っ越し
/home2を作り、/dev/sdcをこれに割り当ててマウントする。
# mkdir /home2
# mount /dev/sdc /home2
/homeの内容をコピー。
# cp -a /home/* /home2 (-aは所有者やパーミッションを保ちながら再帰的にコピー)
/homeはリネームしてバックアップをとっておく。
# mv /home /home-old
/home2を/homeにリネームする。
# umount /home2
# mv /home2 /home
●/var/lib/pgsqlの引っ越し
/var/lib/pgsql2を作り、/dev/sddをこれに割り当ててマウントする。
# mkdir /var/lib/pgsql2
# mount /dev/sdd /var/lib/pgsql2
/var/lib/pgsqlの内容をコピー。
# cp -a /var/lib/pgsql/* /var/lib/pgsql2
/var/lib/pgsqlはリネームしてバックアップをとっておく。
# mv /var/lib/pgsql /var/lib/pgsql-old
/var/lib/pgsql2を/var/lib/pgsqlにリネームする。
# umount /var/lib/pgsql2
# mv /var/lib/pgsql2 /var/lib/pgsql
●自動マウントの設定
/etc/fstabの編集
/dev/sdc /home ext3 defaults 1 2
/dev/sdd /var/lib/pgsql ext3 defaults 1 2
最後の1はdumpコマンドによるバックアップ時にバックアップするかどうかで、バックアップするという指定(0だとバックアップしない)。2はfsckによるディスクのチェックをするかどうかで、ルート(/)には1をそれ以外には2を指定することでチェックするようになる。0だとチェックしない。
●再起動
Gladinet(Windows)でs3に直接アクセス
わざわざクライアントソフトやWebブラウザーを利用しなくても、エクスプローラの操作だけでファイルのアップロードやダウンロードといった作業が完結するので非常に手軽で便利。
http://www.gladinet.com/よりCloud Desktop Starter Edition (32-bit) をダウンロードし、インストールする。
まずMount Cloud Storageよりアクセス設定をする。
Storage Providerには、Amazon S3 US Bucketを選択。
名称は、適当に設定。
次の画面で、キーや接続バケット先の設定を行う。
これらの設定は後でStorage Managerより編集できる。
あとは、Explore My Gladinet DriveよりAmazon S3 US Bucketを選択するだけでS3当該バケットにアクセスできる。
※ 削除とか簡単にできるので、インスタンスのAIMが入っているバケットとはきちんと分けておく必要がある。
TOP(HOME)へ