2011年10月25日火曜日

PHPでSESを使ってみた

スズキです。

以前下記で、PerlスクリプトでのSESの利用を紹介しましたが、
SESを使ってみた(AWS)
今回は、PHPで同様のことをやってみました。

まずは、下記スクリプトで送信元メールアドレスの承認です。

#!/usr/bin/php
<?php
require_once("/opt/aws/php/default/sdk.class.php");
$ses = new AmazonSES(
    "XXXXXXXXXXXXXXXXXXXX",
    "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
);
$response = $ses->verify_email_address($argv[1]);
var_dump($response->body);
?>

下記のようにスクリプトを実行すると、

# ./verify-email-address alert@suz-lab.com

次のような結果となり、

object(CFSimpleXML)#5 (2) {
    ["@attributes"]=>
    array(1) {
        ["ns"]=>
        string(40) "http://ses.amazonaws.com/doc/2010-12-01/"
    }
    ["ResponseMetadata"]=>
    object(CFSimpleXML)#3 (1) {
        ["RequestId"]=>
        string(36) "885fc1ba-fe3a-11e0-b112-7f7789067247"
    }
}

下記のようなメールが届きます。

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/?...
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

メール本文のURLをクリックすると、下記画面となり、
指定したメールアドレスが承認され、そのアドレスを送信もととしてメールが、
SESで送信できるようになります。


実際に下記のスクリプトでメールを送信してみます。

#!/usr/bin/php
<?php
require_once("/opt/aws/php/default/sdk.class.php");
$ses = new AmazonSES(
    "XXXXXXXXXXXXXXXXXXXX",
    "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
);
$response = $ses->send_email(
    $argv[1],
    array("ToAddresses" => $argv[2]),
    array(
        "Subject.Data"   => "Email Test " . time(),
        "Body.Text.Data" => "This is a simple test message " . time()
    )
);
var_dump($response->body);
?>

次のように、スクリプトを実行すると、

# ./send-email alert@suz-lab.com suzuki@suz-lab.com

下記のようなレスポンスになり、メールが送信されます。
※既にPuroductionモードなので任意のメールアドレスに送信できます。

object(CFSimpleXML)#5 (3) {
    ["@attributes"]=>
    array(1) {
        ["ns"]=>
        string(40) "http://ses.amazonaws.com/doc/2010-12-01/"
    }
    ["SendEmailResult"]=>
    object(CFSimpleXML)#3 (1) {
        ["MessageId"]=>
        string(60) "0000013335e96bb2-2f904dc4-78fe-433e-8eed-1320b955f687-000000"
    }
    ["ResponseMetadata"]=>
    object(CFSimpleXML)#6 (1) {
        ["RequestId"]=>
        string(36) "017ee15c-fe3c-11e0-a309-e313d04d677b"
    }
}

これでNagiosのアラートメールがSESでの送信なる...
----------
http://www.suz-lab.com

2011年10月24日月曜日

PHPで外部テキストを変数展開

スズキです。

いろいろあってNagiosのアラートメール通知を、
サービスごとに行えるようにしているところです。

このような仕組みを作るときは、メールテンプレートをどうしようか?
と悩むところだと思いますが、今回は可能な限りシンプルに仕様と思い、
外部ファイルのテキストを"eval"で変数展開する方法を試してみました。

まずは下記のようなメールテンプレートを用意しておきます。

$NOTIFICATIONTYPE $CONTACTGROUPNAME $HOSTNAME $HOSTSTATE

TYPE     : $NOTIFICATIONTYPE($HOSTSTATE)
ACCOUNT  : $CONTACTGROUPNAME
HOST     : $HOSTNAME($HOSTADDRESS)
DATETIME : $LONGDATETIME
OUTPUT   : $HOSTOUTPUT

これを下記のスクリプトで変数展開します。

$CONTACTGROUPNAME = $argv[1];
$HOSTNAME         = $argv[2];
$NOTIFICATIONTYPE = $argv[3];
$HOSTSTATE        = $argv[4];
$HOSTADDRESS      = $argv[5];
$LONGDATETIME     = $argv[6];
$HOSTOUTPUT       = $argv[7];

$template = file_get_contents("/opt/cloudpack//conf/$CONTACTGROUPNAME/nagios/mail/host/$HOSTNAME.txt");
$eval = "return <<<EVAL\n{$template}EVAL;\n";
file_put_contents("/tmp/sample.txt", eval($eval));

