EC2でEBSを使う

EC2でEBSを使ってみましょう。
EBSは外部のファイルサーバのような物で、ここに格納したデータは、EC2のインスタンスを落としても消えることはありません。更に、スナップショットを取ってS3にバックアップ出来るなど、データを確保したまま継続運用を行えます。またEBSは、複数のEC2インスタンスからアタッチしてマウントできるので、データの共有も行えます。

作成からアタッチまでの手順です。

1.EBS領域の作成
AWS Management Consoleの「ELASTIC BLOCK STORE」メニューの「Volumes」を選択。
そして「create volume」で必要なサイズを指定して作成します。
ただし、EC2のロケーションと同じ場所でないとアタッチ出来ないので、必ず同じロケーションを指定してください。

2.EC2へのアタッチ
ローカルマシンから以下のコマンドを打つと、アタッチされます。

# ec2-attach-volume -d /dev/sdc --region us-west-1 -i i-**** vol-****

westで使うときは、--region us-west-1の指定を忘れずに。eastがデフォルトなので、eastの場合は指定がいらないので、つい忘れてしまいますから。

i-****は接続先のEC2のインスタンスIDです。
vol-****はEBSのVolume IDです。

以下のコマンドで状態を確認してください。

# ec2-describe-volumes --region us-west-1

ステータスがattachedになっていれば完了です。

3.EC2から確認してみる
EC2にsshログインして、以下で認識されているか確認してください。

# ll /dev/sd*

先程の/dev/sdcが確認できたらOKです。

3.ファイルシステムの作成
あとは通常のLinuxの知識です。

# mkfs -t ext3 /dev/sdc
# mkdir /vol
# mount /dev/sdc /vol

もしMySQLとかのデータを本格的にこのボリュームで動かすなら、ext3よりもxfsとかの方がいいかもしれません。カーネルによるので、その辺りは調べてみても良いかもしれません。

AWS利用料金の確認

備忘録だらけですいません。

AWSの利用料金の確認方法です。
数時間更新(1時間?)で、リアルに今いくら使ったかが分かります。

アマゾンのAWSのTOPページhttp://aws.amazon.com/に行き、「Your Account」→「Account Activity」で、料金が出ています。リアルに上がっていくのでドキドキです。

AWSをeastからwestに移して稼働させる

S3に稼働中のEC2のAMIを保存するからの続きです。

eastのS3上に作成したAMIを、westに転送して、インスタンスを稼働させます。

1.eastからwestにコピー
us-east-*のインスタンスにログインして、以下のコマンドを実行します。
転送する場合、先にwestのS3のバケットを作るとNGになります。以下のコマンドの最後にwestのバケット名をしていすると、自動的に作成してくれます。

# ec2-migrate-bundle -k ${private key file} -c ${cert file} -a ${access key ID} -s ${secret access key} --bucket ${source bucket(eastの物)} --manifest ${manifest filename} --location us-west-1 --region us-west-1 --destination-bucket ${west backet name}

これもサイズによりますが、時間がかかります。
終わるとwestでのmanifestへのフルパスが表示されるので、保存しておきましょう。

2.westにAMIを登録する
今度は、west側にAMIを登録します。

ec2-register --region us-west-1 --name ${イメージ名} ${新しいmanifestのwestでのフルパス}

3.eastのAMIを削除
eastの分を削除しておきましょう。

# ec2-deregister ${AMIのID}

※もしwestのを削除する場合は

# ec2-deregister --region us-west-1 ${AMIのID}

4.westでインスタンスを起動
AWS Management Consoleにログインし、左上の「region」を「US west」に変更。
「Launch Instance」で、「My AMI's」を選択し、2で登録したAMIのIDを探しインスタンスを起動する。

うまくいきました!!

参考
http://mtl.recruit.co.jp/mt/mt-tb.cgi/809

mixiアプリでgoogle Analyticsを使う方法

mixiアプリの解析にgoogle analyticsを利用してみます。

まず
mixiアプリで実際使えんのかよ?」
って思ったんですが、こちらに「OK!使える」って意味のことが書いてるんで、使えるんでしょう。

http://developer.mixi.co.jp/appli/pc/lets_enjoy_making_mixiapp/ablle_list

あと、こちらにOpenSocialアプリでの利用の仕方が書かれていました。

