作成者別アーカイブ: itsugoroku

memorycraft: Storage Gatewayってなんじゃ?(EC2のCentOSにS3をマウント)

AWSにStorageGatewayというサービスがあります。StorageGatewayはオンプレミスのデータをS3へ直接保存するための接続サービスですが、EC2の世界でも利用することができます。

今回は、StorageGatewayでS3の領域をVPC内のEC2にマウントしてみたいと思います。

ゲートウェイの作成

StorageGatewayの画面の左ペインに「Deploy a new Gateway on Amazon EC2」というリンクをクリックします。

するとダイアログが立ち上がり、アクティベーションダイアログが起ち上がります。
赤枠の「Launch Gateway AMI」のリンクをクリックします。

StorageGateway用のAMIの説明画面が開きます。

「Continue」ボタンをクリックします。

AMIの選択画面になり、「1-Click Launch」と「Launch with EC2 Console」のタブがあるので選択肢、TokyoリージョンのAMIをクリックします。料金表をみるとGatewayインスタンスはxlargeから使用可能のようです。

すると確認画面が表示されるので、「Continue」をクリックします。

先ほど「Launch with EC2 Console」を選んだので、EC2のダイアログが起ち上がります。
一番グレードの低いxlargeを選択し、今回はVPCのprivateサブネットを選択します。

あとは通常どおりに進んでいきます。ここではプライベートIPを10.0.1.5に割り当てます。

そのまま次へ進んでいきます。EBSボリュームの設定画面が表示されます。
StorageGatewayではストレージボリューム以外にもキャッシュやバッファ用のボリュームが必要です。ここで追加することも可能ですが、今回はこのまま進み、後から追加することにします。

セキュリティグループのところでは、あとでiscsiを使用するため、このインスタンスをマウントするEC2からiscsiインターフェスでマウントするためデフォルトポート3260をセキュリティグループに含めます。また、設定作業用のSSHポートもあけておきます。

  • 22  10.0.0.0/16
  • 3260 10.0.0.0/16

後はそのまま進み、インスタンスが起ち上がったらEIPを付与します。
VPCの場合でもアクティベーションに使用するので、一時的にEIPをつけておきます。

ここで、先ほどのStrageGatewayの画面にもどり、IPアドレス欄にEIPを入力して、「Proceed to Activation」をクリックします。

するとStrageGatewayのコンソールにゲートウェイのVMの設定が表示されます。
タイムゾーンを選択し、Gatewayの名前を入力して「Activate My Storage Gateway」をクリックします。

すると、以下のような画面になり、ゲートウェイが表示されます。

次に、キャッシュとバッファ用のEBSを作成し、ゲートウェイインスタンスにアタッチします。(インスタンス作成の時に同時に行なっても構いません)

StorageGatewayの画面に戻り、「Create Volume」をクリックするとダイアログが現れるので、キャッシュボリュームとアップロードバッファのデバイスをそれぞれ選択します。今回はキャッシュボリュームに20GB、バッファボリュームに10GBのボリュームを割り当てます。

「Next」をクリックすると、このキャッシュとバッファのボリュームのそれぞれ使用容量のアラームの設定画面が表示されるので、適宜設定していきます。
今回はデフォルトのままメールアドレスを入力し次へすすみます。

すると、ゲートウェイ用ボリュームの設定になります。ここでは実際に使用するファイルストレージとしての容量とiSCSIのターゲットのエンドポイントを決めるIDを入力します。
ここでは、容量は1TB、iSCSIターゲットのIDをmemorycraft-sgwとして最後に「Create Volume」ボタンをクリックします。

するとゲートウェイボリューム作成完了と表示されます。

ここまで出来たらゲートウェイ自体は完了です。


ゲートウェイボリュームをEC2(CentOS)にマウント

次に、作成したゲートウェイボリュームをEC2上のCentOSインスタンスにマウントします。

このボリュームをマウントするためのインスタンスを新たに立ち上げます。

