2011年3月31日木曜日

RDSでタイムゾーン(UTC)を変更

スズキです。
※コメントにもあるのですが、以下の方法は出来る場合とできない場合があるようです...
※RDSの"init_connect"パラメータでのtimezone変更はサポートされないとのことです...

下記の通り、デフォルトタイムゾーンを変更することはできません。
なので、"init_connect"に

SET time_zone = 'Asia/Tokyo';

を設定する作戦を試してみました。

まずは、いつもの"Amazon RDS Command Line Toolkit"での設定ですが、
"rds-modify-db-parameter-group"を試したところ、
クオートなり空白なりの問題で、設定することができませんでした...
(下記にも指摘されていました...)

ただ、クオートは空白はツールが対応していないだけの可能性もあるので、
"AWS SDK for PHP"でも試してみました。

コードはこんな感じです。

--------【PHP】--------

// ライブラリのインクルード
require_once("./sdk.class.php");

// RDSオブジェクトの生成
$rds = new AmazonRDS();


// リージョンの設定
$rds->set_region(AmazonRDS::REGION_APAC_NE1);

// パラメータの設定
$response = $rds->modify_db_parameter_group('suz-lab', array(
    array(
        "ParameterName"  => "init_connect",
        "ParameterValue" => "set time_zone = 'Asia/Tokyo';",
        "ApplyMethod"    => "immediate"
    ),
));

// レスポンスの確認 
var_dump($response);

--------

すると、こちらでは無事設定が成功し、
"AWS Management Console"でも確認できました。


これで、アプリケーション側に修正してもらわなくてもOKです。

よかった、よかった...
--------
http://www.suz-lab.com

2011年3月30日水曜日

"Find Big Mail"でGmailのサイズの大きなメールを見つける

スズキです。

普段、"Google Apps (suz-lab.com)"のGmailを利用しているのですが、
そろそろ容量がなくなってきてしまい、容量を増やそうと思ったら、
スタンダードでは増やす術が無く、仕方が無いので、下記の、
Find Big Mail、というサービスでサイズの大きなメールを見つけて削除することにしました。


残念ながら、"Google Apps"は下記のように有料となってしまいます。


TOPページからメールアドレスを登録して、クレジットカードで購入すると、
下記のように、サイズの大きなメールの検索が行われます。


サイズの大きなメールは下記のように自動で作成されるラベルに振り分けられるので、
必要に応じて削除すれば目的達成です。

FindBigMail > 2mb : サイズが2MB以上のメール
FindBigMail > 500kb : サイズが500kB以上のメール
FindBigMail > 100kb : サイズが100kB以上のメール

かなり容量に余裕ができたぞ...
--------
http://www.suz-lab.com

2011年3月29日火曜日

RDSに"skip-character-set-client-handshake"を設定

スズキです。

PHPでMySQLの文字化け対策に"my.cnf"に対して

skip-character-set-client-handshake

を指定することがよくあると思いますが、これをRDSで設定するときに、
かなりハマってしまいました…

結局、下記でうまくいったのですが…

# rds-modify-db-parameter-group suz-lab \
> -p "name=skip-character-set-client-handshake, value=TRUE, method=pending-reboot"

といっても、下記のサイトそのままです…
http://stackoverflow.com/questions/4611645/setting-init-connect-to-a-string-with-spaces-in-an-amazon-rds-parameter-group-usi

cloudpackを総動員してしまった…
--------
http://www.suz-lab.com

2011年3月28日月曜日

EC2で日本語Windows(2008R2)

スズキです。

東京リージョンなら、Windowsも日本語で利用したいと思います。

"AWS Management Console"でWindowsインスタンスを起動しようとしたら、
下記ウィザードで、該当AMIを簡単に見つけることができます。


しかし、このAMIで起動してログインすると、英語表記のデスクトップとなってます。
ただ、このAMIは、

AMI ID: ami-c01cb7c1
Name: Windows-2008R2-SP1-MultiLang-Base-v101

というものなので、後から設定で日本語表記のデスクトップに変更することができます。

やり方は、下記のWindowsメニューから"Control Panel"を選択し、



"Regional and Language Options"のアイコンをダブルクリックして、


"Keyboards and Languages"のタブの"Choose a display language"を"
日本語"にすれば、


一旦、ログオフしますが、その後ログインすると、
日本語表記のデスクトップになってます。


また、AMIには、

AMI ID: ami-b8e842b9
Name: Windows-2008R2-SP1-Base-Locale-JA-JP-v101

というものも用意されてます。

こちらでインスタンスを起動すれば、いきなり日本語のWindowsとなっています。
--------
http://www.suz-lab.com

2011年3月25日金曜日

リダイレクト専用サーバを公開してみた

スズキです。