ごちゃごちゃしていますが、要点としては、外部テキストを
return <<<EVAL
外部テキスト
EVAL;
といった感じに調整して、"eval"しています。
※タイトルとは関係ないですが外部ファイルは取得は引数によって変更する形です。

そして下記のように実行すると、

./tmp-nagios-notify-host "admin_cloudpack.jp" "admin-a" "RECOVER" "UP" "xxx.xxx.xxx.xxx" "2011/11/11 11:11:11" ""

ちゃんと変数展開されて、次のようなファイルが出力されます。

RECOVER admin_cloudpack.jp admin-a UP

TYPE     : RECOVER(UP)
ACCOUNT  : admin_cloudpack.jp
HOST     : admin-a(xxx.xxx.xxx.xxx)
DATETIME : 2011/11/11 11:11:11
OUTPUT   : 

次は上記で作成したメール本文をSESで送るところです。

SES、久しぶりだ...
--------
http://www.suz-lab.com

2011年10月21日金曜日

"cloudpack"と"Varnish"

スズキです。

"cloudpack"には「リダイレクトサービス」と「プロキシーサービス」と呼ばれる
付加サービスがあり内部的にはVarnishを利用しています。


リダイレクトサービスは下記のように、"www"無しのドメイン名(suz-lab.com)のみで
アクセスしてきたHTTPリクエストを、"www"のついたものにリダイレクトする
サービスです。


このサービスは、ELB、S3、CloudFrontを独自ドメインで利用するときに、DNSに対して
CNAMEレコードで設定する必要があるのですが、ドメイン名(suz-lab.com)に対しては
CNAMEが利用できないので、その対策としてのサービスです。
(現在はELBに関してはRoute53で対応できますが...)

そしてVarnishでどのように実現しているかというと、下記の記事で紹介した通りです。
Varnishでリダイレクト専用Webサーバの構築


プロキシーサービスはVarnishで実現できることを、共通のVarnishサーバで「if文」を用い
個別(アクセスHost名ごとなど)に設定するものです。

今までの実績として、下記のようなものを行っています。


キャッシュを使ったコンテンツの高速配信


普通のキャッシュサーバでるVarnishの使い方です。場合によっては、
ディレクトリや拡張子ごとに、キャッシュの設定を細かく変更して利用しています。

このあたりは本ブログでも下記で紹介しています。
Varnishでキャッシュ期限を指定


FacebookアプリのコンテンツをS3に配置


Facebookアプリで利用するコンテンツをS3に配置しようとしたら、
FacebookアプリはコンテンツをPOSTメソッドで取得しにくるのですが、
S3はGETメソッドしか対応していないので、Varnishを経由させPOSTメソッドを
GETメソッドに変換してFacebookアプリでもS3を利用できるようにしています。

このあたりは本ブログでも下記で紹介しています。
Varnish経由でS3のコンテンツをPOSTで取得(Facebookアプリ用)


S3(独自ドメイン設定)でHTTPSを利用


S3のコンテンツを独自ドメインで公開することは、現在HTTPではできるのですが、
HTTPSは対応していません。ですのでS3のコンテンツを独自ドメインでHTTPSで
公開する場合は、上記のように、ELBでHTTPSのリクエストを受け、ELBの
SSLターミネーションでHTTPSの処理を行い、その後Varnish経由でS3にHTTPで
接続する形で実現しています。

このあたりは本ブログでも下記で紹介しています。
ELBを利用して1つのEC2で複数ドメインのHTTPS(SSL)


S3で携帯サイト(Softbank)の著作権保護


S3で独自ヘッダをつけることはできるのですが、"x-amz-meta-XXX"の形式のキーしか
付けることができません。ですのでSoftbank携帯サイトでの著作権保護機能に必要な
"x-jphone-copyright"のようなヘッダは直接S3で付けることができないので、
アクセスをVarnish経由にしてVarnishでそのヘッダを付けるようにしています。

このあたりは本ブログでも下記で紹介しています。
S3のオブジェクトのユーザー独自ヘッダのキーの形式は"x-amz-meta-XXX"
VarnishでS3のコンテンツに"x-jphone-copyright"ヘッダを付与


以上のように"cloudpack"ではAWSのサービスを補完するような形でVarnishを利用しています。

そろそろ「プロキシー職人」をメニュー化するか!?
--------
http://www.suz-lab.com

AWStatsでS3のログを解析

スズキです。

以前、下記のようにCloudFrontのログをAWStatsで解析してみましたが、
AWStatsでCloudFrontのログを解析
今回は、S3のログをAWStatsで解析してみます。