ここから先は、このインスタンスにSSH接続しての設定になります。
StorageGatewayはiSCSIインターフェースなので、このインスタンスをiSCSIイニシエータにするための設定を行います。

まずiSCSIイニシエータツールをインストールして、設定ファイルをStorageGateway用に変更し、起動します。
AWSの資料では、設定は例としてカスタマイズしたほうがよいそうで、それにならって変更します。
実際には用途に応じて適切な値を設定することをお勧めします。

# yum install -y iscsi-initiator-utils# vim /etc/iscsi/iscsid.conf~node.session.timeo.replacement_timeout = 600node.conn[0].timeo.noop_out_interval = 60node.conn[0].timeo.noop_out_timeout = 600~# /etc/init.d/iscsi start

iscsiadmコマンドでネットワーク内のiscsiターゲットを探してみます。
ゲートウェイインスタンスはVPC内で10.0.1.5を設定したため、10.0.1.5を探します。

# iscsiadm --mode discovery --type sendtargets --portal 10.0.1.5:3260iscsid を起動中:                                           [  OK  ]10.0.1.5:3260,1 iqn.1997-05.com.amazon:memorycraft-sgw

StorageGatewayで作成したボリュームが見つかりました。
これに接続します。

# iscsiadm  --mode node --targetname iqn.1997-05.com.amazon:memorycraft-sgw --portal 10.0.1.5:3260,1 --loginLogging in to [iface: default, target: iqn.1997-05.com.amazon:memorycraft-sgw, portal: 10.0.1.5,3260] (multiple)Login to [iface: default, target: iqn.1997-05.com.amazon:memorycraft-sgw, portal: 10.0.1.5,3260] successful.

次に、デバイスとしてアタッチされているか見てみます。

# ls -l /dev/disk/by-path/合計 0lrwxrwxrwx 1 root root  9  2月 23 18:09 2013 ip-10.0.1.5:3260-iscsi-iqn.1997-05.com.amazon:memorycraft-sgw-lun-0 -> ../../sdalrwxrwxrwx 1 root root 11  2月 23 17:54 2013 xen-vbd-2049 -> ../../xvde1

/dev/sdaにアタッチされているようです。
これをマウントしてみます。

# mkfs.ext4 /dev/sdake2fs 1.41.12 (17-May-2010)/dev/sda is entire device, not just one partition!Proceed anyway? (y,n) yFilesystem label=OS type: LinuxBlock size=4096 (log=2)Fragment size=4096 (log=2)Stride=0 blocks, Stripe width=0 blocks67108864 inodes, 268435456 blocks13421772 blocks (5.00%) reserved for the super userFirst data block=0Maximum filesystem blocks=42949672968192 block groups32768 blocks per group, 32768 fragments per group8192 inodes per groupSuperblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848Writing inode tables: done                           Creating journal (32768 blocks): doneWriting superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every 23 mounts or180 days, whichever comes first.  Use tune2fs -c or -i to override.# mkdir /mnt/sgw# mount /dev/sda /mnt/sgw# df -hFilesystem            Size  Used Avail Use% マウント位置/dev/xvde1            6.0G  2.6G  3.1G  47% /none                  3.7G     0  3.7G   0% /dev/shm/dev/sda             1008G  200M  957G   1% /mnt/sgw

おー、ちゃんと1TBがマウントされたようです。
ここに、以前s3syncのときにつかった大量のファイルを置いてみます。

# cd /mnt/sgw/# git clone https://github.com/mirrors/perl.git# git clone https://github.com/apache/cassandra.git# git clone https://github.com/v8/v8.git# git clone https://github.com/symfony/symfony.git# git clone https://github.com/torvalds/linux.git# tree -L 2 ..|-- cassandra|   |-- CHANGES.txt(略)|   `-- tools|-- linux|   |-- COPYING(略)|   `-- virt|-- perl|   |-- AUTHORS(略)|   `-- x2p(略)|   `-- utils|-- symfony|   |-- CHANGELOG-2.0.md(略)|   `-- src`-- v8    |-- AUTHORS(略)    `-- tools# du -sh1.9G .

