2011年6月30日木曜日

"SUZ-LAB AMI"(CentOS 5.6)に"Oracle Client"をインストール

スズキです。

下記で準備ができたので、
"SUZ-LAB AMI"(CentOS 5.6)に"Oracle Client"をインストールする下準備
ようやく、実際のインストールです。

まずは、インストール用のユーザーとディレクトリを作成します。

# # "linux_11gR2_client.zip"解凍のため
# yum -y install unzip

# # "Oracle Client"インストール用
# adduser oracle

# # ORACLE_BASEを作成
# mkdir /opt/oracle
# chown oracle.oracle /opt/oracle

# # oracleユーザーで"/opt/oracle/src"に移動
# su - oracle
$ mkdir /opt/oracle/src
$ cd /opt/oracle/src

次に、作成したディレクトリ(/opt/oracle/src)に、コチラから
Oracle Database 11g Release 2 Client (11.2.0.1.0) for Linux x86
をダウンロードし、レスポンスファイルを調整します。

$ # "linux_11gR2_client.zip"を解凍
$ ls
linux_11gR2_client.zip
$ unzip linux_11gR2_client.zip

$ # レスポンスファイルの調整
$ cd client/response
$ vi client_install.rsp
...
ORACLE_HOSTNAME=localhost.localdomain
UNIX_GROUP_NAME=oracle
INVENTORY_LOCATION=/home/oracle/inventory
SELECTED_LANGUAGES=ja,en
ORACLE_HOME=/opt/oracle/product/11.2
ORACLE_BASE=/opt/oracle
oracle.install.client.installType=Administrator
...

上記のレスポンスファイルでインストールです。
(プロンプトはすぐに返ってきてバックグラウンドでインストールされるので注意です)

$ # レスポンスファイルでのインストール
$ cd /opt/oracle/src/client
$ ./runInstaller -silent -responseFile /opt/oracle/src/client/response/client_install.rsp 
Oracle Universal Installerを起動中です...

一時領域の確認中: 80MBを超えている必要があります.   実際 5131MB    問題なし
スワップ領域の確認中: 150MBを超えている必要があります.   実際 2047MB    問題なし
Oracle Universal Installerの起動を準備中 /tmp/OraInstall2011-06-29_10-09-16PM. お待ちください...

このインストール・セッションのログは次の場所にあります:
/home/oracle/inventory/logs/installActions2011-06-29_10-09-16PM.log

次の構成スクリプトは、rootユーザーとして実行する必要があります。
#!/bin/sh 
#実行するrootスクリプト

/home/oracle/inventory/orainstRoot.sh
/opt/oracle/product/11.2/root.sh
構成スクリプトを実行するには、次のようにします:
1. ターミナル・ウィンドウを開きます
2. rootとしてログインします
3. スクリプトを実行します
4. このウィンドウに戻り、[Enter]キーを押して続行します

Successfully Setup Software.

最後に"root"で、上記メッセージにあるようなコマンドを実行すれば完了です。

$ # "root"での処理
$ exit
# /home/oracle/inventory/orainstRoot.sh
権限を変更中 /home/oracle/inventory.
グループの読取り/書込み権限を追加中。
全ユーザーの読取り/書込み/実行権限を削除中。

グループ名の変更 /home/oracle/inventory 宛先 oracle.
スクリプトの実行が完了しました。
# /opt/oracle/product/11.2/root.sh
Check /opt/oracle/product/11.2/install/root_ip-10-146-157-117_2011-06-29_22-19-28.log for the output of root script

ようやく、"Oracle RDS"のエクスポートができる...
--------
http://www.suz-lab.com

2011年6月29日水曜日

"SUZ-LAB AMI"(CentOS 5.6)に"Oracle Client"をインストールする下準備

スズキです。

コチラの"Instant Client"では、"Oracle RDS"の論理バックアップ取得で
利用しようとしていた、"exp/imp"コマンドがありません。

なので、コチラの"Oracle Database 11g Release 2 Client"(11.2.0.1.0)を、
"SUZ-LAB謹製 CentOS AMI"(5.6.2)にインストールしてみました。

と言いたいのですが、インストール中に警告がでまくってしまったので、
今回は、その警告がでなくなるようにする(CentOSに対する)下準備です。

必要な下準備は簡単で、下記のような、カーネルパラメータの調整と
足りないパッケージのインストールとなります。

▼ カーネルパラメータの調整
# cat /etc/sysctl.conf 
...
# For Oracle Client
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
# sysctl -e -p /etc/sysctl.conf 
...
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
※ 上記のカーネルパラメータを"sysctl.conf"に追記して、反映します。

▼ パッケージの導入
# yum -y install \
> libaio \
> libaio-devel \
> elfutils-libelf-devel \
> sysstat \
> unixODBC \
> unixODBC-devel \
> compat-libstdc++-33 \
> pdksh
※ いつもの"yum"です。

最後に実際に出力された警告と、上記の対応方法が個別にわかるように記載しておきます。

情報: INFO: *********************************************
情報: INFO: OSカーネル・パラメータ: semopm: これは、OSカーネル・パラメータ"semopm"が正しく設定されているかどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:100
情報: INFO: Actual Value:32
情報: INFO: Error Message:PRVF-7543 : OS カーネル・パラメータ"semopm"の正しい値がノード"ip-10-146-157-117"にありません[予想 = "100" ; 検出 = "32"]。
情報: INFO: Cause: カーネル・パラメータ値が要件を満たしていません。
情報: INFO: Action: 要件を満たすようにカーネル・パラメータ値を変更してください。
情報: INFO: -----------------------------------------------

"/etc/sysctl.conf"に下記を追記
kernel.sem = 250 32000 100 128

情報: INFO: *********************************************
情報: INFO: OSカーネル・パラメータ: file-max: これは、OSカーネル・パラメータ"file-max"が正しく設定されているかどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:6815744
情報: INFO: Actual Value:60435
情報: INFO: Error Message:PRVF-7543 : OS カーネル・パラメータ"file-max"の正しい値がノード"ip-10-146-157-117"にありません[予想 = "6815744" ; 検出 = "60435"]。
情報: INFO: Cause: カーネル・パラメータ値が要件を満たしていません。
情報: INFO: Action: 要件を満たすようにカーネル・パラメータ値を変更してください。
情報: INFO: -----------------------------------------------

"/etc/sysctl.conf"に下記を追記
fs.file-max = 6815744

情報: INFO: *********************************************
情報: INFO: OSカーネル・パラメータ: ip_local_port_range: これは、OSカーネル・パラメータ"ip_local_port_range"が正しく設定されているかどうかをテストする前提条件で
す。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:between 9000 & 65500
情報: INFO: Actual Value:between 32768 & 61000
情報: INFO: Error Message:PRVF-7543 : OS カーネル・パラメータ"ip_local_port_range"の正しい値がノード"ip-10-146-157-117"にありません[予想 = "between 9000 & 65500" ; 検出 = "between 32768 & 61000"]。
情報: INFO: Cause: カーネル・パラメータ値が要件を満たしていません。
情報: INFO: Action: 要件を満たすようにカーネル・パラメータ値を変更してください。
情報: INFO: -----------------------------------------------

"/etc/sysctl.conf"に下記を追記
net.ipv4.ip_local_port_range = 9000 65500

情報: INFO: *********************************************
情報: INFO: OSカーネル・パラメータ: rmem_default: これは、OSカーネル・パラメータ"rmem_default"が正しく設定されているかどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:262144
情報: INFO: Actual Value:109568
情報: INFO: Error Message:PRVF-7543 : OS カーネル・パラメータ"rmem_default"の正しい値がノード"ip-10-146-157-117"にありません[予想 = "262144" ; 検出 = "109568"]。
情報: INFO: Cause: カーネル・パラメータ値が要件を満たしていません。
情報: INFO: Action: 要件を満たすようにカーネル・パラメータ値を変更してください。
情報: INFO: -----------------------------------------------

"/etc/sysctl.conf"に下記を追記
net.core.rmem_default = 262144

情報: INFO: *********************************************
情報: INFO: OSカーネル・パラメータ: rmem_max: これは、OSカーネル・パラメータ"rmem_max"が正しく設定されているかどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:4194304
情報: INFO: Actual Value:131071
情報: INFO: Error Message:PRVF-7543 : OS カーネル・パラメータ"rmem_max"の正しい値がノード"ip-10-146-157-117"にありません[予想 = "4194304" ; 検出 = "131071"]。
情報: INFO: Cause: カーネル・パラメータ値が要件を満たしていません。
情報: INFO: Action: 要件を満たすようにカーネル・パラメータ値を変更してください。
情報: INFO: -----------------------------------------------

"/etc/sysctl.conf"に下記を追記
net.core.rmem_max = 4194304

情報: INFO: *********************************************
情報: INFO: OSカーネル・パラメータ: wmem_default: これは、OSカーネル・パラメータ"wmem_default"が正しく設定されているかどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:262144
情報: INFO: Actual Value:109568
情報: INFO: Error Message:PRVF-7543 : OS カーネル・パラメータ"wmem_default"の正しい値がノード"ip-10-146-157-117"にありません[予想 = "262144" ; 検出 = "109568"]。
情報: INFO: Cause: カーネル・パラメータ値が要件を満たしていません。
情報: INFO: Action: 要件を満たすようにカーネル・パラメータ値を変更してください。
情報: INFO: -----------------------------------------------

"/etc/sysctl.conf"に下記を追記
net.core.wmem_default = 262144