S3のアクセスログのフォーマットは下記で説明されている通りで
Server Access Log Format
具体的には、下記のような感じです。

323b798c3d8329a972f387aa85470ab7fd4f8fcc6a038055d847a0ca91770090 www.suz-lab.com [20/Oct/2011:00:38:09 +0000] 000.000.000.000 - 3001D4D544D44477 WEBSITE.GET.OBJECT image/logo.jpg "GET /image/logo.jpg HTTP/1.1" 200 - 7366 7366 26 25 "-" "check_http/v1.4.14 (nagios-plugins 1.4.14)" -

これをAWStatsで解析するには、設定ファイルを下記のようにする必要があります。

...
LogType=W
LogFormat="%other %virtualname %time1 %host %other %other %other %other %methodurl %code %other %bytesd %other %other %other %refererquot %uaquot %other"
LogSeparator=" "
LoadPlugin="timezone +9"
...

"LogFormat"は上記のS3のログフォーマットに合わせた形に調整し、
またS3のアクセスログのタイムスタンプはUTCなので、解析結果が日本時間になるように、
"LoadPlugin"で"timezone +9"も指定しています。

あとは、いつものAWStatsでWebでS3のアクセス状況を確認することができるはずです。

AWStats系はおわりで、次はNagios系の整理だ。。。
--------
http://www.suz-lab.com

2011年10月19日水曜日

RDSのスナップショットの上限は20らしい

スズキです。

RDSのスナップショットを取るPHPスクリプトが下記のような
エラーを出力して、スナップショットがとれない現象がありました。
cannot create more than 20 user snapshots

RDSのスナップショットの上限は、RDSインスタンスと同じ20がデフォルトのようです。

下記でも同じようなことを質問していました。
"cannot create more than 20 user snapshots" on RDS?

上限を上げるためには下記のフォームから申請する必要があります。
RDSインスタンスの上限値を上げるためのフォームですが、
自由入力欄で別途、スナップショット数の上限値UPを依頼すれば、
インスタンス数とは別の上限値をスナップショットの上限値として設定できるらしいです。


びっくりした...
--------
http://www.suz-lab.com

EC2の状態をYAMLで出力(Gitでバージョン管理)

スズキです。

下記のセキュリティグループに続き、
セキュリティグループの状態をテキスト化&バージョン管理(Git)
今度はEC2の構成もYAMLで出力してGitで管理してGitWebで閲覧できるようにしてみました。

YAMLに出力するPHPスクリプトは下記のような感じです。

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

$regions = array(
  AmazonEC2::REGION_US_E1,
  AmazonEC2::REGION_US_W1,
  AmazonEC2::REGION_EU_W1,
  AmazonEC2::REGION_APAC_SE1,
  AmazonEC2::REGION_APAC_NE1
);

$yaml = yaml_parse_file("/opt/cloudpack/conf/$argv[1]/credential.yaml");
$ec2 = new AmazonEC2($yaml["accessKey"], $yaml["secretKey"]);

foreach($regions as $region) {
  $ec2->set_region($region);
  $response = $ec2->describe_instances();
  file_put_contents(
    "/opt/cloudpack/var/$argv[1]/git/ec2/$region.yaml",
    yaml_emit(json_decode($response->body->reservationSet->to_json(), true))
  );
}

exit(0);

今回は、アクセスキーやシークレットキーを下記のように
外部のYAMLファイルから取得するようにしています。
PHPでYAMLファイルの読み込み

セキュリティグループ同様、下記のようにリージョンごとにYAMLファイルが作成されます。

# ./output-ec2-create suz-lab
# ls -1 /opt/cloudpack/var/suz-lab/git/ec2/
ap-northeast-1.yaml
ap-southeast-1.yaml
eu-west-1.yaml
us-east-1.yaml
us-west-1.yaml

実際のYAMLファイルは以下の通りです。

