botoの設定ファイルについて

AWSを使うには、アクセスキーとシークレットキーが必需品なのですが
それの設定方法が3パターンあったので、まとめます。



1. プログラム中に書く
コネクション取得の引数に、シークレットキーとアクセスキーを書きます。
S3に接続する場合の記述例。

 >>> from boto.s3.connection impport S3Connection
 >>> conn = S3Connection('アクセスキー', 'シークレットキー')



2. 環境変数に設定
環境変数AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEYに
あらかじめ値をセットしておけば、プログラム中に記述する必要がなくなります。

(例)

export AWS_ACCESS_KEY_ID="アクセスキー"
export AWS_SECRET_ACCESS_KEY="シークレットキー" 

環境変数で指定した場合の、接続は以下のようにできます。

>>> from boto.s3.connection impport S3Connection
>>> conn = S3Connection()



3. botoのconfigファイルに設定
botoのconfigファイルはini形式で記述できます。
起動時にbotoライブラリは次の順序で設定ファイルを探します。


1. /etc/boto.cfg  ・・・  マシーンを使うすべてのユーザの設定
2. ~/.boto        ・・・  ユーザ固有の設定



自分一人で使ってるPCだったら、どちらに書いてもOK.
複数ユーザで使う場合だったら、~/.botoに書いておいたほうがいいですね。


設定ファイル中は以下のように書きます。

[Credentials]
aws_access_key_id = アクセスキー
aws_secret_access_key = シークレットキー

アクセスキーとシークレットキーは、ダブルコーテーションで囲むとエラーになりますの、そのまま文字列を書けばよし。
[]で囲まれた箇所は設定ファイルのヘッダで、これがないとエラーで怒られます。
コメントアウトする場合は#でいいようです。


設定ファイルには、キー以外にプロキシの設定なども出来るようです。
wikiの下のほうに記述例が書いて有ります。


設定ファイルには、使うリージョンなどの設定も書けるようなのですが、
そこは、またおいおい調べていきます。

S3では、このリージョン、SDBでは、このリージョンを使う、とういう書き方ができそうな予感。

botoを使う準備

PythonAWSを操作するにはbotoというライブラリを使うのがよい、ということで
まずはbotoを使う準備です。


Pythonを使い始めたばかりなので、まずライブラリ管理ツールのeasy_installをセットアップ。
easy_installはRubyでいうRubyGemsのようなもの、とのこと。

以下のページを参考させていただき、セットアップしました。


easy_installが激しく便利


次は、botoのインストール。

sudo easy_install boto

これで
import boto
すればbotoのライブラリが使えるようになります。


ちなみに、eggファイルなどがインストールされる場所はmacだと
/Library/Python/*.*/site-packages 配下でした。(*.*はPythonのバージョンが入ります)



eggファイルって何?って思ったので、ついでに調べる。
以下のページから引用。

http://nagosui.org/windaround/Docs/tutorial/managing-projects-with-zcbuildout/packages-products-and-eggs

pythonパッケージを作成し配布する方法の一つです。

とのこと。Rubyのgemみたいな感じですかね。



pythonにライブラリをインストールする方法はいくつかあるみたいなのですが
そこらへんは、おいおい深く追うことにします。



そして、インストールが済んだので、次からbotoの使い方をぼちぼちやっていきます。

botoのページたち
GitHub - boto/boto: For the latest version of boto, see https://github.com/boto/boto3 -- Python interface to Amazon Web Services
boto: A Python interface to Amazon Web Services — boto v2.49.0

amazon HPC Nightに行ってきました

7月4日(月) amazon HPC NIGHTに行ってきました。

HPC(High Perfomance Computing)とか、まったく触ったこともなく、知識もなく、これから触ることがあるのかもなさそうな自分。
しかし、このイベントのことを教えてもらった弊社社長に
地球シミュレータと同レベルのインスタンスが作れるんだぜ」と言われてミーハー心で行って参りました。

到着が開始時間から5分くらい遅れてしまったのですが、会場に入ったら超満員。
席が無くて立ち見覚悟かと思ったけれど、イスを用意していただくことができました。