こちら(http://blog.suz-lab.com/2011/03/varnishweb.html)で、
"http://suz-lab.com/test.html"のWebアクセスを
"http://www.suz-lab.com/test.html"にリダイレクトするWebサーバを構築したのですが、

これは、cloudpackでもS3だけのWebホスティングが増えてきており、
DNSの設定のみで簡単に"suz-lab.com"も利用(リダイレクト)できるように、
と思ってのものでした。

ただ現状、アクセス制御などはしていないので、
DNSの設定をすれば、誰でも利用できてしまいます。
でも、別に利用されても、さほど困らないと思いますので、
ならいっそ、公開しとくかって感じです。

ということで、DNSに設定すべきIPアドレスは、

175.41.246.154

となります。

このIPアドレスを"suz-lab.com"なり"iret.co.jp"なりのDNSのAレコードに設定すれば、
HTTPのアクセスは"www"が頭についたものにリダイレクトされるはずです。

cloudpackのサイトにも載せよう。
--------
http://www.suz-lab.com

Varnishでリダイレクト専用Webサーバの構築

スズキです。

S3でWebサイトのホスティングをしても、独自ドメインを利用しようとすると、
DNSのCNAME設定の関係上、"www.suz-lab.com"などのDNS名しか利用できず、
"suz-lab.com"が宙ぶらりんな形になってしまいます。

できれば、"suz-lab.com"は"www.suz-lab.com"にリダイレクトして欲しいので、
リダイレクト専用のWebサーバをVarnishを利用して作ってみました。
(後でcloudpackのサービスとして公開しようと思っています)

仕様は、任意のDNS名でアクセスすると、
その DNS名の頭に"www."を付けたURLにリダイレクト
って感じになっています。

例えば、
"suz-lab.com"でアクセス → "www.suz-lab.com"にリダイレクト

"iret.co.jp"でアクセス → "www.iret.co.jp"にリダイレクト
となります。

リダイレクトサーバの動きとしては、
http://suz-lab.com/test.html
でアクセスされたら、レスポンスコード301で、
Locationヘッダに、
http://www.suz-lab.com/test.html
を設定してレスポンスを返す用にしています。

それでは、実際の構築についてです。

まずは、下記のようにインストール(epel)です。

# yum -y install varnish
# chkconfig varnish on

このまま立ち上げると、Listenポートが6081番になってしまうので、
80番になるように"/etc/sysconfig/varnish"を下記のように編集します。

--------【varnish】--------
...
DAEMON_OPTS=" \
-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-u varnish -g varnish \
-s file,/var/lib/varnish/varnish_storage.bin,1G \
"
...
--------
※"-a 6081"を"-a 80"としています。

そして、下記のようにVarnishをスタートするし、

# /etc/init.d/varnish start
Starting varnish HTTP accelerator:                         [  OK  ]

対象サーバにアクセスすると、下記のようなページが表示されるはずです。


Varnishが立ち上がったら、上述した振る舞いになるように、
"/etc/varnish/default.vcl"を下記のように編集します。

--------【default.vcl】--------
backend default {
    .host = "127.0.0.1";
    .port = "80";
}

sub vcl_recv {
    return (error);
}

sub vcl_error {
    set obj.http.Location = "http://www." req.http.host req.url;
    set obj.status = 301;
    return (deliver);
}
--------

これでVarnishをリスタートすれば、上記のリダイレクト処理を行うようになります。

実際、"iret"のサイトは、"www.iret.co.jp"をS3でWebサイトとして
ホスティングしてますが、その、iret.co.jpはDNSの設定で
上記のリダイレクトサーバIPアドレスを設定して、
"www.iret.co.jp"にリダイレクトされるようにしています。

VCLの情報が少ないなー...
--------
http://www.suz-lab.com

2011年3月24日木曜日

SES-Postfixをメールリレーできるように

スズキです。

今回は、こちらで作成したSES-Postfixをメールリレーするように設定します。
http://blog.suz-lab.com/2011/03/ses-postfixaws.html

メールリレーには、リレー先とリレー元がありますが、
リレー先がSES-Postfix、リレー元がSESを利用したいメールサーバ
となります。

"/etc/postfix/main.cf"は下記のようになります。

--------【リレー先(SES-Postfix)】--------
...
# すべてのネットワークインターフェースから通信を許可
inet_interfaces = all
...
# AWSのインスタンスと自分から通信を許可
mynetworks = 10.0.0.0/8, 127.0.0.1/32
...
--------【リレー元(Postfix)】--------
...
# SES-Postfixにリレー
relayhost = [10.146.37.8]
...
--------

実際に、リレー元のサーバに対して、telnetでメール送信テストを行うと、
下記のように、メールが、

リレー元(Postfix) → リレー先(SES-Postfix) → SES

とリレーされてることがわかります。

--------【リレー元(Postfix)】--------
to=<suzuki@suz-lab.com>,
relay=10.146.37.8[10.146.37.8]:25,
delay=44,
delays=44/0/0.01/0.05,
dsn=2.0.0,
status=sent (250 2.0.0 Ok: queued as 007FFD806B)
--------【リレー先(SES-Postfix)】--------
to=<suzuki@suz-lab.com>,
relay=ses,
delay=1.9,
delays=0.02/0/0/1.9,
dsn=2.0.0,
status=sent (delivered via ses service)
--------

今度は、IAMでSESしか利用できないユーザー作って、
そのキーを使うようにしよう。
--------
http://www.suz-lab.com

EC2が反応なくなったときの復旧手順

スズキです。

以前、下記の「EC2の障害復旧パターン」を書きましたが、
http://blog.suz-lab.com/2011/01/ec2.html

今回は、もう少し細かい作業レベルです。
(近頃、こんな感じで復旧させています…)

(1) コンソールから対象EC2のEBSのスナップショットをとる。
--------
場合によっては、このスナップショットからAMIを作成して起動します。

(2) コンソールからEC2のAMIを作成する。
--------
下手にEC2をStopしたりするとStopまでに時間がかかり、
その間、コンソールでAMIも作成できなくなってしまうので、
先に作成しておきます。

★ この時にEC2がリブートされるので、
このリブートで復旧すれば、終了です。

(3) EC2をStop/Startする。
--------
ただし、Stopするまでに非常に時間がかかる場合があるので、
時間がかかっている場合は、どこかで諦めて

(2)で作成したAMIや、(1)のスナップショットから作成するAMIでの起動を試します。

★ すぐにStart出来て復旧してれば、終了です。

(4) (1)のスナップショットからAMIを作成する。
--------
作成方法は以下のような感じです。
http://blog.suz-lab.com/2011/03/ebsamiaws.html

ここまでできたら、
EC2がStop/Startされるのが早いか、
コンソールからで操作したAMIの作成(起動)が早いか、
スナップショットからのAMIの作成(起動)が早いか、
の話です。(結構、ケースバイケースです…)

スクリプト化できるなー…
--------
http://www.suz-lab.com

2011年3月23日水曜日

SES-Postfixの構築(AWS)

スズキです。

まずは、こちらよりSESの申し込みをしておきます。


少しすると、下記のようなメールが届き、利用出来るようになります。

--------
Dear Amazon SES customer:

We have received a request to authorize an email address for use
with Amazon SES.  To confirm that you are authorized
to use this email address, please go to the following URL:

https://email-verification.us-east-1.amazonaws.com/?XXXXXXXX

Your request will not be processed unless you confirm the address using this URL.

To learn more about sending email from Amazon SES,
please refer to the Amazon SES Developer Guide.

Sincerely, Amazon Web Services
--------

次に、「SESを使ってみた」で紹介したように、
"Amazon Simple Email Service Scripts"を利用出来るようにします。
(最新のスクリプトでは、こちらの日本語対策も反映されています)

今回は下記のようなディレクトリ構造でインストールしました。
(利用するには適当にCPANモジュールを入れる必要もあります)


"Amazon Simple Email Service Scripts"が利用出来るようになったら、
Postfixの設定です。

とりあえず、下記でインストール&自動起動まで行っておきます。

# yum -y install postfix
# chkconfig postfix on

そして下記のように、
"/etc/postfix/master.cf"と"/etc/postfix/master.cf"を修正し、
Postfixがメール送信をSESを用いて行うようにします。

--------【master.cf】--------
...
#
# Amazon SES
#
ses       unix  -       n       n       -       -       pipe
  flags=R user=nobody argv=/opt/aws/ses/bin/ses-send-email.pl -r -k /opt/aws/ses/etc/credential.conf -f ${sender}

--------

--------【main.cf】--------
...
#
# Amazon SES
#
default_transport = ses
--------

この状態でPostfixを下記のようにスタートすれば、

# /etc/init.d/postfix start

このPostfixで処理されたメールはSESで送信されるはずです。

実際にこちらで紹介したtelnetを利用した方法で送信確認してみましたが、
メールログに下記のようなエラーが出力されてしまいました。

--------【maillog】--------
...
Command died with status 2: "/opt/aws/ses/bin/ses-send-email.pl".
Command output: Can't locate SES.pm in @INC (@INC contains:
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl
/usr/lib/perl5/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/5.8.8
.) at /opt/aws/ses/bin/ses-send-email.pl line 27.
BEGIN failed--compilation aborted at /opt/aws/ses/bin/ses-send-email.pl line 27. 
...
--------