http://groups.google.co.jp/group/opensocial-japan/browse_thread/thread/0c27937954fbcb5a

ってことで、この2つの内容を合わせるとですね

<Require feature="analytics" /> 

<script type="text/javascript"> 
   _IG_Analytics(<ID>, <仮想パス>); 
</script>

って書けば、mixiアプリでも動くんじゃないのかってことです。

最悪でも通常のトラッキングコードを書けば動くでしょ

<Require feature="analytics" /> 

<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker(<ID>);
pageTracker._trackPageview();
} catch(err) {}</script>

ってのりで、埋め込んでみたんですけど。。。
まだ結果を見てないので、うまくいったら報告します。

S3に稼働中のEC2のAMIを保存する

実は。。。
インスタンスをEASTに作ってセットアップしてしまったので、今のうちにWESTに移そうと思います。EBSで実運用は行う予定ですが、一旦はEASTのS3にイメージを保存して、WESTに送って、WESTで新しくインスタンスを立ち上げてからEBSにて稼働させる予定。

その手順のAMIの登録までです。相変わらず備忘録ですが。

1.S3のBucketを作る

1-1.まずはX.509証明を取得
AWSのページの右上、Your Account→Security Credentialsのページを開きます。
真ん中のタブ「X.509 Certificates」で、X.509 Certificateカラムの下にあるDownloadをクリックして、2つのキーをダウンロードして下さい。

pk-******.pem
cert-*******.pem

1-2.Access keyとSecret Access keyの取得
同じページの左のタブ「Access Keys」で、「Access Key ID」と「Secret Access Key」を取得します。

2.S3Foxのインストール
Firefoxを開き、以下のアドオンをインストールして下さい。
https://addons.mozilla.org/ja/firefox/addon/3247

3.S3のbacketを作る
S3Foxを起動後、左上のManage Accountsで、1-2.で取得したAccess key IDとSecret Access keyを設定します。

S3Foxの右側のエリアで右クリックし、Create Directoryでディレクトリを作成します。この名前は、AWS全体で一意じゃないといけないので、他の人とかぶるとNGです。

参考
http://codezine.jp/article/trackback/3232

4.稼働中のインスタンスのイメージを作成
稼働中のインスタンスに、1-1.で取得したファイルを転送しておきます。
それを/mntに保存。

いよいよAMIの作成です。ただし、保存されるのは/dev/sda1のみで、/dev/sda2などは保存されないのでご注意を。

# ce /mnt
# ec2-bundle-vol -d /mnt --privatekey pk-*****.pem --cert cert-*****.pem --user ${Acount key ID} --fstab /etc/fstab

Please specify a value for arch [i386]: 32bitならこのままEnter。54bitなら「x86_64」と入力しEnter

サイズによって時間はまちまちですが、作成されるまでに時間がかかります。
15分くらいですかね。

5.AMIをS3に転送
Amazon EC2」⇔「Amazon S3」間の転送量は課金対象外となっているため、安心して使うことができます。

# ec2-upload-bundle --bucket ${バケット名} --manifest image.manifest.xml --access-key ${Access key ID} --secret-key ${Secret Access key ID}

${バケット名}は、例えば「bucketname」というバケットを使っていて、その直下にある「ec2_images」ディレクトリ内に「fedora」という名前でAMIを保存したい場合は、上記例の${アップ先のバケット名}部分に「bucketname/ec2_images/fedora」と入力します。

6.AMIの登録
AMIを登録しておけば、次回からそのAMIで起動が可能になります。
ローカルのパソコンから以下のコマンドを打ってください。
※ec2-api-toolsがインストールされている前提です。

# ec2-register ${バケット名}/image.manifest.xml -n ${イメージ名}

${アップ先のバケット名}は、5.で指定したものです。
${イメージ名}は分かりやすいもので

このとき、以下の出力がされるます

IMAGE ami-*****

これがAMIのIDになります。クライアントから以下でも確認可能です。

# ec2-describe-images -o self

参考
http://codezine.jp/article/trackback/3546
http://builder.japan.zdnet.com/member/u502383/blog/2008/08/19/entry_27013061/

EC2の手引き

EC2の申し込みが終わったら、インスタンスを立ち上げましょう。
これがなかなか大変だったので、こちらに記述しておきます。