ファイル配置も問題ないようです。

また、s3cmdやs3fsのようにファイルリストの取得だけで重くなってしまうことはないようですが、キャッシュボリュームがあるためかも知れません。ファイル総量がキャッシュを超えた時の挙動などはまたの機会に試してみたいと思います。
また、EBSをPIOPSにしたり、EBSOptimizedインスタンスにした場合など、ボトルネックや、冗長化などなど考えると奥が深そうです。
現在のところでは、接続先のS3領域はS3コンソールやAPIからは秘匿されているようです。これらにアクセスできるとまた別の使い方ができるかもしれません。

以上です。

ふと思ったこと: smbclientを使ってWindowsの共有フォルダへアクセス

Windows上の共有フォルダにLinuxクライアントからアクセスします。
smbclientが便利です。

WIndows側の設定
① 共有フォルダの作成

② テストのために共有フォルダのしてにtest.txtをおいておく

Linux側の設定
③ smb-clientをインストール
# yum install samba-client

④ smbclientコマンドを使って、WIndowsの共有フォルダへアクセス
smbclient ‘\WindowsのIPアドレス共有フォルダ’
        例) smbclient ‘\192.168.11.4tmp’

enter root’s password: ← 共有フォルダのパスワードをいれる                
Domain=[SHINDOWSXP] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager]
smb: >

⑤ get を使って、test.txtをコピー
smb: > get test.txt

getting file test.txt of size 12 as test.txt (0.5 KiloBytes/sec) (average 0.5 KiloBytes/sec)  

(Linux)CentOSからWindows共有をマウントする方法 : 3流プログラマのメモ書き

現在下記のようなサーバを構築してます。
CentOSサーバ Windowsサーバ
FTP–>Win共有フォルダマウントポイント——>Windowsファイル共有してるフォルダ

要はFTPを経由してLAN内のファイルサーバとして使ってるWindowsマシンの共有フォルダを見たいわけです。

ちなみにFW使ってる場合はポートの445の解放が必要です。

ここを見るとsmbmount コマンドでできるとあったのですが、そんなコマンドはないと怒られます。どうやらCentOS5にはこのコマンドはなくなったようです。
mountコマンドでCIFSをファイル共有

mod_rewrite サンプル集/楽

mod_rewrite サンプル集

mod_rewrite はすげー色んなことができて楽しい。
でもけっこう難しい。
そこで、オイラ用メモで簡単なサンプル集をば。

シンプルなリダイレクト例

/hoge/ を /fuga/ に rewrite(リダイレクト)する。

RewriteEngine on
RewriteRule ^/hoge/$ /fuga/

/hoge/ 以下を /fuga/ 以下にまとめて rewrite(リダイレクト)する。

RewriteEngine on
RewriteRule ^/hoge/(.*)$ /fuga/$1

/hoge/ 以下で末尾が .jpg のリクエストのみを /fuga/ 以下に rewrite(リダイレクト)する。

RewriteEngine on
RewriteRule ^/hoge/(.*.jpg)$ /fuga/$1

/hoge/ 以下で末尾が .jpg か .gif のリクエストのみを /fuga/ 以下に rewrite(リダイレクト)する。

RewriteEngine on
RewriteRule ^/hoge/(.*).(jpg|gif)$ /fuga/$1.$2

/cgi-bin/hoge/fuga を /cgi-bin/example.cgi?q=hoge&opt=fuga に rewrite(リダイレクト)(いわゆる、動的アドレスを静的アドレスに変換するってやつ)

RewriteEngine on
RewriteRule ^/cgi-bin/([0-9A-Za-z]+)/([0-9A-Za-z]+)$ /cgi-bin/example.cgi?q=$1&opt=$2