これは、Perlのライブラリディレクトリに"SES.pm"が無い!
って話なので、下記のようにシンボリックリンクを張っておきます。

# pwd
/usr/lib/perl5/site_perl
# ln -s /opt/aws/ses/bin/SES.pm SES.pm

再び同様のテストを行うと、今度は下記のようなエラーが発生しました。

--------【maillog】--------
...
Command died with status 1: "/opt/aws/ses/bin/ses-send-email.pl".
Command output: Missing required header 'Subject'.
...
--------

これは、メールヘッダに"Subject"が無い!
って話なので、テストするときに、下記のように"Subject"を書くようにしました。

--------【telnet localhost 25】--------
DATA
354 End data with .
Subject: test

test
.
--------

すると、今度は次のようなエラーに変わりました。

--------【maillog】--------
...
Command died with status 1: "/opt/aws/ses/bin/ses-send-email.pl".
Command output: User name is missing: 'undisclosed-recipients:;'.
...
--------

これは、"To"がおかしい!
って話なので、テストするときに、下記のように"To"もちゃんと書くようにしました。

--------【telnet localhost 25】--------
DATA
354 End data with .
Subject: test
To: suzuki@suz-lab.com

test
.
--------

するとようやく、ログも以下のようになり、
正しくメールを送信することができるようになりました。

--------【maillog】--------
...
to=,
relay=ses,
delay=441,
delays=439/0/0/1.3,
dsn=2.0.0,
status=sent (delivered via ses service)
...
--------

最後に、こちらから"Production Access"の申請を行い、
申請が通れば、任意のメールアドレスにメールを送信することが可能となります。

せっかくなので、次はリレーの設定まで行おうと思います。
--------
http://www.suz-lab.com

AWSクーポンを使ってみた

スズキです。

初クーポンということで...

まずはAWSのトップページにいき、下記のように"アカウント"タブの左下にある、
"支払い方法"をクリックします。


サインインしていない場合は、ここでサインインが必要になりますが、
その後、下記のように表示されるので、"AWSクレジットを引き換え/表示"を
クリックします。


すると、下記のようにクーポンコードを入力するフォームが現れるので、
取得したクーポンコードを入力します。


入力すると、下記のようにクーポンの内容が表示され、適応されたことになります。


AWS、良く出来てます。
--------
http://www.suz-lab.com

他のEBSもアタッチ済みのAMIを作成(AWS)

スズキです。

昔、「EC2の障害復旧パターン」ってのを書きましたが、
http://blog.suz-lab.com/2011/01/ec2.html

そこの"Stop/Start"してもだめだった場合を、まさに体験してしまいました...

突然EC2の反応がなくなり、リブートを試みるも、リブート後も反応が無いままです...
次に"Stop/Start"ですが、Stoppingでずっととまってしまい、
Startできる気配がまったくありません...

仕方ないのでEBSのスナップショットを取得して、
そこからAMIを作成しての復旧を試みます。

スナップショットからAMIを作成する方法は、すでに下記で紹介済みですが、
http://blog.suz-lab.com/2011/03/ebs-aws-management-console-ebs-amazon.html

今回はEBSを追加でアタッチしていたので、
そのEBSがアタッチ済みのインスタンスが起動するようなAMIを作成しなければいけません。

ということで、今回のAMI作成コマンドはこんな感じになりました。
(Windowsのコマンドプロンプトでの実行です)

> ec2reg ^
? -K pk.pem ^
? -C cert.pem ^
? --region us-west-1 ^
? -s snap-xxxxxxxx ^
? -b "/dev/sdb1=snap-yyyyyyyy:100:false" ^
? -a x86_64 ^
? -n suz-lab-ami-0.0.0