はてさて、まずはamazon CTO ヴァーナー・ボーガス氏の講演

内容については逐次通訳とあれど自分にはハイレベルすぎました。
ので、気になったとこだけ触れます。といっても、ものすごくメモ書きです。


・データ処理の流れ
collect | store | organize | analyze | share
日本語だと、こんな感じになるそうな。
収集 | 格納 | 組織化 | 分析 | 共有

うちも仕事では大量データを扱ってるので、参考になりました。

・CPUではなく、GPUって単語がいっぱい出てきた。

・HPCの特徴
  -とにかく並列
  -バッチで動かせる
  -ネットワークに依存しない
  
・これからは、「データ中心演算」
 従来はどんなデータを収集しなければいけないかは収集の前に決まってた。
 これからは、どのようなデータが欲しいか、どのような用途に使うかは後から決まってくるから、
 とにかくより多くのデータを集めなければならない。
 例えばamazonのオススメ商品表示とかもそうだ。
 先にデータを集めてから、これは、オススメ機能とかできるのでは、という風にサービスしていった。

Amazon Elastic MapReduceはベースはapacheHadoopである。

・HPCはパラレルコンピューティング、同期が密。
 880インスタンス立ち上げてベンチマークをとったが、世界のスパコンランキングのトップ500の中で250位くらいには位置する。
 数百ドルで、そのレベルの環境を用意することができる!(他にくらべたらだいぶ安い?)

・HPCはハリウッドのビデオ処理にも使われている。
 他には大学での研究や、銀行のリスク分析など。
 NASAやEesaでも、星の距離計算や衛生からの20年間の情報を蓄積していくためなどに使われている。
 
 ナスダックもデータをS3上に保存しており、誰でも使えるように公開している。
 
amazonPublicDataSets というサービスで利用可能なパブリックデータを公開している。


クラウド上でのHPCは、まだまだ始まったばかり


ヴァーナー・ボーガス氏の講演はここまで。
スライドも必要最低限の情報のみで、非常に見やすかったし、聞きやすかったです。

お次は、Amazonエバンジェリスト玉川氏の「HPC on アマゾンクラウドのデモンストレーション」
ライブ形式で、HPCインスタンスを8台立ち上げて、分子動力学の処理を走らせて
こんなに早く終了しましたぜ!という内容でした。

途中、普段のインスタンスの100倍の値段なのに
練習で何百時間も使ってしまったので、請求が心配。
でも、僕が払うわけじゃないので・・・
みたいなジョークを交えつつ、
10分ぴったりの時間でデモンストレーションをキレイに終わらせる玉川さん。
さすがです。

普段、マイクロインスタンスだと1時間1.6円だけど
HPCインスタンスだと1時間160円くらいという100倍のお値段だそうです。


そのあとは、パネルディスカッション。
きっと豪華な顔ぶれだと思うのですが、そのすごさが分かりませんでした。すみません。

でも、スパコン使ってる企業のお話なんて普段は聞く機会ないから貴重な経験になりました。


最後はQ&Aセッション。
最初の2つくらいの質問内容、覚えてないっす。すみません。
最後の2つなのですが、まずは、某AWS大好き社長さんからの質問。

「日本ではLTとか発表をするときに『好きなAWSサービスは○○です』って宣言するのが主流になっているのですが、
ヴァーナー・ボーガス氏が一番好きなAWSは何ですか?」

この質問は予想外だったのか、ヴァーナー・ボーガス氏はかなり悩まれてから
S3」というお答え。

理由は、

  • AWSで一番最初に始まったサービスだから。
  • シンプルだから使い勝手が広がる。可能性がある。
  • HTTP経由でやりとりができる。

最後の質問は「AWSは3年後(5年後だっけ?)はどうなっていると思いますか?」に
まず「水晶玉が欲しいよ」とジョークをとばしたあと、
「3年前に今の状況になるようなことは想像できなかったように、これからもどうなるかわからない」的な回答だったような。