情報: INFO: *********************************************
情報: INFO: OSカーネル・パラメータ: wmem_max: これは、OSカーネル・パラメータ"wmem_max"が正しく設定されているかどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:1048576
情報: INFO: Actual Value:131071
情報: INFO: Error Message:PRVF-7543 : OS カーネル・パラメータ"wmem_max"の正しい値がノード"ip-10-146-157-117"にありません[予想 = "1048576" ; 検出 = "131071"]。
情報: INFO: Cause: カーネル・パラメータ値が要件を満たしていません。
情報: INFO: Action: 要件を満たすようにカーネル・パラメータ値を変更してください。
情報: INFO: -----------------------------------------------

"/etc/sysctl.conf"に下記を追記
net.core.wmem_max = 1048576

情報: INFO: *********************************************
情報: INFO: パッケージ: libaio-0.3.105: これは、パッケージ"libaio-0.3.105"がシステムで使用可能かどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:libaio-0.3.105
情報: INFO: Actual Value:欠落
情報: INFO: Error Message:PRVF-7532 : パッケージ"libaio-0.3.105"がノード"ip-10-146-157-117"にありません
情報: INFO: Cause: 必要なパッケージがインストールされていないか、またはパッケージがカーネル・モジュールの場合、指定したノードにパッケージがロードされていません。
情報: INFO: Action: 必要なパッケージがインストールされており、使用可能であることを確認してください。
情報: INFO: -----------------------------------------------

下記でパッケージをインストール
# yum -y install libaio

情報: INFO: *********************************************
情報: INFO: パッケージ: libaio-devel-0.3.105: これは、パッケージ"libaio-devel-0.3.105"がシステムで使用可能かどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:libaio-devel-0.3.105
情報: INFO: Actual Value:欠落
情報: INFO: Error Message:PRVF-7532 : パッケージ"libaio-devel-0.3.105"がノード"ip-10-146-157-117"にありません
情報: INFO: Cause: 必要なパッケージがインストールされていないか、またはパッケージがカーネル・モジュールの場合、指定したノードにパッケージがロードされていません。
情報: INFO: Action: 必要なパッケージがインストールされており、使用可能であることを確認してください。
情報: INFO: -----------------------------------------------

下記でパッケージをインストール
# yum -y install libaio-devel

情報: INFO: *********************************************
情報: INFO: パッケージ: elfutils-libelf-devel-0.97: これは、パッケージ"elfutils-libelf-devel-0.97"がシステムで使用可能かどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:elfutils-libelf-devel-0.97
情報: INFO: Actual Value:欠落
情報: INFO: Error Message:PRVF-7532 : パッケージ"elfutils-libelf-devel-0.97"がノード"ip-10-146-157-117"にありません
情報: INFO: Cause: 必要なパッケージがインストールされていないか、またはパッケージがカーネル・モジュールの場合、指定したノードにパッケージがロードされていません。
情報: INFO: Action: 必要なパッケージがインストールされており、使用可能であることを確認してください。
情報: INFO: -----------------------------------------------

下記でパッケージをインストール
# yum -y install elfutils-libelf-devel

情報: INFO: *********************************************
情報: INFO: パッケージ: sysstat-5.0.5: これは、パッケージ"sysstat-5.0.5"がシステムで使用可能かどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:sysstat-5.0.5
情報: INFO: Actual Value:欠落
情報: INFO: Error Message:PRVF-7532 : パッケージ"sysstat-5.0.5"がノード"ip-10-146-157-117"にありません
情報: INFO: Cause: 必要なパッケージがインストールされていないか、またはパッケージがカーネル・モジュールの場合、指定したノードにパッケージがロードされていません。
情報: INFO: Action: 必要なパッケージがインストールされており、使用可能であることを確認してください。
情報: INFO: -----------------------------------------------

下記でパッケージをインストール
# yum -y install sysstat

情報: INFO: *********************************************
情報: INFO: パッケージ: unixODBC-2.2.11: これは、パッケージ"unixODBC-2.2.11"がシステムで使用可能かどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:unixODBC-2.2.11
情報: INFO: Actual Value:欠落
情報: INFO: Error Message:PRVF-7532 : パッケージ"unixODBC-2.2.11"がノード"ip-10-146-157-117"にありません
情報: INFO: Cause: 必要なパッケージがインストールされていないか、またはパッケージがカーネル・モジュールの場合、指定したノードにパッケージがロードされていません。
情報: INFO: Action: 必要なパッケージがインストールされており、使用可能であることを確認してください。
情報: INFO: -----------------------------------------------

下記でパッケージをインストール
# yum -y install unixODBC

情報: INFO: *********************************************
情報: INFO: パッケージ: unixODBC-devel-2.2.11: これは、パッケージ"unixODBC-devel-2.2.11"がシステムで使用可能かどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:unixODBC-devel-2.2.11
情報: INFO: Actual Value:欠落
情報: INFO: Error Message:PRVF-7532 : パッケージ"unixODBC-devel-2.2.11"がノード"ip-10-146-157-117"にありません
情報: INFO: Cause: 必要なパッケージがインストールされていないか、またはパッケージがカーネル・モジュールの場合、指定したノードにパッケージがロードされていません。
情報: INFO: Action: 必要なパッケージがインストールされており、使用可能であることを確認してください。
情報: INFO: -----------------------------------------------

下記でパッケージをインストール
# yum -y install unixODBC-devel

情報: INFO: *********************************************
情報: INFO: パッケージ: compat-libstdc++-33-3.2.3: これは、パッケージ"compat-libstdc++-33-3.2.3"がシステムで使用可能かどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:compat-libstdc++-33-3.2.3
情報: INFO: Actual Value:欠落
情報: INFO: Error Message:PRVF-7532 : パッケージ"compat-libstdc++-33-3.2.3"がノード"ip-10-146-157-117"にありません
情報: INFO: Cause: 必要なパッケージがインストールされていないか、またはパッケージがカーネル・モジュールの場合、指定したノードにパッケージがロードされていません。
情報: INFO: Action: 必要なパッケージがインストールされており、使用可能であることを確認してください。
情報: INFO: -----------------------------------------------

下記でパッケージをインストール
# yum -y install compat-libstdc++-33

情報: INFO: *********************************************
情報: INFO: パッケージ: pdksh-5.2.14: これは、パッケージ"pdksh-5.2.14"がシステムで使用可能かどうかをテストする前提条件です。
情報: INFO: Severity:IGNORABLE
情報: INFO: OverallStatus:VERIFICATION_FAILED
情報: INFO: -----------------------------------------------
情報: INFO: Verification Result for Node:ip-10-146-157-117
情報: INFO: Expected Value:pdksh-5.2.14
情報: INFO: Actual Value:欠落
情報: INFO: Error Message:PRVF-7532 : パッケージ"pdksh-5.2.14"がノード"ip-10-146-157-117"にありません
情報: INFO: Cause: 必要なパッケージがインストールされていないか、またはパッケージがカーネル・モジュールの場合、指定したノードにパッケージがロードされていません。
情報: INFO: Action: 必要なパッケージがインストールされており、使用可能であることを確認してください。
情報: INFO: -----------------------------------------------

下記でパッケージをインストール
# yum -y install pdksh

次は、ようやく"Oracle Database 11g Release 2 Client"(11.2.0.1.0)のインストールです。
--------
http://www.suz-lab.com

2011年6月28日火曜日

SimpleDBにSyslogっぽいログを出力(保存)

スズキです。

"Auto Scaling"で起動しているEC2インスタンスは、勝手にターミネートしてしまうので、
ログはEC2インスタンスではなく別の場所に出力する必要があります。

ということでSimpleDBに出力してみました。せっかくなのでログのフォーマットは
Syslogっぽくして、Syslogラッパーにもつなげれれば、と思っています。

ちなみに、Syslogのフォーマットは、
timestamp, facility, priority, tag, message
といった感じで、さらにインスタンスIDも出力するようにしています。

ということで、かなり肥大化してしまった、いつもの共通部分です。
下記で紹介したやり方を応用してインスタンスIDを取得し、
EC2起動時に設定できる"User Data"をPHPで利用する
ログ出力用の関数(logger)を定義し、そこでSmpleDBに出力するようにしています。

▼ common.php
define("AWS_KEY"              , "AAAAAAAA");
define("AWS_SECRET_KEY"       , "SSSSSSSS");
define("CP_SQS_URL_CRAWL"     , "https://sqs.ap-northeast-1.amazonaws.com/00000000/crawl");
define("CP_AS_NAME"           , "crawl");
define("CP_SDB_DOMAIN_MESSAGE", "message");
define("CP_SDB_DOMAIN_LOG"    , "log");
date_default_timezone_set("Asia/Tokyo");

// インスタンスIDを取得
$curl = curl_init("http://169.254.169.254/1.0/meta-data/instance-id");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
define("CP_EC2_INSTANCE", curl_exec($curl));
curl_close($curl);

// ログ出力関数
function logger($sdb, $facility, $priority, $tag, $message) {
    $time = time();
    $response = $sdb->put_attributes(CP_SDB_DOMAIN_LOG, CP_EC2_INSTANCE . "-" . $time . "-" . rand(), array(
        "instance"  => CP_EC2_INSTANCE,
        "timestamp" => $time,
        "facility"  => $facility,
        "priority"  => $priority,
        "tag"       => $tag,
        "message"   => $message
    ));
}

実際のログの出力と表示のコードはこんな感じです。

▼ put-and-get-log
require_once("/opt/cloudpack/bin/common.php");
require_once("/opt/aws/php/sdk.class.php");
$sdb = new AmazonSDB();
$sdb->set_region(AmazonSDB::REGION_APAC_NE1);

// ログの出力
logger($sdb, "facility", "priority", "tag", "message");

// ログを取得するクエリー
$query = <<<QUERY
SELECT *
FROM log
WHERE timestamp IS NOT NULL
ORDER BY timestamp DESC
LIMIT 10
QUERY;

