ラベル Amazon Web Service の投稿を表示しています。 すべての投稿を表示
ラベル Amazon Web Service の投稿を表示しています。 すべての投稿を表示

2016年5月11日水曜日

AWS EC2に日本語形態素解析システムMeCab(IPA辞書 + 新語辞書:mecab-ipadic-neologd)と日本語係り受け解析器J.DepPで日本語を処理する環境をつくる

LINE Bot API、Facebook Messenger Platform が公開されてIT業界は一気に Bot ブームですが、一番の特徴である「ユーザーとの会話をベースに様々なサービスを提供する」ことを実現するためには、少なからず日本語を解析する処理が必要になってきます。そこで今回は、AWS の EC2 に日本語を処理するための環境を構築します。

(mecab-ipadic-neologd をインストールする際にメモリに1.5G以上の空きがないとビルドが落ちてしまうため、EC2のSmall 以上のインスタンスで行ってください)

使用したインスタンスのイメージですが、『Amazon Linux AMI 2016.03.1 (HVM), SSD Volume Type - ami-29160d47』を使用しました。

管理者権限になる

インストールと設定は管理者権限で行いますので権限を取ります。
$sudo su -

MeCab - 日本語形態素解析システムのインストール

MeCabは、分かち書き(”私は日本人です” を ”私_は_日本人_です” と分解する)を行うためのものです。辞書には標準のIPA辞書に加えて、IPA辞書には含まれていない新しい単語(芸能人の名前やテレビ番組名など)に対応するために新語辞書 mecab-ipadic-neologd をインストールします。

MeCab:http://taku910.github.io/mecab/

まず、MeCab のインストールに必要なコンパイラなどのツールを準備します。既にインストール済みのものはスキップされますのでこのまま実行できます。
#yum install -y gcc-c++ gcc-objc++ gcc41-c++ make


次に MeCab をソースからビルドしてインストールします。文字コードですが、UTF-8以外は使う予定がないので --enable-utf8-only を指定しています(他のコードを含まないためビルド後のバイナリサイズが小さくなる。公式サイトのこちらの記述より)が、このオプションは外しても大丈夫です。あと、デフォルトのキャラセットを --with-charset オプションでUTF-8にしています。(指定しないとEUCが使用される)

#cd /usr/local/src
#wget https://mecab.googlecode.com/files/mecab-0.996.tar.gz
#tar zxfv mecab-0.996.tar.gz
#cd mecab-0.996
#./configure --enable-utf8-only --with-charset=utf8
#make
#make install

IPA辞書のインストール

MeCab が標準辞書として推奨しているIPA辞書を MeCab 同様にソースからビルドしてインストールします。MeCabに合わせて文字コードには、UTF-8を指定しています。
#cd /usr/local/src/
#wget https://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
#tar xvfz mecab-ipadic-2.7.0-20070801.tar.gz 
#cd mecab-ipadic-2.7.0-20070801
#./configure --with-mecab-config=/usr/local/bin/mecab-config --with-charset=utf8
#make
#make install 


インストールが正しく行われたかを動作確認します。この後にインストールする mecab-ipadic-neologd が出力する結果と比較するために、mecab-ipadic-neologd の公式サイトにあるサンプル文字列を使いました。番組名などが別の単語として扱われているのが分かります。

読みやすいようにコマンドを2行に分けていますが、実際は1行にして実行してください。
#echo "10日放送の「中居正広のミになる図書館」(テレビ朝日系)で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。" 
| mecab 

10      名詞,数,*,*,*,*,*
日      名詞,接尾,助数詞,*,*,*,日,ニチ,ニチ
放送    名詞,サ変接続,*,*,*,*,放送,ホウソウ,ホーソー
の      助詞,連体化,*,*,*,*,の,ノ,ノ
「      記号,括弧開,*,*,*,*,「,「,「
中居    名詞,固有名詞,人名,姓,*,*,中居,ナカイ,ナカイ
正広    名詞,固有名詞,人名,名,*,*,正広,マサヒロ,マサヒロ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
ミ      名詞,一般,*,*,*,*,ミ,ミ,ミ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
なる    動詞,自立,*,*,五段・ラ行,基本形,なる,ナル,ナル
図書館  名詞,一般,*,*,*,*,図書館,トショカン,トショカン
」      記号,括弧閉,*,*,*,*,」,」,」
(      記号,括弧開,*,*,*,*,(,(,(
テレビ朝日      名詞,固有名詞,組織,*,*,*,テレビ朝日,テレビアサヒ,テレビアサヒ
系      名詞,接尾,一般,*,*,*,系,ケイ,ケイ
)      記号,括弧閉,*,*,*,*,),),)
で      助詞,格助詞,一般,*,*,*,で,デ,デ
、      記号,読点,*,*,*,*,、,、,、
SMAP    名詞,固有名詞,組織,*,*,*,*
の      助詞,連体化,*,*,*,*,の,ノ,ノ
中居    名詞,固有名詞,人名,姓,*,*,中居,ナカイ,ナカイ
正広    名詞,固有名詞,人名,名,*,*,正広,マサヒロ,マサヒロ
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
、      記号,読点,*,*,*,*,、,、,、
篠原    名詞,固有名詞,人名,姓,*,*,篠原,シノハラ,シノハラ
信一    名詞,固有名詞,人名,名,*,*,信一,シンイチ,シンイチ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
過去    名詞,副詞可能,*,*,*,*,過去,カコ,カコ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
勘違い  名詞,サ変接続,*,*,*,*,勘違い,カンチガイ,カンチガイ
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
明かす  動詞,自立,*,*,五段・サ行,基本形,明かす,アカス,アカス
一幕    名詞,一般,*,*,*,*,一幕,ヒトマク,ヒトマク
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
あっ    動詞,自立,*,*,五段・ラ行,連用タ接続,ある,アッ,アッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。