リダイレクト時のブラウザのURL欄

mod_rewrite で rewrite(リダイレクト)処理を行ったとき、以下のようにサーバパスで rewrite(リダイレクト)させると、ブラウザのURL欄は書き換わらない。

RewriteEngine on
RewriteRule ^/hoge/$ /fuga/

例えば、
http://www.example.com/hoge/ にアクセスすると、
http://www.example.com/fuga/ の中身が、
URL欄は http://www.example.com/hoge/ のまま表示される。

しかし、以下の例では、リダイレクトと同時にURL欄が書き換わる。

RewriteEngine on
RewriteRule ^/hoge/$ /fuga/ [R=301]

RewriteEngine on
RewriteRule ^/hoge/$ /fuga/ [R=302]

RewriteEngine on
RewriteRule ^/hoge/$ http://www.example.com/fuga/

最後の URL にリダイレクトさせるパターンは、同じサーバ内の URL であっても、飛び先を URL で記述するとブラウザのURL欄が書き換わります
同一サーバ内であれば、URLにリダイレクトさせると無駄にログも増えるのであまりオススメしません。


%2F問題

Apache1.X 系で mod_rewrite を使う場合、URLに「%2F」が含まれると思い通りに動作しない問題があります。
(Apache2.X 系でも同様ですが、Apache2.0.46 以降では「AllowEncodedSlashes On」により回避できます。)

例えば、以下のような書き換えを記述したとします。

RewriteEngine on
RewriteRule ^/keyword/(.*)$ /cgi-bin/script.cgi?k=$1

想定としては、
http://www.example.com/keyword/hogefuga というアクセスに対して
http://www.example.com/cgi-bin/script.cgi?k=hogefuga の結果を返します。

hogefuga の部分が色々と変化するわけです。

この際、
http://www.example.com/keyword/hogefuga/hage
http://www.example.com/cgi-bin/script.cgi?k=hogefuga/hage となりますが、

http://www.example.com/keyword/hogefuga%2Fhage
http://www.example.com/cgi-bin/script.cgi?k=hogefuga%2Fhage とならず、404エラーになります

直接、
http://www.example.com/cgi-bin/script.cgi?k=hogefuga%2Fhage にアクセスするとこの問題は起きません。

先にも書きましたが、Apache2.0.46 以降では httpd.conf に「AllowEncodedSlashes On」を記述することにより回避できます。
しかし、Apache1.X の環境ではなかなか回避できずにはまる要素だと思います。


アクセスを拒否する

どこかにリダイレクトするのではなく、特定のアクセスにエラーを返せます。

.htaccess へのアクセスを拒否する。

RewriteEngine On
RewriteRule .htaccess – [F]

/hoge/ 以下へのアクセスに 403 Forbidden を返します。

RewriteEngine On
RewriteRule ^/hoge/.* [F]

/hage/ 以下へのアクセスに 410 Gone を返します。

RewriteEngine On
RewriteRule ^/hage/.* [G]


複数の RewriteRule

RewriteRule は複数かけます。

/hoge/ 以下を /fuga/ 以下にリダイレクとした上に /fuga/hage/ 以下のものは /foo/ 以下にリダイレクトする。

RewriteEngine On
RewriteRule ^/hoge/(.*) /fuga/$1
RewriteRule ^/fuga/hage/(.*) /foo/$1

上の例で、/hoge/ 以下を /fuga/ 以下にリダイレクとさせた時点で処理を終わらせる、つまり次のリダイレクトを実行させないようにするには [L] を付加します

RewriteEngine On
RewriteRule ^/hoge/(.*) /fuga/$1 [L]
RewriteRule ^/fuga/hage/(.*) /foo/$1


RewriteRule のオプション

これ以外にもいろいろありますが。

HTTPステータスコードを吐く [R=ステータスコード]

RewriteEngine On
RewriteRule ^/hoge/(.*) /fuga/$1 [L,R=301]
RewriteRule ^/fuga/hage/(.*) /foo/$1