// ログの表示
$response = $sdb->select($query);
$items = $response->body->SelectResult->Item;
foreach($items as $item) {
    foreach($item->Attribute as $attribute) {
        switch($attribute->Name) {
            case "instance":
                $instance  = $attribute->Value;
                break;
            case "timestamp":
                $timestamp = date("c", intval($attribute->Value));
                break;
            case "facility":
                $facility  = $attribute->Value;
                break;
            case "priority":
                $priority  = $attribute->Value;
                break;
            case "tag":
                $tag       = $attribute->Value;
                break;
            case "message":
                $message   = $attribute->Value;
                break;
        }
    }
    print("$instance $timestamp $facility $priority $tag $message\n");
}

実行すると、こんな感じです。

# ./put-and-get-log 
i-f4ed9ff5 2011-06-28T21:53:51+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:26:13+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:26:11+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:26:09+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:26:07+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:26:04+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:26:00+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:25:59+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:25:57+09:00 facility priority tag message
i-f4ed9ff5 2011-06-28T21:25:56+09:00 facility priority tag message

結構コード書き散らしちゃったから、そろそろ収束させないと...
--------
http://www.suz-lab.com

SQSのメッセージの処理状態をSimpleDBで管理

スズキです。

下記のFAQにある通り非常に稀なのですが、
SQSのメッセージは同じものが複数回配信される可能性があるようです。
Q: How many times will I receive each message?
それぞれのメッセージは何回受信しますか?

Amazon SQS is engineered to provide “at least once” delivery
of all messages in its queues.
SQSはキュー内の全てメッセージを"少なくても一回"配信するように処理しています。

Although most of the time each message will be delivered
to your application exactly once,

それぞれのメッセージは、ほとんどの場合、使用しているアプリケーションに対して
ちょうど一回配信されますが、

you should design your system so that processing a message
more than once does not create any errors or inconsistencies.

あなたはそのアプリケーションを、同じメッセージを一回以上処理しても
エラーが発生したりデータ不整合がおきないように設計すべきです。
ということで、既に処理したメッセージを受信した場合に処理を行わないように、
メッセージ処理に関するステータスをSimpleDBに保存して、
処理していないメッセージのみ処理するようなものを作ってみました。

SQSのキューの作成やメッセージの送信は下記を参考にして下さい。
PHPでSQS
まずは共通部分です。(いろいろ関係ないのも混じってますが...)

▼ common.php
define("AWS_KEY"              , "AAAAAAAA");
define("AWS_SECRET_KEY"       , "SSSSSSSS");
define("CP_SQS_URL_CRAWL"     , "https://sqs.ap-northeast-1.amazonaws.com/00000000/crawl");
define("CP_AS_NAME"           , "crawl");
define("CP_SDB_DOMAIN_MESSAGE", "message");
define("CP_SDB_DOMAIN_LOG"    , "log");
date_default_timezone_set("Asia/Tokyo");

SimpleDBのドメインの作成は、こんな感じです。

▼ create-domain.php
require_once("/opt/cloudpack/bin/common.php");
require_once("/opt/aws/php/sdk.class.php");
$sdb = new AmazonSDB();
$sdb->set_region(AmazonSDB::REGION_APAC_NE1);
$response = $sdb->createDomain(CP_SDB_DOMAIN_MESSAGE); 
var_dump($response);

そして、SQSのメッセージの取得と処理の部分です。
メッセージを処理する前にSimpleDBを確認するようにしています。

▼ get-message.php
require_once("/opt/cloudpack/bin/common.php");
require_once("/opt/aws/php/sdk.class.php");
$sqs = new AmazonSQS();
$sdb = new AmazonSDB();
$sdb->set_region(AmazonSDB::REGION_APAC_NE1);
$response = $sqs->receive_message(CP_SQS_URL_CRAWL);
print($response->isOK() . "\n");

// メッセージがあったら実行
if(isset($response->body->ReceiveMessageResult->Message)) {
    $message_id     = $response->body->ReceiveMessageResult->Message->MessageId;
    $body           = $response->body->ReceiveMessageResult->Message->Body;
    $receipt_handle = $response->body->ReceiveMessageResult->Message->ReceiptHandle;
    $response = $sdb->get_attributes(CP_SDB_DOMAIN_MESSAGE, $message_id);
    print($response->isOK() . "\n");

    // まだメッセージが処理されていなかったら実行
    if(!isset($response->body->GetAttributesResult->Attribute)) {
        print($body . "\n");
        sleep(5);
        // メッセージを処理したらSimpleDBに登録
        $response = $sdb->put_attributes(CP_SDB_DOMAIN_MESSAGE, $message_id, array(
            "timestamp" => time(),
            "body"      => $body
        ), true);
        print($response->isOK() . "\n");
    }

    $response = $sqs->delete_message(CP_SQS_URL_CRAWL, $receipt_handle);
    print($response->isOK() . "\n");
}

下記にもマージしておこう。
"SQS"と"CloudWatch"と"Auto Scaling"
--------
http://www.suz-lab.com

2011年6月27日月曜日

"SQS"と"CloudWatch"と"Auto Scaling"

スズキです。

"SQS"のメッセージ数を"CloudWatch"にカスタムメトリクスとして登録して、
そのカスタムメトリクスで"Auto Scaling"するってやつです。

今回は、一日一回の頻度でSQSに一気にメッセージを登録し、
それを複数インスタンスで処理するようなものなので
メッセージ数が1以上になったら、一気に10インスタンス立ち上げ、
メッセージ数が0になったら、全てのインスタンスをターミネートするようにしています。

SQSのメッセージ数を"CloudWatch"にカスタムメトリクスとして登録する部分は下記、
SQSのキューのサイズをCloudWatchに登録
SQSのメッセージを処理するインスタンスは下記で紹介しています。
SQSのキューのメッセージがなくなたらEC2インスタンスをシャットダウン
(ここでは結局シャットダウンはしないようにしています)
ということで、今回もPHP(AWS SDK)で実現してみました。

まずは共通設定です。

▼ common.php
define("AWS_KEY"         , "AAAAAAAA");
define("AWS_SECRET_KEY"  , "SSSSSSSS");
define("CP_SQS_URL_CRAWL", "https://sqs.ap-northeast-1.amazonaws.com/000000000000/crawl");
define("CP_AS_NAME"      , "crawl");
date_default_timezone_set("Asia/Tokyo");

次に"Auto Scaling"の"launch-configuration"を作成します。
指定している"ami-xxxxxxxx"は起動と同時にSQSのメッセージを処理し続けるAMIです。

▼ create-launch-configuration

require_once("/opt/cloudpack/bin/common.php");
require_once("/opt/aws/php/sdk.class.php");
$as = new AmazonAS();
$as->set_region(AmazonAS::REGION_APAC_NE1);
$response = $as->create_launch_configuration(
    CP_AS_NAME,
    "ami-xxxxxxxx",
    "t1.micro",
    array(
        "KeyName"        => "suz-lab_ap-northeast-1",
        "SecurityGroups" => array(
            "default",
            "crawl"
        )
    )
);
var_dump($response->isOK());

そして"Auto Scaling"の"auto-scaling-group"を作成します。
インスタンス数のMINを0、MAXを10としています。

▼ create-auto-scaling-group
require_once("/opt/cloudpack/bin/common.php");
require_once("/opt/aws/php/sdk.class.php");
$as = new AmazonAS();
$as->set_region(AmazonAS::REGION_APAC_NE1);
$response = $as->create_auto_scaling_group(
    CP_AS_NAME,
    CP_AS_NAME,
    0,
    10,
    array(
        "ap-northeast-1a",
        "ap-northeast-1b"
    )
);
var_dump($response->isOK());

PHP側の最後は"scaling-policy"の設定です。
ここでは"scale-out"のポリシー(10インスタンスになるように起動)と
"scale-in"のポリシー(全て"100%"のインスタンスをターミネート)を作成しています。

▼put-scaling-policy
require_once("/opt/cloudpack/bin/common.php");
require_once("/opt/aws/php/sdk.class.php");
$as = new AmazonAS();
$as->set_region(AmazonAS::REGION_APAC_NE1);
$response = $as->put_scaling_policy(
    CP_AS_NAME,
    "scale-out",
    10,
    "ExactCapacity"
);
var_dump($response->body->PutScalingPolicyResult->PolicyARN);
$response = $as->put_scaling_policy(
    CP_AS_NAME,
    "scale-in",
    -100,
    "PercentChangeInCapacity"
);
var_dump($response->body->PutScalingPolicyResult->PolicyARN);

上記で作成したポリシーを、"scale-out"はSQSのメッセージ数が1以上になったとき、
"scale-in"はSQSのメッセージ数が0になったとき実施されるようにするのですが、
この設定はCloudWatchのほうで行い、下記のように"AWS Management Console"で
行うこともできます。

CloudWatchのタブからアラームを作成します。


対象のメトリクス名(queue_size)を指定して、
統計情報の扱い方(Average)とチェックのインターバル(5分)を選択します。


アラームに名前(has-messages)と条件(queue_sizeが1以上になったらアラーム)を指定します。


アラームの状態が変わったときのアクションを指定します。
今回は、状態がアラームになった場合("queue_size"が1以上)は、
先ほど作成した"Auto Scaling"ポリシーの"scale-out"(10インスタンスになるように起動)、
状態がOKになった場合("queue_size"が0)は"scale-in"
(全て"100%"のインスタンスをターミネート)、が実施されるようにしています。


確認画面で問題なければ、"AWS Management Console"のCloudWatchの設定は終了です。


実際にSQSにメッセージを追加すると、EC2インスタンスが一気に10起動され、
メッセージの処理が進みSQSのメッセージ数が0になると、
全てのEC2インスタンスがターミネートされることがわかります。
(下記はアラームの状態とSQSのメッセージ数の推移です)