1.操作用のクライアントツールを決める
 Eclipseプラグインや、Firefox用のアドオンなどありますが、今回はAWSが提供しているAWS Management Consoleを利用しました。

2.ログインして、Instancesでインスタンスを選びます。32bit版だと強制的に契約がSmallなどになります。64bit版だと、強制的にえと、上のヤツになります。
初回にkey pairを作るので、プライベートキーをちゃんと取っておきましょう。

3.デフォルトのセキュリティーグループ設定では、SSHが無効なので、セキュリティーグループを作って割り当てます。起動後でも変更可能です。

4.起動したら、インスタンス一覧の該当のサーバを右クリックして、connectを選びます。

5.Puttyで設定するのですが、2で作ったキーはそのままでは使えないので、PuttyGenでPutty用に作りなおします。パスフレーズを設定して、忘れないようにしてください。

6.接続したら、パスフレーズを入れてログイン完了。
※このとき、Access denaideなどが出る場合は、多分OSイメージファイル(AMI)でrootのアクセスを禁止した状態で作れらた物だと思います。使えるように剃る方法がわからないので、別なAMIを選んでください。

7.まずは、rootのパスワードを変更します。
もし

#passwd root
Changing password for user root.
passwd: Authentication token manipulation error

が出たら、

#pwconv

してからもう一度やってみてください。
パスワードが/etc/shadowと/etc/passwdとで整合性が取れなくなるとでるようです。

8.ログインなどの制限
/etc/ssh/sshd_config
を以下のように設定します。パスワードを解析されたら、プライベートキーがなくてもログインされてしまうので、それらを禁止しましょう。

# SSH2のみ許可
#Protocol 2,1
Protocol 2

# ROOTログイン拒否
#PermitRootLogin yes
PermitRootLogin no

# 匿名ユーザ拒否
#PermitEmptyPasswords yes
PermitEmptyPasswords no

# パスワードログイン拒否
#PasswordAuthentication yes
PasswordAuthentication no

最後に反映します

/etc/rc.d/init.d/sshd restrt

固定IPからの接続のみなら、AWS Management Consoleでセキュリティーグループの設定でsource IPを設定しておきましょう。

参考
http://blog.goo.ne.jp/hirohito_japan/e/6917911cd09b3788054d3ee98d7c949b

9.ユーザの作成
useradd ユーザ名
その後、パスワードを変えておきましょう。

10.Apacheのダウンロード

# cd /usr/local/src
# wget http://ftp.kddilabs.jp/infosystems/apache/httpd/httpd-2.2.14.tar.gz

11.Apacheのインストール

# tar xzf httpd-2.2.14.tar.gz
# cd httpd-2.2.14
# ./configure --prefix=/usr/local/**** --enable-proxy=yes --enable-proxy-ajp=yes --enable-proxy-balancer=yes --enable-shared=yes --enable-rewrite=yes --enable-so=yes --enable-ssl=yes --enable-dav=yes
# make
# make install

※今回、GCC、make、opensslもなかったので、以下をインストールしました。

# yum install gcc
# yum install make
# yum install openssl-devel

http://centos.i-recording.net/apache_install.html

12.時間を日本時間にする
よく見たら、時間が米国のものに!
そらそうや。

で、ntp入れて合わせようとしたが、時間が変わらない。
調べてみたら、EC2の場合ntpであわせても反映されないそう。ってか、AWS側でそれぞれあわせてくれるそう。
日本時間にするには、インスタンスのOSのローカル時間を日本設定に変えるだけ。
サーバーのローカルタイムの設定ですが、設定は /etc/localtime ファイルで決まるので、/usr/share/zoneinfo/ 内の任意のファイルを /etc/localtime としてコピーしてやるか、リンクを作ればOK。OSの再起動は必要なく、ローカルタイムの表示が変わります。

13.SFTPでの接続確認
SSHを入れているので、デフォルトでSFTPが立ち上げっています。
切りたい場合は、/etc/ssh/sshd_configファイルの以下をコメントアウト

Subsystem sftp /usr/libexec/openssh/sftp-server

反映も忘れないように

/etc/rc.d/init.d/sshd restrt

次に、それぞれのユーザがアクセス出来るようにします。

# cp -Rf /root/.ssh /home/ユーザ
# chown -Rf ユーザ .ssh

これで公開キーがユーザに配布されました。