あ、そうだ、あとデータとかセキュリティの質問とかもあった気がする。
それについては、

  • データはあくまでもお客様のもの。
  • 格納されたデータは、当該地域から出ることはない。
  • データを格納している施設に関する各種認定も受けている。
  • スタッフのデータへのアクセス権、破棄した場合などの規程も細かく決められている。
  • ドイツは非常にデータ保護に厳しい国で、違反すると会社のCEOが禁固刑を受けることもある。しかし、それでもAWSのサービスを使っている会社もある。

 
セキュリティとかに厳しいのは日本だけかと思ってたけど、そうでもないのね。
でも、それでも使ってもらえるくらい安全ですよ。と。
ふむ。しかし、厳しい会社は稟議が通るとか通らないとか厳しいんだろうなぁ。

あと、レイテンシの質問とかもあったな。それも、問題ない的なことを言ってたような。

あと、AWSはみんなの希望からここまでサービス展開してきたとのこと。
欲しいサービスやAWSへの希望がある人は
ハッシュタグ「#AWS77」をつけてtwitterでつぶやいてくだいてくださいとのことです。
このタグは七夕以降も使えるのかしら?


【感想】
クラウドHPCのメリットは、必要な時だけインスタンスを立ち上げて使えるってことなんだろうな。
お財布にもやさしそう。
そして、気軽にすごいことができそうな時代がくるんだろうな。
なんだか、すごい。

そういえば、最後にヴァーナー・ボーガス氏と握手させていただきました。
すごく多くて厚みのある手で握る力も強かったです。いい思い出になりました!

あと今度は「S3 NIGHT」が開催されるかも!という噂も。
それ、すっごく興味あります!楽しみにしてます!

当日の動画やTwitterまとめなどメモ


【アマゾン HPC NIGHT】Amazon.com CTO ヴァーナー・ボーガス様の基調講演録画アーカイブ
http://www.ustream.tv/recorded/15794118

【アマゾン HPC NIGHT】AWS エバンジェリスト @KenTamagawa さんのHPCデモンストレーション録画アーカイブ
http://www.ustream.tv/recorded/15794510

当日のTogetter
http://togetter.com/li/157974

大文字小文字を区別しないでreplaceAllしたい

文字列加工について。

Tel:01-1234-5678

という記述の「Tel:」を削除したい。
この場合、String.replaceAll()を使えば置換できるが
大文字小文字がまざっていると、"TEL:"とかやると変換できない。

文字列を toUpperCase() で大文字に揃えてから変換すればいいが
文字列に大文字に変換したくない以下のような文字列があった場合は困る。

ShopName:TestShop Tel:01-1234-5678

toUpperCase()をすると、「ShopName:TestShop」の他の文字も「SHOPNAME:TESTSHOP」と変換されてしまう。
が、それは避けたいので、何かうまい方法がないかと探していたら
Stringのドキュメントを見たら以下の記述があった。

このフォームのメソッド呼び出し str.replaceAll(regex, repl) では、次の式と正確に同じ結果が得られます。

Pattern.compile(regex).matcher(str).replaceAll(repl)


そのため、これにそってメソッドを作ってみた。

public class ReplaceTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String regex = "TEL:";
		String reql = "";
		String text = "ShopName:TestShop Tel:01-1234-5678";
		System.out.println("repcale前=>" + text);
		System.out.println("repcale後=>" + myReplaceAll(regex,reql,text));
	}
	/**
	 * 大文字小文字を区別せずにreplaceAllします
	 * @param regex 置き換えたい文字列
	 * @param reql 置換後文字列
	 * @param text 置換対象文字列
	 */
	public static String myReplaceAll(String regex ,String reql,String text){
	    String retStr = "";
		retStr = Pattern.compile(regex,Pattern.CASE_INSENSITIVE).matcher(text).replaceAll(reql);
		return retStr;
	}
}

実行結果

repcale前 => ShopName:TestShop Tel:01-1234-5678
repcale後 => ShopName:TestShop 01-1234-5678