新語辞書 mecab-ipadic-neologd のインストール

この新語辞書 mecab-ipadic-neologd をインストールすることで、IPA辞書には含まれていない新しい単語に対応することができるようになります。例えば、「Apple Watch」は、IPA辞書だと「Apple」と「Watch」という2つの単語として処理されますが、mecab-ipadic-neologd を使うことで「Apple Watch」という1つの名詞として扱われるようになります。いや、ほんとに素晴らしい辞書です。

mecab-ipadic-neologd:http://diary.overlasting.net/2015-03-13-1.html

mecab-ipadic-neologd のインストールに必要なツールを準備します。既にインストール済みのものはスキップされますのでこのまま実行できます。

#yum install git patch


IPA辞書同様に mecab-ipadic-neologd をビルドしてインストールします。
#cd /usr/local/src/
#mkdir neologd
#cd neologd
#git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
#cd mecab-ipadic-neologd
#./bin/install-mecab-ipadic-neologd -n


インストールの最後にIPA辞書との比較が表示され、インストールをするかの確認がされますので「yes」を入力します。

〜略〜

default system dictionary         |     mecab-ipadic-NEologd
陸奥 守 吉行                      |     陸奥守吉行
アクリル 樹脂                     |     アクリル樹脂
敷居 が 高い                      |     敷居が高い
ゲス の 極み 乙女 。              |     ゲスの極み乙女。
真木 蔵人                         |     真木蔵人
恋 の かけ ら                     |     恋のかけら
金 スマ                           |     金スマ
マイク 真木                       |     マイク真木
南越谷 駅                         |     南越谷駅

[test-mecab-ipadic-NEologd] : Finish..

[install-mecab-ipadic-NEologd] : Please check the list of differences in the upper part.

[install-mecab-ipadic-NEologd] : Do you want to install mecab-ipadic-NEologd? Type yes or no.
yes 


インストールが正しく行われたかを動作確認します。MeCab の -d パラメータで辞書を mecab-ipadic-neologd に指定しています。先ほどとは異なり、番組名などが1つの単語として扱われるようになりました。mecab-ipadic-neologd すごい。

読みやすいようにコマンドを2行に分けていますが、実際は1行にして実行してください。
#echo "10日放送の「中居正広のミになる図書館」(テレビ朝日系)で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。"
 | mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd

10日    名詞,固有名詞,一般,*,*,*,10日,トオカ,トオカ
放送    名詞,サ変接続,*,*,*,*,放送,ホウソウ,ホーソー
の      助詞,連体化,*,*,*,*,の,ノ,ノ
「      記号,括弧開,*,*,*,*,「,「,「
中居正広のミになる図書館        名詞,固有名詞,一般,*,*,*,中居正広のミになる図書館,ナカイマサヒロノミニナルトショカン,ナカイマサヒロノミニナルトショカン
」      記号,括弧閉,*,*,*,*,」,」,」
(      記号,括弧開,*,*,*,*,(,(,(
テレビ朝日      名詞,固有名詞,組織,*,*,*,テレビ朝日,テレビアサヒ,テレビアサヒ
系      名詞,接尾,一般,*,*,*,系,ケイ,ケイ
)      記号,括弧閉,*,*,*,*,),),)
で      助詞,格助詞,一般,*,*,*,で,デ,デ
、      記号,読点,*,*,*,*,、,、,、
SMAP    名詞,固有名詞,人名,一般,*,*,SMAP,スマップ,スマップ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
中居正広        名詞,固有名詞,人名,一般,*,*,中居正広,ナカイマサヒロ,ナカイマサヒロ
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
、      記号,読点,*,*,*,*,、,、,、
篠原信一        名詞,固有名詞,人名,一般,*,*,篠原信一,シノハラシンイチ,シノハラシンイチ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
過去    名詞,副詞可能,*,*,*,*,過去,カコ,カコ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
勘違い  名詞,サ変接続,*,*,*,*,勘違い,カンチガイ,カンチガイ
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
明かす  動詞,自立,*,*,五段・サ行,基本形,明かす,アカス,アカス
一幕    名詞,一般,*,*,*,*,一幕,ヒトマク,ヒトマク
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
あっ    動詞,自立,*,*,五段・ラ行,連用タ接続,ある,アッ,アッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。