ポイントは、

-b "/dev/sdb1=snap-yyyyyyyy:100:false"

です。

"/dev/sdb1"にsnap-yyyyyyyy(スナップショット)から作成した100GのEBSをアタッチして、
インスタンスを起動しなさい。インスタンスをターミネートしても、
そのEBSは削除しない(false)ように、といった意味合いです。

とりあえず、15分くらいで復旧完了...
--------
http://www.suz-lab.com

2011年3月22日火曜日

treeコマンドでファイル一覧をツリー形式で表示

スズキです。

treeコマンドを使うと、ディレクトリ以下の内容を、
ツリー上に直感的に確認することができます。

とりあえず、yumで簡単にインストールできます。

# yum -y install tree

出力結果はこんな感じです。


ファイル一覧を作るときは、これからこの出力を使おう。
--------
http://www.suz-lab.com

S3でWebsiteホスティング(AWS)

スズキです。

「東京リージョン」と「S3のWebsite機能」で、
静的なコンテンツのみなら、S3で公開できるようになったので、
実際に、"www.iret.co.jp"をS3のWebsite機能を利用して公開しました。
("AWS Management Console"を利用しています)

まずは東京リージョンに、独自ドメイン(www.iret.co.jp)と同じバケットを作成します。


そして、バケットのプロパティの「Website」タブで、
下記のようにWebsite機能を有効にして、
インデックスページとエラーページを指定します。


インデックスページを指定(index.html)すると、"/"で終わるようなURLは、
インデックスページ(index.html)が表示されるようになります。

エラーページ(error.html)を指定すると、ドキュメントが無い(404)ような場合でも、
指定されたエラーページ(error.html)が表示されるようになります。

上記のバケットに適当にコンテンツをアップロードすれば、
(パーミッションは誰もがファイルを読めるようにしておく必要がありますが)
http://www.iret.co.jp.s3-website-ap-northeast-1.amazonaws.com/
でコンテンツを確認することができます。

最後にDNSに"www.iret.co.jp"のCNAMEとして、
"www.iret.co.jp.s3-website-ap-northeast-1.amazonaws.com"
を設定すれば、"http://www.iret.co.jp"でS3のWebsiteにアクセスできます。

"iret.co.jp"の"www.iret.co.jp"へのリダイレクトとアクセスログ解析を用意すれば、
かなり使い勝手がよくなるはず...
--------
http://www.suz-lab.com

2011年3月15日火曜日

EC2インスタンスをリブート/停止しないでAMIを作成する(AWS)

スズキです。

EBSからブートしているインスタンスが前提です。

とりあえず、"AWS Management Console"で該当インスタンスの
EBSのスナップショットを取得しておきます。
(スナップショットはインスタンス起動中に取得できます)

そして、"Amazon EC2 API Tools"で下記のように実行すれば、
該当スナップショットのAMIが作成されます。

※"Amazon EC2 API Tools"は下記でも紹介しています。
http://blog.suz-lab.com/2009/04/centos53ami_20.html
http://blog.suz-lab.com/2010/01/macec2-api-tools.html

$ ec2reg \
> -K pk.pem \ // キー
> -C cert.pem \ // 証明書
> --region ap-northeast-1 \ // リージョン(東京)
> -s snap-00000000 \ // スナップショットID
> -a x86_64 \ // アーキテクチャ(64bit)
> -n web-slave-0.0.1 // AMI名

※キーと証明書は、AWSのページから、
上部のタブ"アカウント" → "セキュリティ証明書" → "ログイン"
"アクセス証明書"の"X.509 証明書"のタブから取得できます。


ちょっと、落ち着いてきたかも...
--------
http://www.suz-lab.com

S3操作用IAMアカウントのポリシー(AWS)

スズキです。

開発パートナーさんやプログラム(API/SDK)で、S3(CloudFront)に
ファイルのアップロードなどの操作を行うことが多々あると思いますが、
AWSをフルコントロールできるキーを使う(渡す)のはセキュリティ上よくないので
ってことで、S3の決まったバケットのみ操作できる
IAMアカウントのポリシーを作ってみました。

※IAMに関しては、以下にいろいろ書いています。
▼ "IAM Command Line Toolkit"を使ってELBで利用したSSL証明書の確認
http://blog.suz-lab.com/2011/01/iam-command-line-toolkitielbssl.html
▼ IAMでユーザを作成し"AWS Management Console"でS3を利用
http://blog.suz-lab.com/2011/03/iamaws-management-consoles3.html
▼ "AWS Management Console (S3)"を制限付きで利用
http://blog.suz-lab.com/2011/03/aws-management-console-s3.html
▼ IAMでアカウントを作成するときの流れ
http://blog.suz-lab.com/2011/03/iamaws.html

対象バケットをsuz-lab、対象グループもsuz-labとすると、
下記のコマンドで上記のポリシーが作成できます。

▼ バケット一覧の表示
$ iam-groupaddpolicy --aws-credential-file credentials.txt \
> -g suz-lab \
> -p policy01 \
> -a s3:ListAllMyBuckets \
> -e Allow \
> -r arn:aws:s3:::*

▼ バケットの中身を表示
$ iam-groupaddpolicy --aws-credential-file credentials.txt \
> -g suz-lab \
> -p policy02 \
> -a s3:ListBucket \
> -e Allow \
> -r arn:aws:s3:::suz-lab
$ iam-groupaddpolicy --aws-credential-file credentials.txt \
> -g suz-lab \
> -p policy03 \
> -a s3:GetBucketLocation \
> -e Allow \
> -r arn:aws:s3:::suz-lab