# cat /opt/cloudpack/var/suz-lab/git/ec2/ap-northeast-1.yaml 
---
item:
  reservationId: r-00000000
  ownerId: "000000000000"
  groupSet:
    item:
    - groupId: sg-00000000
      groupName: default
    - groupId: sg-00000000
      groupName: web
  instancesSet:
    item:
      instanceId: i-00000000
      imageId: ami-00000000
      instanceState:
        code: "16"
        name: running
      privateDnsName: ip-000-000-000-000.ap-northeast-1.compute.internal
      dnsName: ec2-000-000-000-000.ap-northeast-1.compute.amazonaws.com
      reason: []
      keyName: suz-lab_ap-northeast-1
      amiLaunchIndex: "0"
      productCodes: []
      instanceType: m1.large
      launchTime: "2011-09-20T01:51:18.000Z"
      placement:
        availabilityZone: ap-northeast-1a
        groupName: []
        tenancy: default
      kernelId: aki-00000000
      ramdiskId: ari-00000000
      monitoring:
        state: enabled
      privateIpAddress: 000.000.000.000
      ipAddress: 000.000.000.000
      groupSet:
        item:
        - groupId: sg-00000000
          groupName: default
        - groupId: sg-00000000
          groupName: web
      architecture: x86_64
      rootDeviceType: ebs
      rootDeviceName: /dev/sda1
      blockDeviceMapping:
        item:
        - deviceName: /dev/sda1
          ebs:
            volumeId: vol-00000000
            status: attached
            attachTime: "2011-09-20T01:51:37.000Z"
            deleteOnTermination: "true"
        - deviceName: /dev/sdf1
          ebs:
            volumeId: vol-7833b915
            status: attached
            attachTime: "2011-09-20T01:53:46.000Z"
            deleteOnTermination: "false"
      virtualizationType: paravirtual
      clientToken: []
      tagSet:
        item:
          key: Name
          value: web01
      hypervisor: xen
  requesterId: 058890971305
...

そして適当にEC2の内容を変更して(タグを変更)、コミットして、
下記のようにGitWebで差分を確認すると
GitWebでセキュリティグループの状態を確認
次のようにセキュリティグループ同様、構成の変更がわかります。


あとは、同じパターンで増やせばいいだけ。
--------
http://www.suz-lab.com

2011年10月18日火曜日

PHPでYAMLファイルの読み込み

スズキです。

近頃、AWS関係の運用ツール作る機会が増えたので、
基本となる"accessKey"と"secretKey"をPHPでファイルから読み込む部分を
改めて試してみました。

とりあえず他の言語から使う可能性もあるので、設定ファイルは
下記のようなYAMLとしています。

▼ credential.yaml
---
accessKey: "XXXXXXXXXXXXXXXXXXXX"
secretKey: "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
...

そして次のようなPHPスクリプトで簡単にYAMLファイルを読み込むことができます。

▼ credential.php
$yaml = yaml_parse_file("credential.yaml");
print($yaml["accessKey"] . "\n");
print($yaml["secretKey"] . "\n");

実行すると、ちゃんとファイルを読み込み、必要な値が取得できていることがわかります。

# php credential.php
XXXXXXXXXXXXXXXXXXXX
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

だいぶ基本的な仕様がかたまってきたかも。
--------
http://www.suz-lab.com

GitWebでセキュリティグループの状態を確認

スズキです。

下記のようにセキュリティーグループの状態をGitでバージョン管理するようになったので、
セキュリティグループの状態をテキスト化&バージョン管理(Git)
これをWebUIで閲覧できるようにします。

WebUIは以前、下記で紹介したGitWebを利用することにしました。
"gitweb"をインストール

GitWebはかなりお手軽で、下記の設定(Apache)がきいているディレクトリに、
"/var/www/git/gitweb.cgi"をコピーするだけで利用できます。

Options +ExecCGI
AddHandler cgi-script .cgi

当然、多少の設定は必要ですが複数のGitWebを利用する場合は、"/etc/gitweb.conf"に
指定するのではなく、下記のように"gitweb.cgi"に直接記述する形となります。

...
our $projectroot = "/opt/cloudpack/var/suz-lab/git";
our @stylesheets = ("http://cdn.cloudpack.jp/git/gitweb.css");
our $logo = "http://cdn.cloudpack.jp/git/git-logo.png";
our $favicon = "http://cdn.cloudpack.jp/git/git-favicon.png";
our $javascript = "http://cdn.cloudpack.jp/git/gitweb.js";
...

せっかくなので、静的なファイルはCloudFrontに置いています。

そして、ようやく下記のように、セキュリティグループの更新履歴や差分を
下記のようにWebで確認する手段が整いました。


もう少し微調整したら、memorycraftにバトンタッチかな。
--------
http://www..suz-lab.com

2011年10月17日月曜日

セキュリティグループの状態をテキスト化&バージョン管理(Git)

スズキです。

下記で紹介した内容のアップデートです。
セキュリティグループの状態をテキストで取得

セキュリティグループをテキスト化するスクリプトは、
上記から下記のように変更しています。

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