CloudWatchがデフォルトでSQSのメッセージ数を取れれば、
CloudWatchにデータを投入する管理インスタンスがいらなくなるのに...
--------
http://www.suz-lab.com

"Oracle RDS"で不思議な現象(未解決...)

スズキです。

"Oracle RDS"で下記のような不思議な現象に遭遇しました。

SQL> create or replace procedure suzlab.test is
begin
    dbms_output.put_line('あああああああああああああああああ');
end;
/
  2    3    4    5  
プロシージャが作成されました。

SQL> create or replace procedure suzlab.test is
begin
    dbms_output.put_line('ああああああああああああああああああ');
end;
/
  2    3    4    5  create or replace procedure suzlab.test is
*
行1でエラーが発生しました。:
ORA-00604: 再帰SQLレベル1でエラーが発生しました。 ORA-20900: Error
in rdsadmin.rdsadmin. ORA-00600: 内部エラー・コード, 引数: [kole_t2u], [34],
[], [], [], [], [], [], [], [], [], []
ORA-06512: "RDSADMIN.RDSADMIN", 行183
ORA-06512: 行2

「あ」が一文字多いだけで謎のエラーになってしまいます...

困った...
--------
http://www.suz-lab.com

"Auto Scaling API Tools"を使ってみる(中途半端...)

スズキです。

下記で利用できるようにした"Auto Scaling API Tools"を実際に使ってみました。
"Auto Scaling API Tools"("Auto Scaling"のコマンドラインツール)
といっても、やっぱりPHP(AWS SDK)で設定することにしたので、
"launch-config"と"auto-scaling-group"の作成/削除までという、
中途半端な状態ですが...

コマンドは下記のような感じです。

▼ "launch-config"の作成
# ./as-create-launch-config crawl \
> --image-id ami-xxxxxxxx \
> --instance-type t1.micro \
> --key suz-lab_ap-northeast-1 \
> --group default \
> -I IIIIIIII \
> -S SSSSSSSS \
> --region ap-northeast-1
OK-Created launch config

▼ "auto-scaling-group"の作成
# ./as-create-auto-scaling-group crawl \
> --launch-configuration crawl \
> --availability-zones ap-northeast-1a, ap-northeast-1b \
> --min-size 0 \
> --max-size 5 \
> -I IIIIIIII \
> -S SSSSSSSS \
> --region ap-northeast-1
OK-Created AutoScalingGroup

▼ "auto-scaling-group"の削除
# ./as-delete-auto-scaling-group crawl \
> -I IIIIIIII \
> -S SSSSSSSS \
> --region ap-northeast-1    
Are you sure you want to delete this AutoScalingGroup? [Ny]y
OK-Deleted AutoScalingGroup

▼ "launch-config"の削除
# ./as-delete-launch-config crawl \
> -I IIIIIIII \
> -S SSSSSSSS \
> --region ap-northeast-1
Are you sure you want to delete this launch configuration? [Ny]y
OK-Deleted launch configuration

ということでPHP(AWS SDK)に作戦変更...
--------
http://www.suz-lab.com

"Auto Scaling API Tools"("Auto Scaling"のコマンドラインツール)

スズキです。

コチラからダウンロードできます。

CentOSですが、Javaがインストールされているという前提で、
下記のようにすれば、利用出来るようになります。

# cd /opt/aws
# curl -OL http://ec2-downloads.s3.amazonaws.com/AutoScaling-2010-08-01.zip
# unzip AutoScaling-2010-08-01.zip
# mv AutoScaling-1.0.33.1 auto-scaling
# export AWS_AUTO_SCALING_HOME=/opt/aws/auto-scaling
# export JAVA_HOME=/usr/java/default
# cd auto-scaling/bin
# ./as-version
Amazon AutoScaling CLI version 1.0.33.1 (API 2010-08-01)

次はカスタムメトリクスでの"Auto Scaling"に挑戦です。
--------
http://www.suz-lab.com

2011年6月24日金曜日

SUZ-LAB謹製 CentOS AMI (5.6.2 64bit us-west-1)

スズキです。

SUZ-LAB謹製 CentOS AMI (5.6.2 64bit ap-northeast-1)
を"us-west-1"にも持ってきました。

AMIを「suz」で検索してもらえれば、
811118151095/suz-lab_ebs_centos-core-x86_64-5.6.2
として見つかるはずです。

全リージョンそろえるのが、全然進まない...
--------
http://www.suz-lab.com

"G-CLOUD magazine 2011 Summer"に寄稿しました

スズキです。

G-CLOUD Magazine 2011 Summer
6月29日発売です!
目次はざっくり、下記の通りです。

【特集1】
真価を発揮!AWS

【特集2】
3.11 Windows Azureはそのときどう使われたか?

【特集3】
僕にも作れるソーシャル・ネットワーク

【特集4】
IBMの取り組み

【一般記事】
「Windows AzureでIPhone/iPadアプリ開発を行うためのポイント」
「Hadoopベースの分析ソリューションInfoSphere BigInsightsの全貌に迫る!」
「インフラエンジニアの進む道」

【特別小冊子】KVMで始めるプライベート・クラウドへの第一歩


僕の方で書かせていただいたのは、

▼特集1 真価を発揮!AWS
▼第2章 DRのためのクラウド
▼第2部 cloudpackにおけるAWSによるDR

の部分です。

震災時に、アクセスが困難になった/なるであろう
サイトのヘルプをAWSを中心に行ってきました。

その時の体験を、AWSのプロダクトを中心に
ノウハウ的に紹介させていただいています。

緊急時になればなるほど、AWSの柔軟性と、
フットワークの軽さが威力を発揮することを、
体で感じることができました。

また、同じcloudpackの@kaz_gotoも、

▼特集1 真価を発揮!AWS
▼第2章 DRのためのクラウド
▼コラム そのとき、クラウドエンジニアはどう動いたか?

に寄稿しています。

早く全部読んで、久しぶりに書籍紹介しよう。
--------
http://www.suz-lab.com

SQSのキューのメッセージがなくなたらEC2インスタンスをシャットダウン

スズキです。

タイトルが意味不明だと思いますが、やりたいことは、
SQSのキューのメッセージを処理し続けて、
メッセージがなくなったらシャットダウンするようなインスタンスを作ってみた
ということです。
※ OSはCentOS(5.6)です。

まず、下記のようなPHPスクリプトを用意します。

▼ common.php
define("AWS_KEY"         , "AAAAAAAA");
define("AWS_SECRET_KEY"  , "SSSSSSSS");
define("CP_SQS_URL_CRAWL", "https://sqs.ap-northeast-1.amazonaws.com/000000000000/crawl");

▼ receive-message
require_once("/opt/cloudpack/bin/common.php");
require_once("/opt/aws/php/sdk.class.php");
$sqs = new AmazonSQS();
$sqs->set_region(AmazonSQS::REGION_APAC_NE1);

// キューのメッセージが0で無い限り繰り返し
while($sqs->get_queue_size(CP_SQS_URL_CRAWL) != 0) {
  $response = $sqs->receive_message(CP_SQS_URL_CRAWL);
  if(isset($response->body->ReceiveMessageResult->Message)) {
     var_dump($response->body->ReceiveMessageResult->Message->Body);
     sleep(60); // ここに実際の処理を記述
     $sqs->delete_message(CP_SQS_URL_CRAWL, $response->body->ReceiveMessageResult->Message->ReceiptHandle);
  }
}

// メンテナンス用に"User Data"が設定されていたらシャットダウンしないように
$curl = curl_init("http://169.254.169.254/1.0/user-data");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_exec($curl);
if(curl_getinfo($curl, CURLINFO_HTTP_CODE) != 200) {
  exec("/sbin/shutdown -h now");
}

curl_close($curl);

上記のスクリプトを起動時に実行するため、下記のように"/etc/rc.local"に記述します。

▼ /etc/rc.local
...
# For Crawl
/opt/cloudpack/bin/receive-message >>/var/log/crawl.log 2>&1

次は、このEC2インスタンスを"Auto Scaling"です。
--------
http://www.suz-lab.com

EC2起動時に設定できる"User Data"をPHPで利用する

スズキです。

EC2はインスタンス起動時に"User Data"を設定でき、
"http://169.254.169.254/1.0/user-data"にアクセスすることで取得することができます。

"User Data"が設定されていない場合は、次のように404となります。

# curl http://169.254.169.254/1.0/user-data
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>404 - Not Found</title>
 </head>
 <body>
  <h1>404 - Not Found</h1>
 </body>
</html>

"AWS Managemrnt Console"で下記のように"User Data"を設定して
EC2インスタンスを起動すると、


以下のように設定した値が取得できます。(ステータスコードは200です)

# curl http://169.254.169.254/1.0/user-data
test

とういうことで、PHPで"User Data"の有り無しで処理を分ける場合は、
次のようになります。

$curl = curl_init("http://169.254.169.254/1.0/user-data");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_exec($curl);

if(curl_getinfo($curl, CURLINFO_HTTP_CODE) != 200) {
    // "user-data"が設定されていたときの処理
}

curl_close($curl);

"Auto Scaling"と"SimpleDB"は明日にまわそう。
--------
http://www.suz-lab.com

2011年6月23日木曜日

RDS(MySQL)にクエリキャッシュを設定

スズキです。

DBパラメータグループの"query_cache_size"の設定で可能です。

クエリキャッシュが利用できないときは、
下記のようにサイズが0になっているはずです。

mysql> show variables like 'query_cache_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| query_cache_size | 0     |
+------------------+-------+

PHPなどで下記のように"query_cache_size"に適当なサイズを割り当てて、
DBパラメータグループに設定します。

require_once("/opt/aws/php/sdk.class.php");

define("AWS_KEY"       , "AAAAAAAA");
define("AWS_SECRET_KEY", "SSSSSSSS");