大文字、小文字を区別しない [NC]

RewriteEngine On
RewriteRule ^/hoge/(.*) /fuga/$1 [NC,L]
RewriteRule ^/fuga/hage/(.*) /foo/$1


ある条件が揃ったらリダイレクト

RewriteCond を使えば、ある条件に合致したときだけリダイレクトするということも、もちろん可能です。

HTTP_HOST が www.example.com だったら RewriteRule を適用する。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule ^/(.*) /$1

HTTP_HOST が www.example.com じゃなかったら RewriteRule を適用する。

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.example.com$
RewriteRule ^/(.*) /$1

HTTP_HOST が www.example.com で HTTP_USER_AGENT に MSIE が含まれていたら RewriteRule を適用する。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteCond %{HTTP_USER_AGENT} MSIE
RewriteRule ^/(.*) /$1

RewriteCond を複数並べると AND でつながっていく。OR にしたい場合は [OR] をつける

HTTP_HOST が www.example.com であるか、または HTTP_USER_AGENT に MSIE が含まれていたら RewriteRule を適用する。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com$ [OR]
RewriteCond %{HTTP_USER_AGENT} MSIE
RewriteRule ^/(.*) /$1

RewriteCond の条件で大文字、小文字を区別しない場合は [NC] をつける。

HTTP_USER_AGENT に MSIE や msie や MsIe や MSiE などが含まれていたら RewriteRule を適用する。

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} MSIE [NC]
RewriteRule ^/(.*) /$1

RewriteCond で対象となる変数には以下のようなものがあります。

HTTP_USER_AGENT / HTTP_REFERER / HTTP_COOKIE / HTTP_FORWARDED / HTTP_HOST / HTTP_PROXY_CONNECTION / HTTP_ACCEPT
REMOTE_ADDR / REMOTE_HOST / REMOTE_USER / REMOTE_IDENT / REQUEST_METHOD / SCRIPT_FILENAME / PATH_INFO / QUERY_STRING / AUTH_TYPE
DOCUMENT_ROOT / SERVER_ADMIN / SERVER_NAME / SERVER_ADDR / SERVER_PORT / SERVER_PROTOCOL / SERVER_SOFTWARE
TIME_YEAR / TIME_MON / TIME_DAY / TIME_HOUR / TIME_MIN / TIME_SEC / TIME_WDAY / TIME
API_VERSION / THE_REQUEST / REQUEST_URI / REQUEST_FILENAME / IS_SUBREQ

以上、かんたんな mod_rewrite サンプル集でした。

ここに挙げた機能だけでもいろいろ遊べますが、環境変数を設定したり、外部スクリプトを利用して書き換え処理をしたり、などといったもっと複雑な処理もmod_rewriteでは可能です。
いろいろ試してアーミーナイフの達人目指してください。

jQueryのanimateで自由にアニメーションできるようになろう | webOpixel

jQueryにはアニメーションをするための機能がいろいろとありますが、ここでは「animate」メソッドの扱い方をご紹介いたします。

動かす前の準備

jQueryの前に動かす要素をhtml&cssで作成しておきましょう。

html

1 <div id="box"></div>

css

1 #box {
2     width: 100px;
3     height: 100px;
4     background: #3399FF;
5 }

jQueryコードを書くときの基本的な形は次のようになります。

javascript

1 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
2 <script type="text/javascript">
3 $(function() {
4     //ここにjQueryのコードを書く
5 });
6 </script>

以降は「ここにjQueryのコードを書く」という部分にコードを書いていきます。

「animate」メソッドを使用した単純なアニメーション

最初はページが表示されたら右に「500px」スライドさせるだけのアニメーションです。

「animate」メソッドはこのように使います。

「animate」の基本的な書き方