$regions = array(
  AmazonEC2::REGION_US_E1,
  AmazonEC2::REGION_US_W1,
  AmazonEC2::REGION_EU_W1,
  AmazonEC2::REGION_APAC_SE1,
  AmazonEC2::REGION_APAC_NE1
);

if(!file_exists("/opt/suzuki/var/suzuki_suz-lab.com/git/securitygroup")) {
  mkdir("/opt/suzuki/var/suzuki_suz-lab.com/git/securitygroup", 0644, true);
}

$ec2 = new AmazonEC2(
  "XXXXXXXXXXXXXXXXXXXX",
  "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
);

foreach($regions as $region) {
  $ec2->set_region($region);
  $response = $ec2->describe_security_groups();
  file_put_contents(
    "/opt/suzuki/var/suzuki_suz-lab.com/git/securitygroup/$region.yaml",
    yaml_emit(json_decode($response->body->securityGroupInfo->to_json(), true))
  );
}

exit(0);

実行すると、下記のようにリージョンごとのセキュリティグループのYAMLが出力されます。

ap-northeast-1.yaml 
ap-southeast-1.yaml
eu-west-1.yaml
us-east-1.yaml
us-west-1.yaml

前回の出力するYAMLは中途半端なものだったので、今回は"php-pecl-yaml"パッケージを
インストールして利用可能になる"yaml_emit"を使ってYAMLを作成しています。
(いったんJSONにしてYAMLにするといい感じになります)

---
item:
- ownerId: "000000000000"
  groupId: sg-xxxxxxxx
  groupName: default
  groupDescription: default group
  ipPermissions:
    item:
    - ipProtocol: tcp
      fromPort: "0"
      toPort: "65535"
      groups:
        item:
          userId: "000000000000"
          groupId: sg-xxxxxxxx
          groupName: default
      ipRanges: []
...

というのを下記スクリプトを定期的に実行することで、
セキュリティグループのバージョン管理(Git)を行います。

#!/bin/sh
/opt/suzuki/bin/output-securitygroup
cd /opt/suzuki/var/suzuki_suz-lab.com/git
git add .
git commit -m "cloudpack" .

適当にセキュリティグループを変更し、上記を再度実行し
"git diff HEAD^"で差分を確認すると、以下のように、
変更された部分を確認することができます。

diff --git a/securitygroup/ap-northeast-1.yaml b/securitygroup/ap-northeast-1.yaml
index 719a63c..28bc7f6 100644
--- a/securitygroup/ap-northeast-1.yaml
+++ b/securitygroup/ap-northeast-1.yaml
@@ -55,13 +55,6 @@ item:
         item:
         - cidrIp: xxx.xxx.xxx.xxx/32
         - cidrIp: yyy.yyy.yyy.yyy/32
-    - ipProtocol: tcp
-      fromPort: "3389"
-      toPort: "3389"
-      groups: []
-      ipRanges:
-        item:
-          cidrIp: xxx.xxx.xxx.xxx/32
   ipPermissionsEgress: []
 - ownerId: "000000000000"
   groupId: sg-xxxxxxxx

次は、これをGitWebで閲覧します。
--------
http://www.suz-lab.com

2011年10月11日火曜日

S3のログをデイリーにまとめる

スズキです。

S3のログは下記のように1日の中でもさらに細切れになった単位でファイル化されます。
access_log-2011-10-11-00-15-33-7E85B60CC1846A80
access_log-2011-10-11-00-16-02-74E3E7E940850885
access_log-2011-10-11-01-15-16-4F73FF952D5D961D
access_log-2011-10-11-01-15-38-3290ED7965705AC2
access_log-2011-10-11-01-15-51-8C02CBA57C279DE8
このままでは扱いづらいので、1日ごとにまとめる(デイリー化)下記のような
シェルスクリプトを作成してみました。

#!/bin/sh
export LANG=C

LOGDIR="/opt/cloudpack/s3/suzuki_suz-lab.com/www.suz-lab.com_s3-log-original"
ARCHIVEDIR="/opt/cloudpack/s3/suzuki_suz-lab.com/www.suz-lab.com_s3-log-daily"
WORKDIR="/opt/cloudpack/tmp/`mkpasswd -l 8 -s 0 -C 8 -c 0 -d 0`"

TARGETDATE=`date -d "$1" "+%Y-%m-%d"`
NEXTDATE=`date -d "$1 1 day" "+%Y-%m-%d"`
PATTERN="\[`date -d "$1" "+%d/%b/%Y"`"