$rds = new AmazonRDS();
$rds->set_region(AmazonRDS::REGION_APAC_NE1);

$response = $rds->modify_db_parameter_group("suz-lab-mysql55", array(
    array(
        "ParameterName"  => "query_cache_size",
        "ParameterValue" => "268435456",
        "ApplyMethod"    => "immediate"
    )
));

var_dump($response);

"AWS Management Console"で確認すると、下記のように上記で設定した値が
パラメータ"query_cache_size"に反映されていることがわかります。


念のためRDSもリブートしておきます。(当然上記のDBパラメータグループが付与された形で)

もう一度、RDS(MySQL)上の"query_cache_size"の値を確認すると、
上記の値が反映されていることがわかります。

mysql> show variables like 'query_cache_size';
+------------------+-----------+
| Variable_name    | Value     |
+------------------+-----------+
| query_cache_size | 268435456 |
+------------------+-----------+

そして、適当にSELECT文を何回か実行すると、
下記のようにクエリキャッシュが機能していることがわかります。

mysql> SHOW STATUS LIKE 'Qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 268415920 |
| Qcache_hits             | 4         |
| Qcache_inserts          | 1         |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 91        |
| Qcache_queries_in_cache | 1         |
| Qcache_total_blocks     | 4         |
+-------------------------+-----------+

DBパラメータグループのパラメータ変更がコンソールでできるようになりますように。 #AWS77
--------
http://www.suz-lab.com

SQSのキューのサイズをCloudWatchに登録

スズキです。

"Auto Scaling"でSQSのキューのサイズ(メッセージの数)に応じて、
EC2インスタンスを増やすような仕組みを作る必要があり、
その準備として、SQSのキューのサイズをCloudWatchに登録する部分を作ってみました。

AWSアカウントはIAMユーザーを利用することとすると、
SQSとCloudWatchの許可ポリシーを付与する必要があります。

SQSはコチラで紹介したものを使い、
CloudWatchに関しては下記を利用すればOKです。

{
    "Statement": [{
        "Action": "cloudwatch:*",
        "Effect": "Allow",
        "Resource": "*"
    }]
}

コードは下記のような感じです。

まずは、共通設定系です。

▼common.php
define("AWS_KEY"         , "AAAAAAAA");
define("AWS_SECRET_KEY"  , "SSSSSSSS");
define("CP_SQS_URL_CRAWL", "https://sqs.ap-northeast-1.amazonaws.com/000000000000/crawl");
date_default_timezone_set("Asia/Tokyo");

実際のSQSのキューサイズを取得し、CloudWatchに登録するものは下記となります。
(SQSのキューの作成やメッセージの登録はコチラで紹介しています)

▼put-queue-size-to-cloudwatch
require_once("/opt/cloudpack/bin/common.php");
require_once("/opt/aws/php/sdk.class.php");
$sqs = new AmazonSQS();
$sqs->set_region(AmazonSQS::REGION_APAC_NE1);
$queue_size = $sqs->get_queue_size(CP_SQS_URL_CRAWL);

$timestamp = date("c");
$metrics = array(array(
    "MetricName" => "queue_size",
    "Timestamp"  => $timestamp,
    "Value"      => $queue_size,
    "Unit"       => "Count"
));
$cw = new AmazonCloudWatch();
$cw->set_region(AmazonCloudWatch::REGION_APAC_NE1);
$response = $cw->put_metric_data("crawl", $metrics);

print($timestamp . " ");
if($response->isOK()) {
    print("\n");
} else {
    print($response->body->Error->Message . "\n");
}
※ CloudWatchの登録に関しては、下記も参考になると思います。
NagiosとCloudWatchを組み合わせてみた

上記スクリプトの出力は下記となります。

// 正常終了
2011-06-23T17:39:13+09:00
// 異常終了
2011-06-23T17:38:56+09:00 The parameter MetricData.member.1.MetricName is required.

ここまで用意できたら次のように、"cron"で5分おきに上記スクリプトを実行します。

...
# crawl
*/5 * * * * root /opt/cloudpack/bin/put-queue-size-to-cloudwatch >>/var/log/crowl.log 2>&1

少し時間をおいて、"AWS Management Console"で確認すると、
下記のように、SQSキューのサイズがCloudWatchに登録されていることが確認できます。

次はSQSキューを処理するEC2インスタンス作成です。
--------
http://www.suz-lab.com

IAMのSQSとSimpleDBが利用出来るポリシー

スズキです。

近頃、SQSとSimpleDBが利用出来るIAMユーザーを作成する機会が増えてきたので、
コピペ用にポリシー(JSON)を用意しておきました。

▼ SQS
{
    "Statement": [{
        "Effect": "Allow",
        "Action": "sqs:*",
        "Resource": "*"
    }]
}

▼ SimpleDB
{
    "Statement": [{
        "Action": "sdb:*",
        "Effect": "Allow",
        "Resource": "*"
    }]
}

S3、SQS、SimpleDB、はAWS三種の神器か!?
--------
http://www.suz-lab.com

2011年6月22日水曜日

AWSの耐障害性に関する資料

スズキです。

コチラの資料の最後にまとめたのですが、確かどこかにあったなー、
と思いながら、実際探すとなかなか見つからなかったので、
検索性を高くするために、ブログにもまとめておくことにします。

AWS アーキテクチャセンター
AWS クラウドで非常にスケーラブルで信頼性の高いアプリケーションを
構築するために必要なガイダンスやベストプラクティスを提供。

slideshare
AWSのエバンジェリスト、玉川さんのslideshareです。
耐障害性関連以外でも様々な資料があります。

資料まとめページでも作ろうかなー...
--------
http://www.suz-lab.com

"クラウド 障害予防/トラブル対策 勉強会"の資料です

スズキです。

コチラで紹介した"クラウド 障害予防/トラブル対策 勉強会"の資料です。


15分で過不足なくちゃんとまとめれるかなー...
--------
http://www.suz-lab.com

2011年6月21日火曜日

PHPでSQS

スズキです。

今まで可用性を高める手段の一つとしてS3の実用化に集中していたのですが、
そろそろSQSやSimpleDBも手を出していくことにしました。

まずはSQSを利用してみます。言語はいつものPHP(AWS SDK)です。

まずはキューの作成ですが、こんなコードでできてしまいます。

require_once("/opt/aws/php/sdk.class.php");
define("AWS_KEY"       , "AAAAAAAA");
define("AWS_SECRET_KEY", "SSSSSSSS");
$sqs = new AmazonSQS();
$sqs->set_region(AmazonSQS::REGION_APAC_NE1);
$response = $sqs->create_queue("suz-lab-queue");
var_dump($response->body->CreateQueueResult->QueueUrl);

実行結果はこんな感じです。後の処理で必要なためQueueUrlはひかえておきましょう。

# ./create-queue.php 
object(CFSimpleXML)#7 (1) {
  [0]=>
  string(67) "https://sqs.ap-northeast-1.amazonaws.com/811118151095/suz-lab-queue"
}

次にメッセージを送るコードはこんな感じです。
"send_message"メソッド実行時に上記のQueueUrlと送信したいメッセージを引数にします。

require_once("/opt/aws/php/sdk.class.php");
define("AWS_KEY"       , "AAAAAAAA");
define("AWS_SECRET_KEY", "SSSSSSSS");
$url = "https://sqs.ap-northeast-1.amazonaws.com/811118151095/suz-lab-queue";
$sqs = new AmazonSQS();
$sqs->set_region(AmazonSQS::REGION_APAC_NE1);
$response = $sqs->send_message($url, $argv[1]);
var_dump($response->isOK());

実行結果はこんな感じで、メッセージがキューに溜まったはずです。

# ./send-message.php suz-lab-1
bool(true)

最後にメッセージの取得ですが、コードはこんな感じです。
こちらも"receive_message"メソッド実行時に上記のQueueUrlを引数としています。
また、同時にメッセージの削除もしているのですが、
"delete_message"メソッド実行時にQueueUrlはもちろんのこと、
取得したメッセージのReceiptHandleも引数に必要になるので注意です。

require_once("/opt/aws/php/sdk.class.php");
define("AWS_KEY"       , "AAAAAAAA");
define("AWS_SECRET_KEY", "SSSSSSSS");
$url = "https://sqs.ap-northeast-1.amazonaws.com/811118151095/suz-lab-queue";
$sqs = new AmazonSQS();
$response = $sqs->receive_message($url);
$receipt_handle = $response->body->ReceiveMessageResult->Message->ReceiptHandle;
var_dump($response->body->ReceiveMessageResult->Message->Body);
$response = $sqs->delete_message($url, $receipt_handle);
var_dump($response->isOK());

実行してみると、無事、メッセージが取得できていることが確認できます。

# ./receive-message.php 
object(CFSimpleXML)#3 (1) {
  [0]=>
  string(5) "test1"
}
bool(true)

次はSimpleDBとの連携も...
--------
http://www.suz-lab.com

"クラウド 障害予防/トラブル対策 勉強会"で話します

スズキです。

コチラの"クラウド 障害予防/トラブル対策 勉強会"でお話させていただくことになりました。

今回は、日経BP社の協力いただき オープンクラウドキャンパス
「クラウド運用管理研究会」主催で、クラウドの障害事例、
障害・トラブルを未然で防止するためにどうすべきか、
落ちてしまったあとにどう頑張るか等々、設計・運用で欠かすことができない
障害・トラブル対策についての勉強会を行いディスカッションを予定です。

■ 日時
6月22日(水) 19:10 ~ 20:40

■ 会場
〒108-8646 東京都港区白金1-17-3 NBFプラチナタワー
日経BP社 4階会議室(定員50人)

ちょうどcloudpackが一周年なので、

「cloudpack(AWS運用事業)一周年でわかってきたこと」