J.depP - 日本語係り受け解析器のインストール

MeCab で単語ごとに分かち書きを行えるようになりましたが、このままだと単語同士の関連がつかめないため、その係り受けを解析するためのソフトウェアが J.depP です。係り受の解析は、CaboCha が有名ですが、この記事を書いている時点では、J.depP の方も一度試してみようということで選択しています。

ソースからビルドしてインストールします。--with-postagger で mecab を指定、辞書は --with-mecab-dict でIPA(その他にJUMAN、NAIST-J、UNIが指定可能)を指定しています。

#cd /usr/local/src/
#wget http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/jdepp/jdepp-latest.tar.gz
#tar xzf jdepp-latest.tar.gz 
#cd jdepp-2015-10-05/
#./configure --with-postagger=mecab --with-mecab-dict=IPA
#make model
#make install 

ビルド中に warnning などが表示されますが、そのまま通っていきます。最後にインストールが正しく行われたかを動作確認します。

読みやすいようにコマンドを3行に分けていますが、実際は1行にして実行してください。
#echo "10日放送の「中居正広のミになる図書館」(テレビ朝日系)で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。" 
| mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd 
| jdepp 

(input: STDIN [-I 0])
# S-ID: 1; J.DepP
* 0 1D
10日    名詞,固有名詞,一般,*,*,*,10日,トオカ,トオカ
放送    名詞,サ変接続,*,*,*,*,放送,ホウソウ,ホーソー
の      助詞,連体化,*,*,*,*,の,ノ,ノ
* 1 9D
「      記号,括弧開,*,*,*,*,「,「,「
中居正広のミになる図書館        名詞,固有名詞,一般,*,*,*,中居正広のミになる図書館,ナカイマサヒロノミニナルトショカン,ナカイマサヒロノミニナルトショカン
」      記号,括弧閉,*,*,*,*,」,」,」
(      記号,括弧開,*,*,*,*,(,(,(
テレビ朝日      名詞,固有名詞,組織,*,*,*,テレビ朝日,テレビアサヒ,テレビアサヒ
系      名詞,接尾,一般,*,*,*,系,ケイ,ケイ
)      記号,括弧閉,*,*,*,*,),),)
で      助詞,格助詞,一般,*,*,*,で,デ,デ
、      記号,読点,*,*,*,*,、,、,、
* 2 3D
SMAP    名詞,固有名詞,人名,一般,*,*,SMAP,スマップ,スマップ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
* 3 9D
中居正広        名詞,固有名詞,人名,一般,*,*,中居正広,ナカイマサヒロ,ナカイマサヒロ
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
、      記号,読点,*,*,*,*,、,、,、
* 4 5D
篠原信一        名詞,固有名詞,人名,一般,*,*,篠原信一,シノハラシンイチ,シノハラシンイチ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
* 5 6D
過去    名詞,副詞可能,*,*,*,*,過去,カコ,カコ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
* 6 7D
勘違い  名詞,サ変接続,*,*,*,*,勘違い,カンチガイ,カンチガイ
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
* 7 8D
明かす  動詞,自立,*,*,五段・サ行,基本形,明かす,アカス,アカス
* 8 9D
一幕    名詞,一般,*,*,*,*,一幕,ヒトマク,ヒトマク
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
* 9 -1D
あっ    動詞,自立,*,*,五段・ラ行,連用タ接続,ある,アッ,アッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。    


こうしたベースの環境もいずれはクラウドなどで提供されるでしょうし、既に形態素解析や日本語を受けて日本語の返答を返すチャットBot APIなども登場していますが、独自のロジックを組みたいというニーズも少なからずあると思いますので、そのようなケースにおいて環境構築に費やす時間が少しでも削減されれば幸いです。


2013年10月28日月曜日

にいがた産業創造機構主催 クラウドアプリ開発セミナー

クラウドアプリ開発セミナー(にいがた産業創造機構:NICO 主催)での事例発表とパネルディスカッションため新潟市に行ってきました。

