mkdir -p $WORKDIR
cp $LOGDIR/access_log-$TARGETDATE* $WORKDIR/
cp $LOGDIR/access_log-$NEXTDATE* $WORKDIR/
logresolvemerge.pl $WORKDIR/* | grep "$PATTERN" > $WORKDIR/access_log-$TARGETDATE
gzip $WORKDIR/access_log-$TARGETDATE
cp $WORKDIR/access_log-$TARGETDATE.gz $ARCHIVEDIR/access_log-$TARGETDATE.gz
cp $WORKDIR/access_log-$TARGETDATE.gz $ARCHIVEDIR/access_log.gz
rm -rf $WORKDIR

上記のシェルスクリプトは次のような感じで作成しています。

(1) S3のログはs3fsでファイルシステムとしてマウントして取得

(2) 作業ディレクトリは"/opt/cloudpack/tmp/XXXXXXXX"

(3) デイリー化したいログの日付は引数に20111010のように指定

(4) 指定した日付の元ログ(次の日のログも)を作業ディレクトリにコピー
次の日付けののログ(0:00付近)にも前日のログが残っていることがあります。

(5) 一つのログにマージして該当日付のものだけファイル化
"logresolvemerge.pl"でマージして、該当日付にマッチするものだけ"grep"しています。

(6) 圧縮して指定ディレクトリに配置
ログ解析用に最新ものが"access_log.gz"になるようにもしています。

(7) 作業ディレクトリを削除

ちなみに"mkpasswd"と"logresolvemerge.pl"は下記のように本ブログで紹介済みです。

▼mkpasswd
Linuxでランダム文字列の生成

▼logresolvemerge.pl
CloudFrontのログとAWStatsを使ったログのマージ&ソート(日付)

次はこのログをAWStatsで解析します。
--------
http://www.suz-lab.com

2011年10月4日火曜日

Linuxでランダム文字列の生成

スズキです。

"mkpasswd"でできるのですが、"expect"パッケージに含まれているので、
下記のようにインストールしておきます。

# yum -y install expect

オプションは次のようになっています。
-l : パスワードの文字数
-d : 数字の最小数
-c : 小文字の最小数
-C : 大文字の最小数
-s : 特殊文字の最小数

大文字だけの8文字のランダム文字列が必要な場合は、下記のオプションで可能です。

# mkpasswd -l 8 -s 0 -C 8 -c 0 -d 0
LTZWEACZ

とりあえず、シェルスクリプト用です。
--------
http://www.suz-lab.com

2011年10月3日月曜日

SUZ-LAB謹製 CentOS AMI (6.0.3 32bit ap-northeast-1)

スズキです。

下記をアップデートしました。
SUZ-LAB謹製 CentOS AMI (6.0.2 32bit ap-northeast-1)
AMIを「suz」で検索してもらえれば、
811118151095/suz-lab_ebs_centos-core-i386-6.0.3
として見つかるはずです。

アップデート内容は下記となります。

"Continuous Release ( CR ) Repository"の追加とパッケージのアップデート
CentOS-6.0 Continuous Release ( CR ) Repository

"s3fs-cloudpack"のインストール
"SUZ-LAB謹製 CentOS AMI"に"s3fs-cloudpack"をインストール

"openssh-clients"のインストール
"bash: scp: command not found"の対策

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

Varnishでキャッシュ期限を指定

スズキです。

"vcl_fetch"で下記のようにすれば、Varnishでキャッシュ期間を5分にすることができます。
ちなみに"vcl_fetch"はオリジンからコンテンツを取得した後に呼ばれる関数です。

sub vcl_fetch {
    unset beresp.http.expires;
    set beresp.http.cache-control = "max-age=300";
    set beresp.ttl = 300s;
}

上記では、オリジンからのExpiresヘッダを削除して、Cache-Controlヘッダを
300秒(5分)にし、最後に、キャッシュ自体の期限(TTL)も300秒(5分)にしています。

これで5分間はクライアント、もしくはVarnishのキャッシュが利用されるように
なるはずです。

Varnishネタは一旦終了。
--------
http://www.suz-lab.com

Varnishでキャッシュのヒット状況をヘッダに追加

スズキです。

下記を真似すればOKです。
Adding a header indicating hit/miss

具体的には、こんな感じです。

sub vcl_deliver {
    if(obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    } else {
        set resp.http.X-Cache = "MISS";
    }
}

これでヘッダを確認することで、キャッシュ上のコンテンツかどうか判断することができます。

Varnish、負荷に強すぎ...
--------
http://www.suz-lab.com