というタイトルで、cloudpackのサービスである"導入支援"と"運用保守"の二つの観点から、
勉強会のテーマである障害予防とトラブル対策に関して、お話させていただこうと思います。


--------
http://www.suz-lab.com

2011年6月19日日曜日

"#AWS77"をPHPで集計してみた

スズキです。

(ハッシュタグでまとめたいので、 #AWS77 つけて頂きつつ、+1の方は公式RTして頂く感じでどうでしょうか?) #jawsugless than a minute ago via TweetDeck Favorite Retweet Reply


をPHPでまとめてみました。コードは下記の通りです。

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);

curl_setopt($curl, CURLOPT_URL, "http://search.twitter.com/search.json?rpp=100&q=AWS77");
$json = curl_exec($curl);
$search_results = json_decode($json, true);

$ordered_results = array();
foreach($search_results["results"] as $search_result) {
  $tweet_text = $search_result["text"];
  if(strpos($tweet_text, "RT ") === false) {
    $tweet_id = $search_result["id_str"];
    curl_setopt($curl, CURLOPT_URL, "http://api.twitter.com/1/statuses/$tweet_id/retweeted_by.json");
    $json = curl_exec($curl);
    $retweet_results = json_decode($json, true);
    array_push($ordered_results, array(
      "tweet_text"    => $tweet_text,
      "tweet_user"    => $search_result["from_user"],
      "retweet_count" => count($retweet_results)
    ));
  }
}

curl_close($curl);

usort($ordered_results, function($a, $b) {
  if($a["retweet_count"] == $b["retweet_count"]) {
    return 0;
  } else {
    return ($a["retweet_count"] > $b["retweet_count"]) ? -1 : 1;
  }
});

foreach($ordered_results as $ordered_result) {
  print($ordered_result["retweet_count"] . " " . $ordered_result["tweet_user"]  . " " . $ordered_result["tweet_text"] . "\n");
}

※TwitterのAPIのリミットは150リクエスト/時ですので、テスト中にリミットまで
リクエストしてしまったら、テストが中断されてしまいます。ですが、
EC2なら他のEIPをつけなおすことで、また、すぐに、リクエストできるようになります!

そして結果は下記のようになりました。