今回の事例ではデータは全てサーバー上にあってパソコンやスマートフォン、タブレットといったマルチデバイスからのアクセスに対応していて、システムの稼働環境がAWS(Amazon Web  Services)を活用しているので、そうした点でもってクラウドアプリと呼んでいます。

参加者の層が幅広かったので、経営者の方向けにはAWSを導入するとどんないいことがあるのかということについて、技術者の方向けにはシステムで使っている各種技術について軽くお話をしました。

短い時間でしたので少し話足りない感が残りましたが、細かなお話は来年あらためて場を設けてやろうということになったので、そこでタップリお話したいなと思っています。


今回事例発表されたクラウドアプリが画期的なものかというとそうではないですが、取り組みの主旨は新潟のIT技術を向上させるために何か具体的なテーマをもってクラウドアプリを作ろうというところなので、(僕がプロジェクトに加わる前も、そして加わったあとも)いくつかのヤマを超えてきてリリースまで持ってこれたというところに、まずは評価をいただけたと感じています。

新潟のIT技術向上なのに三重の会社がやってちゃ意味ないじゃん。という話なんですが、IT技術の向上といってもやり方はいろいろあるので、社内でゼロからやるには予算も時間も取れないので、ひとり経験のある人を加えて一緒に進めながらポイントを掴んでいこうという考え方がひとつ。あと、手段としてIT技術を考えて、技術による勝負じゃなくてノウハウやニーズを使える形に落とし込むための企画力やデザイン力を向上させていこうというのもひとつです。後者の場合は、極論をいえば発注先はどこでもよくて海外の安いリソース活用も可能になってきます。

このプロジェクトを機に他にもIT技術向上のための広がりが出てきているので、これからも継続してご協力できたらなと思っています。

2013年3月25日月曜日

AWS管理画面へのログインに二段階認証(Multi-Factor Authentication)を導入する

AWSの様々な操作ができるマネジメントコンソールはとても便利です。しかし、もし万が一、不正アクセスを受けてしまうと取り返しのつかない状況になってしまいます。

デフォルトでは、メールアドレスとパスワードによる認証になっていますが、MFAというスマートフォンなどのデバイスとAWSを連動させて二段階の認証を行う方法に変更することで、セキュリティを高めることができます。

ただ、その連携させたデバイスが壊れてしまったり、紛失してしまったりすると、自身もログインができなくなってしまいます。いくら堅牢とはいえ、これは少し気がかりですので、本記事ではこの問題への対応策も合わせて記載しています。


※ご注意※
二段階認証の設定は、ミスをしてしまうとAWSにログインできなくなってしまう可能性があります。またこの方法が、他の環境でも同じようにうまくいくのかの確認はとっていません。設定はすべて自己責任でお願いします。


デバイスの準備

本記事は、iPhone あるいは iPod Touch を前提に記載しています。正確には、iPhoneアプリとして配布されている Google Authenticator を認証キー(6桁の数字)の表示に使います。Android版もあるようなので、本記事の方法で設定できる可能性はありますが、確認はとれていません。