Filezillaを利用する場合、パスフレーズに対応していないので、PuttyGenでパスフレーズ無しで鍵をつくって読み込ませる必要があります。

14.Jdkのダウンロード、インストール
wgetで取れないので、ローカルでとってサーバにアップします。
http://java.sun.com/javase/ja/6/download.html
インストールは

# ./jdk-1.6.18.bin
# mv jdk-1.6.18 /usr/local/java/ 

15.Tomcatのダウンロード、インストール

# wget http://www.apache.org/dist/tomcat/tomcat-6/v6.0.24/bin/apache-tomcat-6.0.24.tar.gz
# tar zxvf apache-tomcat-6.0.24.tar.gz
# mv apache-tomcat-6.0.24 /usr/local/****

16.ApacheTomcatの連携
Apache2では、これまでの1系とちがって、mod_proxyによる連携が標準でサポートされています。
それらはビルトインモジュールなので、以下で確認しましょう。

# /usr/local/apache***/bin/httpd -l
Compiled in modules:
 core.c
 mod_authn_file.c
 mod_authn_default.c
 mod_authz_host.c
 mod_authz_groupfile.c
 mod_authz_user.c
 mod_authz_default.c
 mod_auth_basic.c
 mod_include.c
 mod_filter.c
 mod_log_config.c
 mod_env.c
 mod_setenvif.c
 mod_proxy.c
 mod_proxy_connect.c
 mod_proxy_ftp.c
 mod_proxy_http.c
 mod_proxy_ajp.c
 mod_proxy_balancer.c
 prefork.c
 http_core.c
 mod_mime.c

ここで、mod_proxyが入っていれば使える状態になっています。

httpd.confで、以下の設定を追加します。

<Location /nanika/>
    ProxyPass ajp://127.0.0.1:8009/nanika/
</Location>

http://ドメイン/nanika/

など、実際のURLにアクセスしてみましょう!

とりあえず、これで動作しました。

AntタスクでSFTPを使ってファイルをアップする Eclipse利用

外部サーバにSFTPでファイルをアップする必要があったので、調べました。
Eclipse3.5のGalireoを利用しています。

1.jschの入手
SSH接続でのファイル転送を実行するには、scpタスクを利用します。
そのためには、jsch.jarを以下からダウンロードして
${ECLIPSE_HOME}\plugins\org.apache.ant_1.7.1.v20090120-1145\lib
などの、antプラグインのlibフォルダにいててください。

http://sourceforge.jp/projects/sfnet_jsch/

※これで出来ると思ったけど、パスが通らないので、Antで利用出来るようにEclipseで以下の設定を行いました。Window→preference→Ant/Runtime のclasspathタブのGlobal Entriesを選択し、Add External Jarsで先程のjsch.jarを指定します。

追記:Eclipseの中に元々入っているものでもOKみたいです。${ECLIPSE_HOME}/plugins/com.jcraft.jsch_0.1.42.jarあたり。


2。Antタスクの作成
SCPタスクの主な属性は以下。

属性 詳細
file コピー対象ファイル。
例 user[:password]@host:/directory/path
コピー対象ファイルはこのfile属性か要素で指定します。
todir コピー先ディレクトリ。
例 user[:password]@host:/directory/path
必須項目です。
port リモートホストに接続するためのポート。
デフォルト22。
password file属性かtodir属性にパスワードを指定している場合は不要です。

記述すると

<target name="deploy-war" >
    <scp todir="${USERID}:${PASSWORD}@${HOST_TEST}:${TOMCAT_HOME}/webapps/" trust="true">
        <fileset refid="war_transfer" />
    </scp>
</target>

みたいな感じです。

追記:keyfileを使って認証する場合は、以下の作業が必要。

Eclipse
Window→Prefference
左側ののGeneral→Network Connections→SSH2
右側のKye ManagementタブでGenerate DSA Keyなどでキーセットを作成

公開キーは、サーバ上の.sshに追加
秘密キーは、build.xmlで以下のように設定

<target name="deploy-war" >
    <scp todir="${USERID}:${PASSWORD}@${HOST_TEST}:${TOMCAT_HOME}/webapps/" trust="true" keyfile="${KEYFILE}" passphrase="${PASSPHRASE}">
        <fileset refid="war_transfer" />
    </scp>
</target>