4 cloudpack_jp 課金情報を取得できるAPIが提供されますように #AWS77 #jawsug
4 b7372        VPCが東京リージョンにきますように。 #AWS77 #jawsug
3 cloudpack_jp PostgreSQLのRDSが始まりますように #AWS77 #jawsug
3 KenTamagawa  #jawsug 大阪の @shi1x1 のLT開始。#AWS77 でみんな七夕の願いを出しているけど、「夢は見るものじゃない叶えるものだ」 課金情報取得APIを作成!
2 cloudpack_jp RDS(MySQL)のタイムゾーンがDBパラメータグループで設定できるようになりますように #AWS77 #jawsug
2 j3tm0t0      (ハッシュタグでまとめたいので、 #AWS77 つけて頂きつつ、+1の方は公式RTして頂く感じでどうでしょうか?) #jawsug
2 tottokug     「玉川さんの仕事が子供に理解されますように」 #AWS77 #jawsug
1 cloudnosuke  RDSがstopできますように。 #AWS77 #jawsug
1 cloudpack_jp VPCで全てのAWSプロダクトが使えるようになりますように #AWS77 #jawsug
1 KenTamagawa  #AWS77 (AWSにほしい機能をお願いする七夕のお願い) 関係の短冊はCloudpackさんの近場のLawsonにつるされているwww #jawsug
0 aibax        Elastic Beanstalkが東京リージョンで使えるようになりますように #AWS77 #jawsug
0 nakau1       みんな、AWSに願い事してる。。#AWS77 #jawsug
0 sato_shi     Beanstalkが東京リージョンに来ますように。 #AWS77 #jawsug
0 tanaka_733   「VPC in Tokyo」「Oracle RDSでEnterprise Manager使いたい」「ELBに入ってくるアクセスへのSecurityGroup」 #AWS77 #jawsug
0 nakau1       次回こそはAWSの勉強会が自分の予定とバッティングしませんように。。#AWS77 #jawsug
0 cloudpack_jp インスタンスに複数EIPが対応されますように #AWS77 #jawsug
0 tanaka_733   Azureと同じように、データセンターへの受信トラフィックが無料になりますように  #AWS77 #jawsug
0 tottokug     「RDSのmicroインスタンスが出ますように!」#AWS77 #jawsug
0 dexdev       何かみんなAWSに願い事してると思ったが、七夕かw知らずに願ってた http://bit.ly/lMfZFt #AWS77 #jawsug
0 dexdev       AutoScalingのLAMPでの具体的解説が出ますように  #AWS77 #jawsug
0 zembutsu     「AWS Management Console が日本語に対応して、もっと多くの人がクラウド・コンピューティングを普通に使えるようになりますように」( -人-)  #AWS77 #jawsug
0 tottokug     勝手課金APIもどき 途中 http://bit.ly/ks7VdA  #jawsug #AWS77
0 FujioSUZUKI  #aws77 AWSへの七夕願い
0 HIKINIKUAGEO AMIsの立ち上げ時のRoot Deviceをinstance-storeとEBSで簡単に切り替えられますように。#AWS77
0 shin1x1      64bit small インスタンスができますように #AWS77 #jawsug
0 suz_lab      "AWS MFA"のデバイスが複数のアカウントで利用できるようになりますように。 #AWS77 #jawsug
0 tottokug     「AmazonReverseProxyが出来ますように!」 #AWS77 #jawsug
0 tottokug     「SimpleDirectoryServiceが出来ますように」#AWS77 #jawsug
0 tottokug     「SecurityGroupでホスト名(Route53で管理されている物に限定)が指定出来るようになりますように」 #AWS77 #jawsug
0 ayakomuro    これは実際にリクエストしたw “@tottokug: 「RDSのmicroインスタンスが出ますように!」#AWS77 #jawsug”
0 tottokug     「SimpleDBの容量が増えますように!」 #AWS77 #jawsug

この結果をSimpleDBにいれてみよう。
--------
http://www.suz-lab.com

2011年6月17日金曜日

"Oracle RDS"に文字コードがAL32UTF8以外のデータ(日本語含む)をインポート

スズキです。

コチラで紹介した通り、"Oracle RDS"の文字コードはAL32UTF8に固定されています。
ですので、他の文字コードのOracleデータベースのデータを移行(exp/imp)するときに、
インポート(imp)時に下記のようなエラーが発生することがあります。

ORA-12899: 列"SUZLAB"."SUZLAB_TABLE"."SUZ_LAB_COLUMN"の値が大きすぎます(実際: 150、最大: 100)

これは、Oracleの文字型の列のサイズ指定はデフォルトではバイト単位で指定するので、
同じ一文字でも日本語などでは、例えばもとは2バイトでも移行時AL32UTF8に
変換されるときに3バイトになってしまい、結果として列に指定されたサイズ(バイト単位)を
超えてしまうことが原因です。

ただOracle(Oracle RDS)には、コチラで紹介したとおり"nls_length_semantics"という
パラメータを調整することにより、文字型の列のサイズをバイト単位を文字数単位に
することができます。

しかし、このパラメータは新規に作成するテーブルに対して有効になり、
インポート(imp)で作成するテーブルはバイト単位のままでした。

ということで、"Oracle RDS"にAL32UTF8以外のデータをインポートするには、
下記の手順で行う必要があります。

(1) スキーマのみインポート(インデックスも作成しない)
(2) 全てのテーブルの文字型の列のサイズをバイト単位から文字数単位に再定義
(3) 統計情報のロックを解除
(4) データもインポート(スキーマ作成に失敗してもインポートを続ける)

(1) スキーマのみインポート(インデックスも作成しない)
下記のようなコマンドでインポートします。オプションとしては"スキーマのみ"(rows=n)と
"インデックスは作成しない"(indexes=n)を指定しておきます。

$ imp suzlab/suzlab123@suzlab.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:1521/suzlab \
> indexes=n \
> rows=n \
> full=y \
> file=suzlab.dmp

(2) 全てのテーブルの文字型の列のサイズをバイト単位から文字数単位に再定義
下記PL/SQLを実行します。ポイントはALTER文で文字型の列を再定義するするときに、
例えば、サイズ"10"を指定するところを"10 CHAR"と明示的に文字単位になるように
指定します。

SET LINESIZE 2000;
SET SERVEROUTPUT ON;
DECLARE
  ddl VARCHAR(2000);
BEGIN
  FOR cur IN (
    SELECT USER_TAB_COLUMNS.TABLE_NAME
         , USER_TAB_COLUMNS.COLUMN_NAME
         , USER_TAB_COLUMNS.DATA_TYPE
         , USER_TAB_COLUMNS.DATA_LENGTH
    FROM USER_TAB_COLUMNS, USER_TABLES
    WHERE USER_TAB_COLUMNS.TABLE_NAME = USER_TABLES.TABLE_NAME
      AND (USER_TAB_COLUMNS.DATA_TYPE = 'VARCHAR2' OR USER_TAB_COLUMNS.DATA_TYPE = 'CHAR')
  ) LOOP
    ddl := 'ALTER TABLE ' || cur.TABLE_NAME || ' MODIFY (' || cur.COLUMN_NAME || ' ' || cur.DATA_TYPE || '(' || cur.DATA_LENGTH || ' CHAR))';
    DBMS_OUTPUT.PUT_LINE(ddl);
    EXECUTE IMMEDIATE ddl;
  END LOOP;
END;
/

(3) 統計情報のロックを解除
下記PL/SQLを実行します。この状態だと統計情報がロックされており、
統計情報をインポートするときにエラーになってしまいます。
(詳しくはコチラで紹介しています)

SET LINESIZE 2000;
SET SERVEROUTPUT ON;
DECLARE
  username VARCHAR(2000);
  ddl VARCHAR(2000);
BEGIN
  SELECT USER INTO username FROM DUAL;
  FOR cur IN (
    SELECT USER_TAB_STATISTICS.TABLE_NAME
    FROM USER_TAB_STATISTICS
  ) LOOP
    DBMS_OUTPUT.PUT_LINE(username || ' ' || cur.TABLE_NAME);
    DBMS_STATS.UNLOCK_TABLE_STATS(username, cur.TABLE_NAME);
  END LOOP;
END;
/

(4) データもインポート(スキーマ作成に失敗してもインポートを続ける)
再度、下記のようなコマンドでインポートします。オプションとしては
"スキーマ作成にエラーがあってもデータインポートを続行"(ignore=y)を指定します。

$ imp suzlab/suzlab123@suzlab.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:1521/suzlab \
> ignore=y
> full=y
> file=suzlab.dmp

この手順で、どんどん"Oracle on EC2"を"Oracle RDS"に移行していこう...
--------
http://www.suz-lab.com

Oracleで統計情報のインポート時にエラー(ORA-20005)になったら

スズキです。

Oracleで中途半端な状態でデータインポートなどを行うと
下記のようなエラーが発生することがあります。

ORA-20005: object statistics are locked (stattype = ALL)

これは、統計情報がロックされており、統計情報がインポートとできないためです。

実際に統計情報のロックは下記のように確認することができます。

SQL> SELECT TABLE_NAME,STATTYPE_LOCKED FROM USER_TAB_STATISTICS;
TABLE_NAME    STATTYPE_LOCKED
------------- ---------------
SUZ_LAB_TABLE ALL
...
※STATTYPE_LOCKEDにALLが入っているとロックされていることになります。

ロックを外すには、下記を実行します。

SQL> exec DBMS_STATS.UNLOCK_TABLE_STATS('SUZ_LAB', 'SUZ_LAB_TABLE');

再度確認すると、ロックが外れていることが確認できます。

SQL> SELECT TABLE_NAME,STATTYPE_LOCKED FROM USER_TAB_STATISTICS;
TABLE_NAME    STATTYPE_LOCKED
------------- ---------------
SUZ_LAB_TABLE 
...
※STATTYPE_LOCKEDが空になっているとロックが外れていることになります。

というのを、PL/SQLで実行ユーザーが持つすべての統計情報のロックを外す形で作ってみました。

SET LINESIZE 2000;
SET SERVEROUTPUT ON;
DECLARE
  username VARCHAR(2000);
  ddl VARCHAR(2000);
BEGIN
  SELECT USER INTO username FROM DUAL;
  FOR cur IN (
    SELECT USER_TAB_STATISTICS.TABLE_NAME
    FROM USER_TAB_STATISTICS
  ) LOOP
    DBMS_OUTPUT.PUT_LINE(username || ' ' || cur.TABLE_NAME);
    DBMS_STATS.UNLOCK_TABLE_STATS(username, cur.TABLE_NAME);
  END LOOP;
END;
/

インデックスが問題なければ、"Oracle RDS"へのデータインポート完了!
--------
http://www.suz-lab..com

OracleでPL/SQLを使って全てのビュー/テーブル/シーケンスを削除

スズキ

Oracleで何回もデータインポートなどの実験などやるときに、
汎用的な全てのビュー/テーブル/シーケンスを一気に削除する仕組みが欲しくなります。

なので、PL/SQLで作ってみました。

▼ ビュー(VIEW)の削除
SET LINESIZE 2000;
SET SERVEROUTPUT ON;
DECLARE
  ddl VARCHAR(2000);
BEGIN
  FOR cur IN (
    SELECT USER_VIEWS.VIEW_NAME
    FROM USER_VIEWS
  ) LOOP
    ddl := 'DROP VIEW ' || cur.VIEW_NAME;
    DBMS_OUTPUT.PUT_LINE(ddl);
    EXECUTE IMMEDIATE ddl;
  END LOOP;
END;
/

▼ テーブル(TABLE)の削除
SET LINESIZE 2000;
SET SERVEROUTPUT ON;
DECLARE
  ddl VARCHAR(2000);
BEGIN
  FOR cur IN (
    SELECT USER_TABLES.TABLE_NAME
    FROM USER_TABLES
  ) LOOP
    ddl := 'DROP TABLE ' || cur.TABLE_NAME;
    DBMS_OUTPUT.PUT_LINE(ddl);
    EXECUTE IMMEDIATE ddl;
  END LOOP;
END;
/

▼ シーケンス(SEQUENCES)の削除
SET LINESIZE 2000;
SET SERVEROUTPUT ON;
DECLARE
  ddl VARCHAR(2000);
BEGIN
  FOR cur IN (
    SELECT USER_SEQUENCES.SEQUENCE_NAME
    FROM USER_SEQUENCES
  ) LOOP
    ddl := 'DROP SEQUENCE ' || cur.SEQUENCE_NAME;
    DBMS_OUTPUT.PUT_LINE(ddl);
    EXECUTE IMMEDIATE ddl;
  END LOOP;
END;
/

"Oracle RDS"へのインポート(AL32UTF8以外から)がもうすぐ成功しそう...
--------
http://www.suz-lab.com

2011年6月16日木曜日

S3(Website)のエラードキュメント表示のステータスコードが404だと思ったら403だった!?

スズキです。

S3にはWebsite機能というものがあり、その機能を有効にすると
エラードキュメントを指定して使えるようになります。

例えばアクセスしたURLにコンテンツがなかったり(404)、
アクセス制限がかかっていたり(403)した場合は、エラードキュメントが表示されます。

で、近頃気づいたのですが、S3のWebsite機能で公開している"suz-lab"サイト
http://www.suz-lab.com/
で、存在しないURLにアクセスしたら、当然エラードキュメントが表示するのですが、
ステータスコードが何故か403(アクセス制限がかかっている)でした。
(404を想定していたのですが...)

で、いろいろと調べてみると、バケットに対して、
下記のようなパーミッション設定をしていなかったため、403となっていました。
("AWS Management Console"です)


つまり、バケットのオブジェクトのリスト取得権限が無いため、
存在しないURLもアクセス制限がかかっていることになり、403とのことでした。

上記のパーミッションを設定すると、リスト取得のアクセス制限がないため、
実際にオブジェクトが存在するか確認でき、ない場合は404になります。

どちらにしても、同じエラードキュメントが表示してしまうので、
気づきにくいところではありますが、プログラムなどで、
ステータスコード確認するような処理をする場合は注意が必要です。

ちなみに、Website機能を使っていなくても、同様の挙動となります。
(エラードキュメントのかわりに下記のようなXMLが出力されます)

【404の場合】

【403の場合】

403しか返ってこないって思ってた...
--------
http://www.iret.co.jp

"Oracle RDS"で"nls_length_semantics"の値をCHARに(文字型のサイズをバイト単位から文字数単位に)

スズキです。

Oracleの文字型の列のサイズは、デフォルトではバイト単位です。
Ex. サイズが10なら10バイト分、文字を入れることが可能。

このサイズを"nls_length_semantics"というパラメータで
文字数単位にすることが可能です。

っというのを、"Oracle RDS"でもDBパラメータグループで設定することが可能です。

デフォルトの"RDS Oracle"では下記のように、バイト単位のままです。

SQL> show parameters nls_length_semantics;
NAME                 TYPE   VALUE
-------------------- ------ -----
nls_length_semantics string BYTE

それを下記のようなPHPなどで、パラメータを変更すると、

require_once("/opt/aws/php/sdk.class.php");

define("AWS_KEY"       , "AAAAAAAA");
define("AWS_SECRET_KEY", "SSSSSSSS");

$rds = new AmazonRDS();
$rds->set_region(AmazonRDS::REGION_APAC_NE1);

$response = $rds->modify_db_parameter_group("suz-lab", array(
    array(
        "ParameterName"  => "nls_length_semantics",
        "ParameterValue" => "CHAR",
        "ApplyMethod"    => "pending-reboot"
    )
));

var_dump($response);

次のように、パラメータが変更されます。


再度、パラメータを確認すると、文字数単位に変更されていることが確認できます。

SQL> show parameters nls_length_semantics;
NAME                 TYPE   VALUE
-------------------- ------ -----
nls_length_semantics string CHAR

でも、文字数単位にしてデータインポートしても、ORA-12899がでてしまう...
--------
http://www.suz-lab.com

2011年6月15日水曜日

"Moyea SWF to Video SDK"でSWFを動画に変換(変換編)

スズキです。

コチラでインストールして、コチラで"Windows Media Player"もインストールして
ようやく、SWFを動画に変換する準備ができました。

ということで変換してみます。

サンプルとして、勝手にAway3dのデモサイトの一つを動画にしてみました。
動画にしたデモはコチラです。


注意点として動画化できるものは、下記のようにSWFファイルを直接ひらいても、
正常に表示するものに限ります。
http://www.closier.nl/playground/greenplanet.swf

そして実際に変換するコマンドは下記となります。(AVIに変換しています)

> swf2videocmd "http://www.closier.nl/playground/greenplanet.swf" ^
? -out myvideo.avi ^
? -dt 15 ^
? -f avi ^
? -vcodec mpeg4 ^
? -vbr 1200000 ^
? -acodec mp3 ^
? -asr 44100 ^
? -abr 128000 ^
? -ac 2 ^
? -nosoundcard

出力された動画ファイル(myvideo.avi)を"Windows Media Player"で開いてみると、
下記のように、動画として確認することができます。


でも、$1,500なんだよねー...
--------
http://www.suz-lab.com

"Windows Server 2008 R2 SP1"(EC2)に"Windows Media Player"をインストール

スズキです。

コチラでインストールした"Moyea SWF to Video SDK"ですが、
実際にSWFから動画を生成しようとすると、下記のようなエラーが発生してしまいました。


このエラーは、"Windows Media Player"がインストールされていないときに
発生するエラーなので、"Windows Server 2008 R2 SP1"に
"Windows Media Player"をインストール擦る必要があります。

インストールは「コントロールパネル」から可能です。


「プログラム」の「Windows機能の有効化または無効化」を選択し、


「機能の概要」の左メニューの「機能の追加」を選択し、


「デスクトップ エクスペリエンス」をチェックし、


途中、「インクと手書きサービス」も必要な機能として追加し、


「デスクトップ エクスペリエンス」にチェックがついた形で次に進みます。


最後に、インストールするものを確認して、インストールボタンを押すと、


下記のような画面になり、Windows自体が再起動されます。


再起動が終わると、下記のような画面が開いているので、それを閉じれば終了です。


スタートメニューで見ると、無事、"Windows Media Player"が
利用出来ることを確認できます。


昔のマルチメディアプログラマー時代の血が騒いできた...
--------
http://www.suz-lab.com

"Moyea SWF to Video SDK"でSWFを動画に変換(インストール編)

スズキです。

SWFを動画にする仕組みを作るときに、便利なツールとして
"Moyea SWF to Video SDK"というものがあります。(Windowsのみです)

このツールはコマンドラインベースで提供されているので、
バッチ処理などに組み込みやすい形になっています。

また動画する処理は、一旦、実際にブラウザで動かしているものを
キャプチャーするような感じなので、タイムラインだけでなくASを利用した表現も
動画化することが可能です。

ということで、今回はインストールです。

まずは下記のように、コチラからインストーラーをダウンロードして実行します。


あとはデフォルト状態でひたすら次に進めばインストールが完了します。








インストールが終了したら下記のようにスタートメニューから、
コマンドプロンプトを実行することができます。


下記コマンドでバージョンが表示されれば、簡単な動作確認も終了です。

> swf2videocmd.exe - v


次は実際に、SWFから動画を生成してみます。
----------
http://www.suz-lab.com

"Windows Server 2008 R2 SP1"(EC2)で"IE ESC"を解除

スズキです。

EC2でWindowsを利用する場合、基本的に"Windows Server"を選択することになると思います。
今、東京リージョンで利用するなら、下記のようなAMI(Windows Server 2008 R2 SP1)
になると思います。

ID: ami-b8e842b9
Name: Windows-2008R2-SP1-Base-Locale-JA-JP-v101
Description: Microsoft Windows 2008 R2 with SP1 Base AMI Locale JA-JP provided by Amazon
Platform: Windows
Image size: 35 GB
Owner: amazon (206029621532)

EC2のおかげで気軽に"Windows Server"が利用出来るようになり、
実際に"Windows Server"を相手にした業務も増えてきているのですが、
今までLinux中心の業務を行っているような人は、
Windows(Client)と同じ感覚で"Windows Server"を利用すると、
そのデフォルトのセキュリティ制限の厳しさに驚くと思います。

その厳しいセキュリティ制限の一つに
"IE ESC"(Internet Explorer Enhanced Security Configuration)
が挙げられると思います。

これはIEのセキュリティ制限で、許可されたサイトしか閲覧できず、
それがデフォルトとなっています。
(それ以外のサイトを閲覧しようとすると、毎回ダイアログで許可を求めてきます)

適当なアプリケーションをインターネットからIEを用いてダウンロードする場合は
非常にストレスを感じてしまいます。

ということで、解除方法です。

まずは下記のように、サーバマネージャーを起動します。


次に、下記のように開いたウィンドウの「セキュリティ情報」部分の右側のメニューの
一番下にある「IE ESC の構成」をクリックします。


すると下記のようにダイアログが出てきますので、
「Administrators グループ」をオフにします。


これで、ストレスなくIEで必要なものをダウンロード出来るようになります。

構築が終わったら、再び"IE ESC"を有効にしておきましょう...
--------
http://www.suz-lab.com

EC2(Linux)から"Oracle RDS"にデータをインポート

スズキです。

"Instant Client"には"exp/imp"コマンドが無いようなので、ちょっと面倒です。

一番手っ取り早いのは、東京リージョンなら下記のようなOracleデータベースが
既にインストールされているAMIからインスタンスを起動し、そのインスタンスに、
エクスポートしたダンプファイルを転送し、そこからインポートする形だと思います。

AMI ID: ami-d8dd77d9
AMI Name: Oracle Database 11gR1 x86_64 - OVM

具体的には上記のインスタンスにログインしたら、
下記のように"oracle"ユーザーになり、環境変数を設定します。

# su - oracle
$ export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1
$ export PATH=$PATH:$ORACLE_HOME/bin
$ export NLS_LANG=Japanese_Japan.AL32UTF8

そして、以下のように接続確認です。
当然、このインスタンスが所属するセキュリティグループから"Oracle RDS"の
セキュリティグループにアクセスできるようにしておく必要があります。

$ sqlplus suzlab/suzlab123@suzlab.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:1521/suzlab
SQL*Plus: Release 11.1.0.6.0 - Production on 火 6月 14 21:33:40 2011
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
Oracle Database 11g Release 11.2.0.2.0 - 64bit Production
に接続されました。
SQL> exit
Oracle Database 11g Release 11.2.0.2.0 - 64bit Productionとの接続が切断されました。

接続確認ができたら、とりあえずエクスポートしてみます。

$ exp suzlab/suzlab123@suzlab.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:1521/suzlab file=/tmp/suzlab.dump 
Export: Release 11.1.0.6.0 - Production on 火 6月 14 21:34:30 2011
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
接続先: Oracle Database 11g Release 11.2.0.2.0 - 64bit Production
AL32UTF8キャラクタ・セットおよびAL16UTF16 NCHARキャラクタ・セットでエクスポートを実行します
指定されたユーザーをエクスポートします...
. プリスキーマ・プロシージャ型オブジェクトとアクションをエクスポート中
. ユーザーSUZLABの外部関数ライブラリ名をエクスポート中 
. PUBLICタイプのシノニムをエクスポート中
. プライベート・タイプのシノニムをエクスポート中
. ユーザーSUZLABのオブジェクト型定義をエクスポート中 
SUZLABのオブジェクトをエクスポートします...
. データベース・リンクをエクスポート中
. 順序番号をエクスポート中
. クラスタ定義をエクスポート中
. SUZLABの表をエクスポートします... 従来型パス経由...
. シノニムをエクスポート中
. ビューをエクスポート中
. ストアド・プロシージャをエクスポート中
. 演算子をエクスポート中
. 参照整合性制約をエクスポート中
. トリガーをエクスポート中
. 索引タイプをエクスポート中
. ビットマップ、ファンクションおよび拡張可能索引をエクスポート中
. ポスト可能なアクションをエクスポート中
. マテリアライズド・ビューをエクスポート中
. スナップショット・ログをエクスポート中
. ジョブ・キューをエクスポート中
. リフレッシュ・グループと子をエクスポート中
. ディメンションをエクスポート中
. ポストスキーマ・プロシージャ型オブジェクトとアクションをエクスポート中
. 統計をエクスポート中
エクスポートは警告なしで正常終了しました。

そして、エクスポートしたダンプファイルをインポートしてみます。

$ imp suzlab/suzlab123@suzlab.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:1521/suzlab file=/tmp/suzlab.dump full=y
Import: Release 11.1.0.6.0 - Production on 火 6月 14 21:35:10 2011
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
接続先: Oracle Database 11g Release 11.2.0.2.0 - 64bit Production
エクスポート・ファイルはEXPORT:V11.01.00によって従来型パス経由で作成されました
AL32UTF8キャラクタ・セットおよびAL16UTF16 NCHARキャラクタ・セットでインポートを実行します   
. SUZLABのオブジェクトをSUZLABにインポートしています
インポートは警告なしで正常終了しました。

これで、"Oracle RDS"にデータをインポートする準備ができました。

まだまだ、越えなければならないハードルはあるんだけど...
--------
http://www.suz-lab.com

2011年6月14日火曜日

OracleのプロセスIDから該当SQLを探す

スズキです。

Oracleサーバを運用していると、"top"の出力が下記のようになってるときに
そのプロセスに該当するSQLを確認したいことがあります。

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                            
13838 oracle    25   0 51.7g 589m 558m R   99  0.8  48:23.16 oracle                                                                              
13846 oracle    25   0 51.7g 588m 557m R   99  0.8  48:52.92 oracle                                                                              
27515 oracle    18   0 51.7g 1.3g 1.3g R   78  1.9   0:02.45 oracle                                                                              
27519 oracle    15   0 51.7g 391m 387m S   13  0.6   0:00.40 oracle                                                                              
27513 oracle    15   0 51.7g  99m  95m S    4  0.1   0:00.16 oracle         

そのような場合は、"v$process p, v$session s, v$sql"を利用することで探すことができます。
具体的には下記のようなSQLになります。("v$process"の"spid"でプロセスIDを指定します)

select q.sql_text, q.cpu_time
from v$process p, v$session s, v$sql q
where p.spid       = 13838
  and s.paddr      = p.addr
  and q.address    = s.sql_address
  and q.hash_value = s.sql_hash_value

結果はこんな感じです。

select q.sql_text, q.cpu_time
SQL_TEXT
--------------------------------------------------------------------------------
  CPU_TIME
----------
SELECT ...
6.7316E+10

ただし上記の"v$sql"では、SQLの一部分しか取得できないので、SQL全文を取得するには、
"v$sql_text"も結合する必要があります。

"v$sql_text, $sql"で取得できるデータは、コチラが参考になります。

Oracleマスターの勉強はじめる前に、業務のOracleが本格的になってきた...
--------
http://www.suz-lab.com