Apple Store から、Google Authenticator をダウンロードして、インストールしてください。(こちらから


AWSマネジメントコンソールでMulti-Factor Authenticationを設定

二段階認証の設定は、AWS Multi-Factor Authentication(http://aws.amazon.com/jp/mfa/)により行います。通常のログイン方法で管理コンソールにアクセスして、IAMの画面に進みます。


IAMの画面の Security Status に Root Account MFA という箇所があります。ここが、Disabled となっていると思います。これは、二段階認証にはなっていないことを意味しています。


1.設定を行うために Manage MFA Device をクリックします。




























2.二段階認証のためのデバイスを選択します。ここでは、専用のハードウェアではなく、スマートフォンを使いますので、A virtual MFA device を選択して、continue をクリックします。













3.次にスマートフォンへ認証キーを表示するためのアプリケーションをインストールするようにメッセージが表示されますが、先にインストールしていますので、continue をクリックします。












4.デバイスと連携させるためのシークレットキーがQRコードで表示されています。ここで、

 Hide secret configuration key を押して、シークレットキーを表示させ、メモをとって大切に保管してください。

これがデバイスを失った時に必要な情報になります。


























メモをとったら、Click here to enable your device をクリックします。



5.次に、iPhone にインストールした Google Authenticator を起動します。右下のプラスアイコンを押すと、トークンを追加する画面になります。アカウントとキーを入力する欄がありますが、QRコードから読み取るボタンを押せば入力は不要です。コードが読めないなど、手入力するときは、アカウントにAWSにログインする時に使っているメールアドレス、キーに先ほどメモをしたシークレットキーを入力してください。






















6.登録を完了すると、画面に六桁の数字が表示されるようになります。この数字は、一定時間が経過する毎に変わっていくと思います。これが二段階認証で使う認証キーです。





















7.これで準備は整いましたので、この認証キーを二つ使ってAWSとデバイスを連携させます。まず、いままさに表示されている認証6桁の数字を 認証コード#1 欄に入力します。その後、しばらく待って次の6桁の数字が表示されたら、その数字を 認証コード#2 欄に入力して、認証デバイスをアクティベートをクリックします。

















8.入力値に問題がなければ、AWSとデバイスが連携されます。











デバイス喪失への備え

1.ここからは、いざというときの備えになります。冒頭で書きましたが、デバイスの喪失への対応として、ウェブ版の Google Authenticator を準備します。Git からファイルがダウンロードできますので、 こちらから Git にアクセスしてZIPをクリックしてください。






















2.ダウンロードしたアーカイブを解凍すると、展開されたフォルダに index.html があります。それをブラウザで表示してください。ウェブサーバーにあげる必要はありません。ローカルでそのまま実行できます。iPhone版のGoogle Authenticator と同じようにトークンが追加できます。左上のプラスボタンを押してください。



3.iPhone と同様にアカウントのメールアドレスとセキュリティキーを入力して、Add を押します。




















デバイスとブラウザで同じ数字が表示されていれば、正常に登録できています。なお、このウェブ版 Google Authenticator は、デバイスに問題が出た場合への備えですので、普段はセキュリティキーと共に安全な場所に保管しておいてください。

2013年1月22日火曜日

AWS SDK2 for PHPを使ってS3にファイルをアップロードする

EC2にアップロードしたファイルをPHPで受け取ってS3で保存する方法として、s3fsを使ってS3をマウントして使う方法を前に書きました(記事はこちら)が、AWSテクニカルエバンジェリストの堀内さんにこの件についてお聞きしたところ、

「s3fsとかありますけどあんまりお勧めしないですね。動いてたらいいですけど・・・いろんな人の話を総合するとあんまりよくないですね。AWSのAPI経由でS3に保存して、URLで直接S3から表示する方がいいですね。」

という感じで、EC2+PHPからS3を利用するための方向性についてアドバイスをもらったので、実際にそのAWSのAPI(SDK2 for PHP)を使ったS3へのファイル転送を試した結果をまとめてみました。


使用したインスタンスのイメージですが、『Basic 32-bit Amazon Linux AMI 2011.02.1 Beta (AMI Id: ami-300ca731)』を使用しました。また、Amazon EC2 (Amazon Linux) での ApacheとPHP  インストールと設定が設定されている状態から行っています。

管理者になる

AWS SDK for PHPのインストール及び設定はPEARを使います。管理者権限で行いますので権限を取ります。
$sudo su -

PEARのアップデートとAWS SDK for PHPのインストール

本環境のPEARでは途中インストールが中断しましたので、まずはPEAR自体をアップグレードします。
#pear upgrade pear

次にSDKのインストールに必要なチャネルを登録します。
#pear channel-discover pear.amazonwebservices.com
#pear channel-discover guzzlephp.org/pear
#pear channel-discover pear.symfony.com

最後にSDKをインストールします。
#pear install aws/sdk

アップロードされたファイルをEC2からAPI経由でS3に転送するPHPのコード

ブラウザのフォームからPOSTされてくる写真などのファイルをS3に転送するPHPのプログラムコードです。

まず、APIを利用するために必要となる環境を定義します。
<?php

// SDKの読み込み
require 'AWSSDKforPHP/aws.phar';

// 利用クラスの定義
use Aws\Common\Aws;
use Aws\Common\Enum\Region;
use Aws\S3\Enum\CannedAcl;
use Aws\S3\Exception\S3Exception;
use Guzzle\Http\EntityBody;


class FileUploader extends Application
{
(以下省略)

以下は実際のアップロードのためのコードです。赤字部分を適宜修正してください。
function upload()
{
    try {
   
        // S3を操作するためのオブジェクトを生成(リージョンは東京)
        $s3 = Aws::factory(array('key' => 'AccessKey',
                                 'secret' => 'SecretKey',
                                 'region' => Region::AP_NORTHEAST_1))->get('s3');
   
        $tempFileName = $_FILES['file']['tmp_name'];
        $tempFileType = $_FILES['file']["type"];

        $response = $s3->putObject(array('Bucket' => 'BucketName',
                                         'Key'    => 'Directory/FileName',
                                         'Body' => EntityBody::factory(fopen($tempFileName, 'r')),
                                         'ContentType' => $tempFileType,
                                         'StorageClass' => 'STANDARD',
                                         'ServerSideEncryption' => 'AES256',
                                         'ACL' => CannedAcl::PUBLIC_READ));

    } catch (S3Exception $e) {
    }

S3を操作するオブジェクトを生成する際のパラメータは次の通りです。
key
アカウントのセキュリティ証明書ページに表示されているアクセスキーIDを指定します。
secret
アカウントのセキュリティ証明書ページのシークレットアクセスキーにある「表示」をクリックすると表示されるキーを指定します
region
リージョンを指定します。(設定値について

ファイルをS3に転送する際のパラメーターは次の通りです。
Bucket
S3に作成されている保存先のバケット名を指定します。
Key
S3に保存する際のファイル名です。ディレクトも含めて記載します。指定されたディレクトリが無い場合は自動的に作成されます。
Body
S3に転送するファイルのパスを指定します。
ContentType
ファイルのContentTypeを指定します。
StorageClass
S3への保存の仕方です。STANDARD、REDUCED_REDUNDANCYがあります。(後者は永続性が低下する代わりに保存料金が安くなります。)
ServerSideEncryption
暗号化して保存する場合に指定します。暗号化しない場合は省略します。
ACL
S3に転送後のファイルの操作権限を指定します。(設定値について

アップロードされたファイルは、例えば画像なら、http://s3-ap-northeast-1.amazonaws.com/BucketName/Directory/FileNameのようにS3から直接表示できます。料金もEC2経由で表示するのとほぼ変わりません。

なお、内部資料などのようにネット上に公開しないファイルの場合は、ACLをPRIVATE_ACCESSなどに設定して、EC2からAPI経由でS3のオブジェクトを取り出して返すことになります。


2012年12月21日金曜日

Amazon EC2 (Amazon Linux) で 自動的にスナップショットを別のリージョンにコピー


EBSスナップショットのリージョン間コピーができるようになりました(2012年12月18日付)。

以前、自動でスナップショットを取る方法(こちらの記事)について書きましたが、本記事は、そのスナップショットを自動で別のリージョンにコピーして世代管理するための設定です。シェルでamazon-api-toolsを呼び出していますのでプログラム環境は不要です。ここでは、cronの日時処理として設定しています。

使用したインスタンスのイメージですが、『Basic 32-bit Amazon Linux AMI 2011.02.1 Beta (AMI Id: ami-300ca731)』を使用しました。


管理者になる
設定は管理者権限で行いますので権限を取ります。
$sudo su -

EC2-Api-Toolsのアップデート

Amazon Linux AMIからインスタンスを作成した場合は、API Toolsが標準でインストールされていますが、リージョン間コピーのためのコマンド EC2-copy-snapshot が含まれていない場合は、最新のAPIにアップデートする必要があります。次のコマンドで EC2-copy-snapshot の存在を確認します。何も表示されなければアップデートが必要です。
#find / -name ec2-copy-snapshot

最新のAPIをダウンロードして解凍します。
#cd /usr/local/src
#wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip
#unzip ec2-api-tools 

EC2-Api-Toolsは、/opt/aws/apitools に実ファイルが展開されていて、そこに対してシンボリックリンクが張られています(下記の赤字部分)。
#ls /opt/aws/apitools/ -al
total 36
drwxr-xr-x 9 root root 4096 Dec 21 01:56 .
drwxr-xr-x 5 root root 4096 Feb 24  2011 ..
lrwxrwxrwx 1 root root   13 Feb 24  2011 as -> ./as-1.0.33.1
drwxr-xr-x 4 root root 4096 Feb 24  2011 as-1.0.33.1
lrwxrwxrwx 1 root root   15 Feb 24  2011 ec2 -> ./ec2-1.3.62308
drwxr-xr-x 4 root root 4096 Feb 24  2011 ec2-1.3.62308
lrwxrwxrwx 1 root root   14 Feb 24  2011 elb -> ./elb-1.0.10.0
drwxr-xr-x 4 root root 4096 Feb 24  2011 elb-1.0.10.0
lrwxrwxrwx 1 root root   11 Feb 24  2011 iam -> ./iam-1.2.0
drwxr-xr-x 4 root root 4096 Feb 24  2011 iam-1.2.0
lrwxrwxrwx 1 root root   13 Feb 24  2011 mon -> ./mon-1.0.9.5
drwxr-xr-x 4 root root 4096 Feb 24  2011 mon-1.0.9.5
lrwxrwxrwx 1 root root   13 Feb 24  2011 rds -> ./rds-1.3.003
drwxr-xr-x 4 root root 4096 Feb 24  2011 rds-1.3.003
lrwxrwxrwx 1 root root   14 Dec 21 01:55 ses -> ses-2012.07.09
drwxr-xr-x 3 root root 4096 Dec 21 01:55 ses-2012.07.09

ですので、この /opt/aws/apitools ディレクトリに先ほど解凍した最新のAPIを持ってきます。(バージョンは適宜読み替えてください
#mv ec2-api-tools-1.6.6.0 /opt/aws/apitools/

次にシンボリックリンクの張り直しをします。また、新たなコマンドについては、実行用シンボリックリンクを /opt/aws/bin ディレクトリに作成する必要があります。
#cd /opt/aws/apitools/
#rm ec2
#ln -s ec2-api-tools-1.6.6.0/ ec2

#cd /opt/aws/bin/
#ln -s ../apitools/ec2/bin/ec2-copy-snapshot ec2-copy-snapshot

シェルファイルの作成

JAVA_HOMEとEC2_HOMEの設定値を確認後、リージョン間コピー用シェルファイルを作成します。赤字部分を環境に合わせて変更してください。コピー先のリージョンは COPY_TO_REGION で指定します。サンプルはシンガポールへのコピーです。
#echo $JAVA_HOME
/usr/lib/jvm/jre

#echo $EC2_HOME
/opt/aws/apitools/ec2

#vi /etc/cron.daily/copy_snapshot
#!/bin/sh

export JAVA_HOME=/usr/lib/jvm/jre
export EC2_HOME=/opt/aws/apitools/ec2
export PATH=${PATH}:/bin:/usr/bin:${EC2_HOME}/bin
AWS_PRIVATE_KEY=/home/ec2-user/.aws/pk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pem
AWS_CERTIFICATE=/home/ec2-user/.aws/cert-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pem
AWS_REGION=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/[a-z]$//'`

COPY_TO_REGION="ap-southeast-1"
SNAPSHOT_DESCRIPTION="Daily Backup"
SNAPSHOT_GENERATION=1

# Delete Snapshots On Another Region.
SNAPSHOTS=`ec2-describe-snapshots --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${COPY_TO_REGION} | grep "${SNAPSHOT_DESCRIPTION}" | sort -k5 -r | awk '{print $2}'`

COUNT=1
for SNAPSHOT in ${SNAPSHOTS}; do
  if [ ${COUNT} -ge ${SNAPSHOT_GENERATION} ]; then
    echo "deleting ${SNAPSHOT}";
    ec2-delete-snapshot --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${COPY_TO_REGION} ${SNAPSHOT}
  fi
  COUNT=`expr ${COUNT} + 1`
done

# Copy A Latest Snapshot To Another Region.
SNAPSHOTS=`ec2-describe-snapshots --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${AWS_REGION} | grep "${SNAPSHOT_DESCRIPTION}" | sort -k5 -r | awk '{print $2}'`

for SNAPSHOT in ${SNAPSHOTS}; do
  echo "copying ${SNAPSHOT}";
  ec2-copy-snapshot --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --description "${SNAPSHOT_DESCRIPTION}" --region ${COPY_TO_REGION} -r ${AWS_REGION} -s ${SNAPSHOT}
  break
done 

指定された世代を超えたファイルを削除するための判定ですが、日付とディスクリプションで判定しています。

ディスクリプションを指定しているのは、上記ファイルをhourly, monthlyと作り、それぞれ別のディスクリプションを指定することで、1時間毎の最新のバックアップを6世代とりつつ、月次のバックアップを12世代 残していくといった周期の違うスナップショットを保持できるようにするためです。

最後に実行権限を付与して、動作確認をします。問題がなければ別リージョン上にスナップショットがコピーされます。なお、シェルでのコピーが完了しても別リージョン上に表示されるまではタイムラグがあります。
#chmod 755 /etc/cron.daily/copy_snapshot
#/etc/cron.daily/copy_snapshot 


[2013.01.15追記]
利用料金ですが、ざっくりいうと転送元のS3のoutにかかる料金と、転送先の保存容量にかかる料金が一番大きなウェイトを占めるのではないかと思います。S3のoutは東京リージョンだと1Gあたり約0.2ドルです。仮に1ドル90円でスナップショットのサイズを5GByteとすると、毎日転送に90円ずつ、一ヶ月で2700円かかるという計算になります。


2012年9月3日月曜日

Amazon EC2 (Amazon Linux) で CSRファイルを作成

SSL証明書取得のために必要なCSRファイルを作成します。Amazon EC2 (Amazon Linux) での ApacheとPHP  インストールと設定を完了させたうえでの設定です。

管理者権限になる

インストールと設定は管理者権限で行いますので権限を取ります。
$sudo su -

作業用ディレクトリの作成

作業用のディレクトリを作成します。
#mkdir /home/domains/www.dummydomain.com/ssl
#cd /home/domains/www.dummydomain.com/ssl

プライベートキーの作成

プライベートキーを作成します。今回は、パスワード無し(-des3オプションを付けない)で作成しました。2048の部分は証明書発行機関により値が異なります。
#openssl genrsa -out dummydomain.com.key 2048

CSRの作成

CSRを作成します。ファイル形式はPEMです。
#openssl req -new -key dummydomain.com.key -out dummydomain.com.csr

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Mie
Locality Name (eg, city) [Default City]:Tsu
Organization Name (eg, company) [Default Company Ltd]:Genies Inc.
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www.dummydomain.com
Email Address []:admin@dummydomain.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

作成されたCSRファイルの赤字の範囲が、証明書の発行を依頼する際に必要となるCSRになります。
#vi /dummydomain.com.csr
-----BEGIN CERTIFICATE REQUEST-----
(省略)
-----END CERTIFICATE REQUEST-----

2012年5月21日月曜日

Amazon EC2のmicroインスタンスが起動しない問題

2012年4月に作成したEC2のmicroインスタンス。当時は稼働していたのですが、しばらく使う予定がなかったのでstopして放置すること1ヶ月ほど。久しぶりに起動してみるとStatus Checkが通らずにうまく起動しない・・・。

Management Consoleからシステムログを見てみると、以下のようなメッセージが出ていました。

Map 2009 (98cc1a, ...) at 0x27ec2000 failed: -22.


あれこれ試しているうちにSnapshotからAMIを作成してsmallインスタンスで起動するとStatus Checkをパスすることが判明。しかし、根本の原因は掴めず。他にもAWSのフォーラムを調べて解決策(というか、対応策)を見つけました。
https://forums.aws.amazon.com/message.jspa?messageID=343358


カーネルをaki-d209a2d3からaki-fc08a3fdに変更することで動くようになると。確かにやってみるとsmallインスタンスでStatus Check通ります。ただ、(作成は随分前になりますが)同じイメージから作って同様に放置状態だった別のインスタンスは、この問題が出ずに起動するんですよね・・・。



2012年4月18日水曜日

Amazon EC2 (Amazon Linux) のpostfixadmin環境下で空メール受信処理をする

postfixadminによるバーチャルドメイン環境下で、メール受信時にプログラムを起動するための設定です。メール環境の構築ですが、


に記載している「メール環境構築」手順により設定された環境をもとにした設定になっています。

空メールの受信についての概要ですが、「reg_***@dummy.com」「del_***@dummy.com」のようにユーザー名部分の内容で登録や削除といった制御することを想定しています。いちいちアドレスを用意する必要はなく、受信したメールを実在するdata@dummy.comのような処理用のアドレスに転送した後、プログラムを起動して、プログラム内で宛先のアドレス(to:)により処理を分岐するイメージです。

管理者になる

設定は管理者権限で行いますので権限を取ります。
$sudo su -

main.cfの編集

アドレス転送、プログラム起動のためのファイルを定義します。
#vi /etc/postfix/main.cf
修正
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf, regexp:/etc/postfix/virtual
処理用の実在アドレスへの転送設定のためのファイルです。赤字部分を追加します。カンマをお忘れなく。
追加
transport_maps = regexp:/etc/postfix/transport
プログラム起動のための記載をするファイルです。

virtualの設定

「reg_***@dummy.com」「del_***@dummy.com」といったアドレス宛てのメールを処理用の「data@dummy.com」に転送するための設定です。「data@dummy.com」はpostfixadminであらかじめ作成しておいてください。

#vi /etc/postfix/virtual
追加
/^(reg_[^\@]+)\@dummy\.com$/ data@dummy.com
ここではreg_のみ記載していますが、必要な分だけ行を追加してください。マッチングには正規表現が利用できます。

transportの設定

プログラムを起動するための設定をします。実際のプログラムへのパスは後ほど設定します。
#vi /etc/postfix/transport
追加
/^data\@dummy\.com/ email
data@dummy.com宛のメールをemailグループとして処理といった意味です。

master.cfの設定

プログラムを起動するための設定をします。実際のプログラムへのパスは後ほど設定します。
#vi /etc/postfix/master.cf
追加
email unix - n n - - pipe flags= user=nobody argv=/usr/bin/php /home/domains/www.dummy.com/email.php
先ほど設定したemailグループが実際に起動するプログラムを記載します。

設定を反映

postfixに設定を反映します。
/usr/sbin/postmap /etc/postfix/virtual
/usr/sbin/postmap /etc/postfix/transport
service postfix restart


これで、受信時にプログラムを起動することができます。メールのデータは標準入力に入ってきます。
Related Posts Plugin for WordPress, Blogger...