▼ ファイルの取得
$ iam-groupaddpolicy --aws-credential-file credentials.txt \
> -g suz-lab \
> -p policy04 \
> -a s3:GetObject \
> -e Allow \
> -r arn:aws:s3:::suz-lab/*

▼ ファイル/フォルダの削除
$ iam-groupaddpolicy --aws-credential-file credentials.txt \
> -g suz-lab \
> -p policy05 \
> -a s3:DeleteObject \
> -e Allow \
> -r arn:aws:s3:::suz-lab/*

▼ ファイルのアップロード/フォルダの作成
$ iam-groupaddpolicy --aws-credential-file credentials.txt \
> -g suz-lab \
> -p policy06 \
> -a s3:PutObject \
> -e Allow \
> -r arn:aws:s3:::suz-lab/*

▼ パーミッションの取得
$ iam-groupaddpolicy --aws-credential-file credentials.txt \
> -g suz-lab \
> -p policy07 \
> -a s3:GetObjectAcl \
> -e Allow \
> -r arn:aws:s3:::suz-lab/*

▼ パーミッションの設定
$ iam-groupaddpolicy --aws-credential-file credentials.txt \
> -g suz-lab \
> -p policy08 \
> -a s3:PutObjectAcl \
> -e Allow \
> -r arn:aws:s3:::suz-lab/*

他にもいろいろとアクションはありますが、こんな感じで問題ないと思います。


詳しくはこちらの"AWS Policy Generator"で
http://awspolicygen.s3.amazonaws.com/policygen.html

これからは、API利用するときも専用の制限付きユーザ作って、そのキーで使おう。
--------
http://www.suz-lab.com

2011年3月14日月曜日

IAMでアカウントを作成するときの流れ(AWS)

スズキです。

開発パートナーさんなどが、AWSを制限付きで使えるように、
と、下記のようにいろいろ実験していたのですが、

▼ "IAM Command Line Toolkit"を使ってELBで利用したSSL証明書の確認
http://blog.suz-lab.com/2011/01/iam-command-line-toolkitielbssl.html

▼ IAMでユーザを作成し"AWS Management Console"でS3を利用
http://blog.suz-lab.com/2011/03/iamaws-management-consoles3.html

▼ "AWS Management Console (S3)"を制限付きで利用
http://blog.suz-lab.com/2011/03/aws-management-console-s3.html

最終的に下記の流れ(手順)かなー、といった感じです。

(1) ユーザーの作成

$ iam-usercreate --aws-credential-file credentials.txt \
> -u suzuki

(2) パスワードの設定

$ iam-useraddloginprofile --aws-credential-file credentials.txt \
> -u suzuki \
> -p password

ここまでで、下記のような"AWS Management Console"にログインできます。

https://000000000000.signin.aws.amazon.com/console/s3
(000000000000はアカウント番号)

(3) ACCESS KEY/SECRET KEYの発行

$ iam/bin/iam-useraddkey --aws-credential-file credentials.txt \
> -u suzuki
--------
AAAAAAAAAAAAAAAAAAAA // ACCESS KEY
ssssssssssssssssssssssssssssssssssssssss // SECRET KEY

※ ユーザーを指定しないと、親ユーザーのものが発行されます。

上記のキーで、APIや下記のようなツールが利用出来ます。

▼ S3Fox Organizer
http://www.s3fox.net/

▼ CLOUDBERRY S3 EXPLORER
http://cloudberrylab.com/?page=cloudberry-explorer-amazon-s3

... (他にもいろいろあります)

(4) グループの作成

$ iam-groupcreate --aws-credential-file credentials.txt \
> -g suz-lab

(5) グループとユーザーの関連付け

$ iam-groupadduser --aws-credential-file credentials.txt \
> -g suz-lab \
> -u suzuki

(6) グループにポリシーの設定

$ iam-groupaddpolicy --aws-credential-file credentials.txt \
-g suz-lab \
-p policy01 \
-a s3:ListAllMyBuckets \
-e Allow \
-r arn:aws:s3:::*

... (必要なポリシーを設定していきます)

あとは、ポリシーとの戦いです…
--------
http://www.suz-lab.com

2011年3月11日金曜日

"AWS Management Console (S3)"を制限付きで利用

スズキです。

こちらでも紹介しましたが、IAMで作成したユーザーは、
最初ポリシーが何も定義されてないので、
"AWS Management Console (S3)"にログインしても、
以下のように、何も表示されません。


まず、バケット一覧を表示するには、下記コマンドで、
"s3:ListAllMyBuckets"アクションを"arn:aws:s3:::*"に許可します。

$ ./iam-useraddpolicy --aws-credential-file credentials.txt ¥
> -u suzuki ¥
> -p policy01 ¥
> -a s3:ListAllMyBuckets ¥
> -e Allow ¥
> -r arn:aws:s3:::*

これで、以下のようにバケット一覧が表示されます。


ただし、この状態では、以下のようにバケットの中身を閲覧することはできません。


バケットの中身も閲覧できるようにするには下記コマンドで、
"s3:ListBucket"アクションと"s3:GetBucketLocation"アクションを、
特定バケット(s3:::us-east-1.emr.suz-lab.com)に許可する必要があります。

※すべてのバケットを閲覧するには、リソースを"arn:aws:s3:::*"とすればOKです。


$ ./iam-useraddpolicy --aws-credential-file credentials.txt ¥
> -u suzuki ¥
> -a s3:ListBucket ¥
> -e Allow -p test11 ¥
> -r arn:aws:s3:::us-east-1.emr.suz-lab.com

$ ./iam-useraddpolicy --aws-credential-file credentials.txt ¥
> -u suzuki ¥
> -p test12 ¥
> -a s3:GetBucketLocation ¥
> -e Allow ¥
> -r arn:aws:s3:::us-east-1.emr.suz-lab.com

これで、以下のようにバケットの中身を閲覧することができるようになりました。
(上記コマンドでは他のバケットは閲覧できないままです)


バケット内のディレクトリも閲覧できます。


ただし、この状態だとファイルのダウンロードができません。
特定ディレクトリ(output)のファイルのみダウンロードしたい場合は、
下記のコマンドで、"s3:GetObject"を特定ディレクトリ内のファイル
(arn:aws:s3:::us-east-1.emr.suz-lab.com/output/*)に許可する必要があります。

$ ./iam-useraddpolicy --aws-credential-file credentials.txt ¥
> -u suzuki ¥
> -p test21 ¥
> -a s3:GetObject ¥
> -e Allow ¥
> -r arn:aws:s3:::us-east-1.emr.suz-lab.com/output/*

これで"AWS Management Console (S3)"で、
閲覧は"us-east-1.emr.suz-lab.com/"のみ、
ダウンロードは"us-east-1.emr.suz-lab.com/output/"のみ可能なように
設定することができました。

他の操作も同様の設定すれば大丈夫でしょう。
--------
http://www.suz-lab.com

IAMでユーザを作成し"AWS Management Console"でS3を利用

スズキです。

IAMで作成したユーザーで"AWS Management Console"にログインする方法は、
こちらのT_TANAKAさんのブログで詳しく説明されてますが、
IAMを扱うツールがPHPだったので、以前紹介した"IAM Command Line Toolkit"
を利用した方法を試してみました。

IAMの導入に関しては、Windows環境ですが、こちらで紹介しています。
今回はMac環境での実行ですが、"JAVA_HOME"と"AWS_IAM_HOME"の設定も含め
やり方はほとんど同じはずです。

まずは、ユーザー(suzuki)の作成です。

$ ./iam-usercreate --aws-credential-file credentials.txt ¥
> -u suzuki

次に、パスワードの設定です。

$ ./iam-useraddloginprofile --aws-credential-file credentials.txt ¥
> -u suzuki ¥
> -p xxxxxxxx

この状態で、下記URLにアクセスするとIAMユーザー用のログイン画面が表示されます。
(000000000000はAWSのアカウント番号です)
https://000000000000.signin.aws.amazon.com/console/s3


ログインすると下記のようにS3のコンソールが表示されますが、
ポリシーが設定されていないので、何も出来ない状態です。


ということで、S3は利用出来るように設定してみます。

ポリシーの設定は、下記コマンドで可能です。

$ ./iam-useraddpolicy --aws-credential-file credentials.txt ¥
> -u suzuki ¥
> -p test001 ¥
> -a s3:* ¥
> -e Allow ¥
> -r arn:aws:s3:::*

上記はS3に対するすべてのアクションを、
S3のすべてのリソースに対して許可しています。
("AWS Policy Generator"を利用すると、このあたりも簡単に作成できます)

この状態で、再度S3のコンソールを確認すると、
下記のように、いつもの利用出来る状態が確認できます。


次は、S3のバケットやフォルダ単位でのアクセスコントロールを試してみます。
--------
http://www.suz-lab.com

"Elastic MapReduce"を使ってみた(AWS)

スズキです。

こちらでMapReduceのアルゴリズムをおさえ、
こちらでMapperとReducerをPHPで実装し、
最後は、AWSの"Elastic MapReduce"を使って実行です。

まず、S3にインプットファイル(input.txt)とMapper(mapper.php)と
Reducer(reducer.php)をアップロードしておきます。
("AWS Management Console"を利用しています)


次に"AWS Management Console"の"Elastic MapReduce"タブを選択し、
上部の"Create New Job Flow"ボタンで"Job Flow"の登録を行います。

名前は適当につけますが、"Job Flow"のタイプはMapperとReducerに
PHPを利用するので、"Streaming"を選択します。



そして、S3上のInputファイル、Mapperファイル、Reducerファイル、
結果の出力ディレクトリを指定します。


その後、起動するインスタンス数やインスタンスタイプを決定します。


実行開始時に何かしらの処理を実行することができますが、
今回は何も実行しません。


確認して問題なければ、"Job Flow"が作成され、そのまますぐに実行されます。



"AWS Management Console"で状況を確認することもできます。


起動や終了に、そこそこ時間がかかりますが、処理が終わると
S3上の結果出力ディレクトリに下記のように結果ファイルが作成されています。


実際に出力されたファイルは下記のようになっており、

--------【part-00000】--------
2,54055
5,35687
8,23224
M,1  
P,10200
S,1  
V,5100
b,2552
e,73968
h,12751
n,40804
t,124957      
w,22950
--------【part-00001】--------
0,141210        
3,41938 
6,37430 
9,15423 
H,10201 
K,10200 
N,10201 
T,20401 
c,25503 
i,38251 
l,17853 
o,30604 
r,25503 
u,51001 
x,15300 
--------【part-00002】--------
1,142008        
4,33894 
7,25650 
C,1     
I,2550  
L,2     
O,20400 
R,1     
U,1     
a,35710 
d,22954 
g,22951 
m,20404 
p,43355 
s,53562 
v,12750 
y,2553  
--------

想定された結果になっていることがわかります。

次は、"Elastic MapReduce"でMahoutをやってみよう。
--------
http://www.suz-lab.com

MapperとReducerをPHPで実装

スズキです。

こちらでアルゴリズムをおさらいしたMapReduceですが、
http://blog.suz-lab.com/2011/03/mapreducestreaming.html
今度は、MapperとReducerをPHPで実装して、実際に実行してみます。

インプットファイルは同じものを利用します。

--------【input.txt】--------
suzuki
sato
tanaka
kobayashi
takahashi
--------

そして、Mapperは下記のように実装しました。

--------【mapper.php】--------
#!/usr/bin/php
<?php
while(!feof(STDIN)) {
  $line = trim(fgets(STDIN));
  $chars = str_split($line);
  foreach($chars as $char) {
    if(preg_match("/[0-9A-Za-z]/", $char)) {
      print($char . "," . "1\n");
    }
  }
}
?>
--------

Mapperを実行すると、下記のようになります。

$ cat input.txt | ./mapper.php
--------
s,1
u,1
z,1
u,1
k,1
i,1
s,1
a,1
t,1
o,1
t,1
a,1
n,1
a,1
k,1
a,1
k,1
o,1
b,1
a,1
y,1
a,1
s,1
h,1
i,1
t,1
a,1
k,1
a,1
h,1
a,1
s,1
h,1
i,1
--------

今回の実装や実行方法ではあまり関係ないのですが、
下記のように、Mapperの結果のソートもしておきます。

$ cat input.txt | ./mapper.php | sort
--------
a,1
a,1
a,1
a,1
a,1
a,1
a,1
a,1
a,1
b,1
h,1
h,1
h,1
i,1
i,1
i,1
k,1
k,1
k,1
k,1
n,1
o,1
o,1
s,1
s,1
s,1
s,1
t,1
t,1
t,1
u,1
u,1
y,1
z,1
--------

この結果に対するReducerは以下のように実装しています。

--------【reducer.php】--------
#!/usr/bin/php
<?php
while(!feof(STDIN)) {
  $line = trim(fgets(STDIN));
  $data = split(",", $line);
  if(preg_match("/[0-9A-Za-z]/", $data[0])) {
    $results[$data[0]] += $data[1];
  }
}
foreach($results as $key => $val) {
  print($key . "," . $val . "\n");
}
?>
--------

実際にReducerまで実行すると以下のようになり、
想定通りの結果となりました。

$ cat name.txt | ./mapper.php | sort | ./reducer.php
--------
a,9
b,1
h,3
i,3
k,4
n,1
o,2
s,4
t,3
u,2
y,1
z,1
--------

次はAWSの"Elastic MapReduce"で実行してみよう。
--------
http://www.suz-lab.com

MapReduceのアルゴリズム(Streaming)

スズキです。

お約束の文字カウントです。
目的は、下記入力ファイルに出てくる英数字のカウントを取ります。

--------【input】--------
suzuki
sato
tanaka
kobayashi
takahashi
--------

結果は下記となるはずです。

--------【output】--------
a,9
b,1
h,3
i,3
k,4
n,1
o,2
s,4
t,3
u,2
y,1
z,1
--------

まずインプットファイルが実行されるMapプログラムの数だけ分割されます。

--------【input (Map1)】--------
suzuki
sato
tanaka
--------

--------【input (Map2)】--------
kobayashi
takahashi
--------

ここでのMapの処理は下記のように、文字列を文字ごとに分割して出力するものとします。

--------【input (for Map1)】--------
suzuki
sato
tanaka
--------

--------【output (for Map1)】--------
s,1
u,1
z,1
u,1
k,1
i,1
s,1
a,1
t,1
o,1
t,1
a,1
n,1
a,1
k,1
a,1
--------

--------【input (Map2)】--------
kobayashi
takahashi
--------

--------【output (Map2)】--------
k,1
o,1
b,1
a,1
y,1
a,1
s,1
h,1
i,1
t,1
a,1
k,1
a,1
h,1
a,1
s,1
h,1
i,1
--------

そして、Mapの結果がマージされてソートもされます。

--------【マージ & ソート】--------
a,1
a,1
a,1
a,1
a,1
a,1
a,1
a,1
a,1
b,1
h,1
h,1
h,1
i,1
i,1
i,1
k,1
k,1
k,1
k,1
n,1
o,1
o,1
s,1
s,1
s,1
s,1
t,1
t,1
t,1
u,1
u,1
y,1
z,1
--------

その後、Reduce用のインプットとして、同じ内容のものが同一インプットとなるように
実行するReduceプログラムの数だけ分割されます。

--------【input (Reduce1)】--------
a,1
a,1
a,1
a,1
a,1
a,1
a,1
a,1
a,1
b,1
h,1
h,1
h,1
i,1
i,1
i,1
--------

--------【input (Reduce2)】--------
k,1
k,1
k,1
k,1
n,1
o,1
o,1
s,1
s,1
s,1
s,1
t,1
t,1
t,1
u,1
u,1
y,1
z,1
--------

ここでのReduceの処理は下記のように、文字ごとに出現回数を集計します。

--------【input (Reduce1)】--------
a,1
a,1
a,1
a,1
a,1
a,1
a,1
a,1
a,1
b,1
h,1
h,1
h,1
i,1
i,1
i,1
--------

--------【output (Reduce2)】--------
a,9
b,1
h,3
i,3
--------

--------【input (Reduce2)】--------
k,1
k,1
k,1
k,1
n,1
o,1
o,1
s,1
s,1
s,1
s,1
t,1
t,1
t,1
u,1
u,1
y,1
z,1
--------

--------【input (Reduce2)】--------
k,4
n,1
o,2
s,4
t,3
u,2
y,1
z,1
--------

最後に各Reduceの結果をマージすると目的の結果になります。

--------【output】--------
a,9
b,1
h,3
i,3
k,4
n,1
o,2
s,4
t,3
u,2
y,1
z,1
--------

次は、MapperとReducerをPHPで実装しよう。
--------
http://www.suz-lab.com

セミナー(with AWS) & 講座(with デジハリ)

スズキです。

来週cloudpackとして、下記イベントに参加します。
それも、提供側としてです。

▼2011/03/15 AWS x cloudpack 共同開催セミナー
http://cloudpack.jp/event/seminar20110315.html

▼2011/03/19 Amazonクラウド活用術
http://cloudpack.jp/event/lecture20110319.html

セミナーはAmazonさんとの共同開催なので、
Amazonさんからのお話も聞くことができます。

講座に関しては、私が講師として、
実際に一緒にコンソールなどを操作しながら、
AWSのお話をさせていただきます。

AWSも東京に来ましたし、このタイミングでAWSを
「知りたい、使いたい」
と思っている方は、是非、参加していただけると幸いです。
--------
htttp://www.suz-lab.com/

2011年3月9日水曜日

RDSの"character_set_*"を"utf8"に(AWS)

スズキです。

ます、"AWS Management Console"で下記のように

"DB Parameter Group"を作成しておきます。


デフォルトの状態は下記となり、"character_set_*"は設定されていません。


パラメータの指定は"AWS Management Console"ではできないので、
こちらのツールをダウンロードして行います。

"DB Parameter Group"の確認は下記コマンドで行います。
(Windows環境で実施)

> rds-describe-db-parameter-groups ^
? -I IIIIIIII ^
? -S SSSSSSSS ^
? --region ap-northeast-1
--------
DBPARAMETERGROUP suz-lab mysql5.5 for suz-lab

パラメータの指定は下記コマンドで行います。
(Windows環境で実施)

> rds-modify-db-parameter-group suz-lab ^
? -I IIIIIIII ^
? -S SSSSSSSS ^
? --region ap-northeast-1 ^
? --parameters "name=character_set_client, value=utf8, method=immediate"

何故か、複数パラメータを指定したら最後のパラメータしか反映されなかったので、
下記を一つずつ指定しました。

character_set_client
character_set_connection
character_set_database
character_set_filesystem
character_set_results
character_set_server

そして再度、"AWS Management Console"で確認すると、
"character_set_*"が以下のように"utf8"になっていることが確認できます。


そして、この"DB Parameter Group"(suz-lab)を既存のRDSインスタンスに
下記のように割り当てます。
(念のため"Apply Immediately"にもチェックしておきます)


さらにRDSのリブートも行い、適当なサーバからRDSに入って
下記コマンドを実行すると、utf8に設定されていることが確認できます。

> show variables like "character_set_%";
character_set_client | utf8 |
character_set_connection | utf8 |
character_set_database | utf8 |
character_set_filesystem | utf8 |
character_set_results | utf8 |
character_set_server | utf8 |
character_set_system | utf8 |

ただし、mysqlコマンドを実行したサーバの"my.cnf"は、
下記のようになっています。

--------【my.cnf】--------
...
[mysql]
default-character-set=utf8
--------

IAMもやらないと…
--------

2011年3月7日月曜日

VPCと親和性が高い(!?)ルーター(AWS)

スズキです。

"Amazon Management Console"の設定ファイルダウンロードで、
選択できるものです。

Vendor: Cisco Systems, Inc
Platform: ISR Series Routers
Software: IOS 12.4+
該当製品: 800 1800 1900 2800 2900 3800 3900

Vendor: Juniper Networks, Inc.
Platform: J-Series Routers
Software: JunOS 9.5+
該当製品: Jシリーズ

Vendor: Juniper Networks, Inc.
Platform: SSG and ISG Series Routers
Software: ScreenOS 6.1, 6.2+
該当製品: SSGシリーズ ISGシリーズ

というわけで、実験用に上記で一番安そうな、
を購入しました。


東京リージョンに伴い、VPCのニーズも増えるだろうなー...
--------
http://www.suz-lab.com

2011年3月2日水曜日

Windows(Server 2008)でロードアベレージ的な情報の取得

スズキです。

下記コマンドで取得できます。

C:\Users\Administrator>typeperf "\System\Processor Queue Length"

"(PDH-CSV 4.0)","\\IP-0A832BE2\System\Processor Queue Length"
"03/02/2011 12:46:16.553","1.000000"
"03/02/2011 12:46:17.567","0.000000"
"03/02/2011 12:46:18.581","0.000000"
"03/02/2011 12:46:19.595","0.000000"
"03/02/2011 12:46:20.609","0.000000"
"03/02/2011 12:46:21.623","0.000000"
"03/02/2011 12:46:22.637","0.000000"
"03/02/2011 12:46:23.651","0.000000"
"03/02/2011 12:46:24.665","0.000000"
"03/02/2011 12:46:25.679","0.000000"
"03/02/2011 12:46:26.693","0.000000"
"03/02/2011 12:46:27.707","0.000000"
"03/02/2011 12:46:28.721","0.000000"

The command completed successfully.

Linuxのようにはいかないなー…
--------
http://www.suz-lab.com

2011年3月1日火曜日

"sar"でシステムのリソース状況を確認

スズキです。

インストールはこんな感じです。
# yum -y install sysstat

各リソース状況は以下のように確認できます。

▼ CPUの使用状況
# sar -u 1 5

▼ メモリ(スワップ)の使用状況
# sar -r 1 5

▼ ロードアベレージ
# sar -q 1 5

▼ ディスクI/Oの使用状況
# sar -b 1 5

▼ プロセス生成数
# sar -c 1 5

※ 1秒毎に5回情報を取得しています。

オプションの詳細は、こちらで確認できます。
http://linux.die.net/man/1/sar
--------
http://www.suz-lab.com

EC2(Windows)でソフトウェアVPN(失敗編)

スズキです。

"Windows Server 2008"には、「リモートアクセスサービス」
というものがあり、これを用いることで、
PPTPやL2TP/IPSecを利用したVPNサーバを構築することができます。
(こちらにL2TP/IPSecに関して詳しく書かれています)
http://jehupc.exblog.jp/10537558/

まず最初にPPTPですが、これはAWS環境ではできないようです。

下記フォーラムで詳しく議論されてますが、
GREパケットが制限されているのが原因のようです。
https://forums.aws.amazon.com/message.jspa?messageID=106699
(できないことに気づくまでにかなりの時間を使ってしまった…)

そして、L2TP/IPSecですが、上記のフォーラムを見る限り可能なようです。
(こちらの動作確認はちゃんとやってないのですが…)

構築手順は冒頭で紹介したブログに書かれています。

構築したら、フォーラムで書いてあるように、
下記のポートをセキュリティグループで許可すればOKのようです。

UDP 500
UDP 4500
UDP 1701

ただし、上記ブログの最後の部分になるのですが、
接続するWindowsクライアント(XP/Vista)はレジストリを修正必要があるようです。

どうせクライアント(Windows)にも手をいれないといけないのなら、
OpenVPNでいいかなー、ってことでOpenVPNを実験することにします。

VPNはいろいろと難しいなー...
--------
http://www.suz-lab.com