ここでは作成した要素(#box)を右(margin-left)へ500xpスライドさせたいのでしたね。

これを先ほどの図にあてはめるとこうなります。

javascript

1 $('#box').animate({
2     'marginLeft': '500px'
3 });

これで実行するとスライドしているはずです。簡単ですよね。

ちなみにcssでプロパティは「margin-left」と「-(ハイフン)」で句切られていますが、「animate」メソッドでは単語間の最初の文字を大文字にするキャメルケースという書式で記述します。

なので「margin-left」は「marginLeft」と書きます。

ここでは「marginLeft」を使用しましたが「fontSize」でも「width」でも数値で指定するようなパラメータならほとんどのものはアニメーションできます。

親要素を基点とする

posirionの設定がないと要素を配置した位置を基点としてアニメーションされるので、複数の要素を操作したいときは不便なときがあります。

そこで、jQueryという話ではないですが、複数の要素を同じ基点で動かす方法をご紹介します。

boxを2つにしたら「div」で囲みます。

html

1 <div id="wrap">
2 <div id="box1"></div>
3 <div id="box2"></div>
4 </div>

親にを「position: relative」にして、子は「position: absolute」を指定しましょう。

css

01 #wrap {
02     position: relative;
03 }
04 #box2,
05 #box1 {
06     position: absolute;
07     width: 100px;
08     height: 100px;
09     background: #5EA9F4;
10 }

これで「#wrap」を基点として、「left」や「top」で移動できるようになります。

javascript

1 $('#box1').animate({
2     'left': '500px'
3 });
4 $('#box2').animate({
5     'left': '300px',
6     'top': '200px'
7 });

斜めに移動させる

斜めに移動させる

横にスライドさせるだけなら「left」を動かすだけでしたが、斜め下に移動する場合はどうしたら良いでしょうか?

はい。「left」と「top」を同時に動かせば良いですよね。

やり方は簡単ですプロパティと数値を1セットとして「,」で繋げていくだけです。

javascript

1 $('#box1').animate({
2     'left': '500px',
3     'top': '300px'
4 });

3つでも4つでもアニメーションさせたいパラメータをどんどん追加できます。

連続で移動させる

連続で移動させる

2つ指定すれば斜めに移動できることはわかったのですが、たとえば右に移動してから下に移動するといった処理はどうしたらいいでしょうか。

これはjQueryのメソッドチェーンという書き方をすれば簡単です。

javascript

1 $('#box1')
2     .animate({'left':'500px'})
3     .animate({'top':'500px'})
4     .animate({'left':'0px'})
5     .animate({'top':'0px'});

このようにすれば上から順番にアニメーションが実行されます。

速度を調節する

「animate」メソッドは第2引数以降でオプションの設定をすることができます。

アニメーション速度を変更するには、第2引数に「slow」「normal」「fast」の文字列を指定するか、直接数値で指定します。

javascript

1 $('#box1').animate({
2     'left': '500px'
3 }, 1500);

オプションは次のように記述することもできます。

javascript

1 $('#box1').animate({
2     'left': '500px'
3 },{
4     'duration': 1500
5 });

動きに変化をつける(イージングの設定)

そのままだと一定の動きしかしないのでつまらないですが、イージングの設定をすれば「徐々に速くなる」などアニメーションに変化をつけることができます。

標準では「linear」と「swing」の2種類しかありませんが、「jQuery Easing Plugin」などを導入することでバリエーションが増えます。

javascript

1 $('#box1').animate({
2     'left': '500px'
3 },{
4     'duration': 600,
5     'easing': 'linear'
6 });

アニメーションが終わったあとに何かする

アニメーションが終了したら何か処理を実行したいといったケースはよくあります。

そんなときは「complete」オプションに関数を設定してあげます。

javascript

1 $('#box1').animate({
2     'left': '500px'
3 },{
4     'duration': 600,
5     'complete': function(){
6         alert('終わりました');
7     }
8 });

以上です。まだオプションなどあったりしますが、これだけでもいろいろできるのではないのかと思います。

参考サイト Effects/API/jQuery