2014年4月19日土曜日

botocoreでマルチプロファイルを使う方法。

botocore使ってるAWS CLIは簡単にプロファイル(AWSアカウント)の切替出来るのに、botocoreだとどうやるか分からんかったので調べた。
ただなーんかスマートじゃないんだよね。誰か正しい方法教えてえろい人。

準備

環境はUbuntu13.10。まずはpythonのインストール。多分余計なのも入れてる気がする。

sudo aptitude install python3.3 python3.3-dev build-essential automake libtool pkg-config

続いてbotocoreを持ってきていれる。ここは敢えてAWS CLIは入れてない。

cd ~/git
git clone https://github.com/boto/botocore.git
cd ~/git/botocore
sudo python3.3 setup.py install

configファイルの作成

configファイルってのはプロファイルの集まり。つまりこのファイルに利用したいAWSアカウントのアクセスキー/シークレットアクセスキーを列挙する。
一応このファイルには以下の書式ルールがある。

特に指定がなきゃ「default」が使われる
二個目以後は必ず「profile HOGE」見たいに頭に「profile 」を付ける必要がある。

ファイルの場所はどこでもいい。最終的にAWS_CONFIG_FILE環境変数にこのファイルへのパスを書く。
[default]
aws_access_key_id=AAAA
aws_secret_access_key=BBBB

[profile HOGE]
aws_access_key_id=CCCC
aws_secret_access_key=DDDD

[profile FUGA]
aws_access_key_id=EEEEE
aws_secret_access_key=FFFFF
region=ap-northeast-1

サンプルコード

session毎にprofileが切り替わる。つまりsession毎にAWSアカウントが切り替わる。
get_sessionメソッド実行時に環境変数っぽいけいしきでファイルを引き渡すとそれを元に、sessionを作ってくれるっぽい。

import botocore.session

# 特に指定しないと default が読まれる。
session = botocore.session.get_session()
ec2 = session.get_service('ec2')
operation = ec2.get_operation('DescribeInstances')
endpoint = ec2.get_endpoint('us-east-1')
http_response, response_data = operation.call(endpoint)
print(response_data)

# HOGEアカウントを指定したい場合
EnvironmentVariables = {
    'profile': ('HOGE', 'HOGE', 'HOGE'),
}
session = botocore.session.get_session(EnvironmentVariables)
ec2 = session.get_service('ec2')
operation = ec2.get_operation('DescribeInstances')
endpoint = ec2.get_endpoint('us-east-1')
http_response, response_data = operation.call(endpoint)
print(response_data)

2014年3月8日土曜日

古いInstanceTypeから新しいInstanceTypeに切り替えた時のトラブル対応

社内でm1系とかm2系で運用してきたInstanceをm3系、c3系に切り替えて再開したら、上手く起動しないという報告があった。

詳しく見てみるとm1.m2系のInstanceをSTOPして、InstanceTypeをm3/c3系に変更。その後STARTしたらRUNNING状態になるがステータスチェックの二つ目で転けていた。んでもってそもそもこのInstanceは結構古くから使われているモノだった。

ここまで聞いておおよそ見当が付いた。EC2Configとドライバが古いのだ。
取り敢えず一旦m1/m2系のInstanceで起動し直す。そこで以下の二つをDLして更新する。

http://aws.amazon.com/developertools/5562082477397515
http://aws.amazon.com/developertools/2187524384750206

とこれで完了。この後にm3/c3系に切り替えれば無事起動した。

2014年3月3日月曜日

python3 + bottleでshif-jisなcsvを出力する

無駄に悩んだ。
取り敢えずメモ程度に。
from io import StringIO
from bottle import route, response
@route('/get_csv')
def get_csv():
    response.content_type = 'application/octet-stream'
    response.headers['Content-Disposition'] = "attachment; filename='hoge.csv'"
    stream = StringIO()
    writecsv = csv.writer(stream)
        # ここでcsvを作る。
    stream.seek(0)
    return stream.getvalue().encode('shift-jis')

2013年11月18日月曜日

BOTOでCloudWathcのmetricsをとる

InstanceのIDを指定してCPU使用率をとる方法。

環境
python3.3
BOTO 2.9.0 py3kport
import datetime
from decimal import Decimal,ROUND_HALF_UP
from boto.ec2.cloudwatch import CloudWatchConnection,regions

for region in regions():
    cw_con = CloudWatchConnection(
        aws_access_key_id     = 'AAA',
        aws_secret_access_key = 'BBB',
        region = region,
    )
    for val in cw_con.get_metric_statistics(
            60,
            datetime.date.today() - datetime.timedelta(hours=0.1),
            datetime.datetime.today(),
            'CPUUtilization',
            'AWS/EC2',
            'Average',
            {'InstanceId': ['i-CCC']},
            'Percent',
    ):
        print(val)

2013年9月18日水曜日

Python bottleでPOST時の項目数上限

Pythonのbottleを使ったWebサイトで、100個以上の項目(inputとかtextarea)を投げると100個までしか取得出来ない問題が起きた。

調べたらどうやら100個制限してるのが仕様っぽい
THE REQUEST OBJECT

んで取り敢えずこの設定を上書きすれば100この制限は外れるっぽい。

そのWeb全てのqueryに適用する場合はbottle読み込んでる所の一番上にかく。

from bottle import BaseRequest
BaseRequest.MAX_PARAMS = 200

各ページ個別で上限を設定する場合は

from bottle import BaseRequest
@route('/create', method='POST')
@view('confirm')
def post_create():
    BaseRequest.MAX_PARAMS = 200
    value = request.forms.decode().get('key')

となる。
まぁSecurityとか考えたら個別で設定だよな。

2013年7月5日金曜日

0.25mm Crystal Armor for Xperia Z

はい。買いました。
0.25mm CrystalArmor for Xperia Z

Xperiaは防塵防滴なので可能な限りキャップを開けずに使いたいモノです。充電も可能な限りクレードル使いたいですね。急速充電も出来るし。以前の0.4mm版だと両面付けるとクレードルに刺さらなくなるので流石にアレでした。今回購入したのは0.25mm。以前の0.4mm版と比べて薄くなっています。まるで何処ぞのゴムみたいですね。

まぁ結論からいうと、0.25mm版でも両面はったらクレードル刺さりません。

ただ明らかにもう少し!!って状態なのでクレードルの左右にある黒い四角い部分をニッパーで切り取りました。
すると・・・



キタ━━━━━━(゚∀゚)━━━━━━ !!
充電出来ました。向かって左上のオレンジ色の光が充電中の証拠です。
クレードルにある固定器具をぶった切ってしまったので以前の様にカチッ!とはまる快感と安心感はなくなりました。変わりにある意味でおくだけ充電ですが。

あと個人的に画面への傷が気になるのでクレードルの手前の受け側の左右をニッパーで斬りました。
やっぱCrystalArmor(・∀・)イイネ!!

2013年6月12日水曜日

python3のJSONメモ

python2.x
    f = urllib.request.urlopen(url)
    return json.loads(f.read())

python3.x
    f = urllib.request.urlopen(url)
    content = f.read()
    return json.loads(content.decode('utf8'))

2013年6月10日月曜日

Python3のLeveDBメモ

 # -*- coding: utf-8 -*-
import leveldb

db = leveldb.LevelDB('/home/hogfe/ldb')
key = 'hoge'
value = 'fuga'

Python2.7でのCode
登録
db.Put( key, value)

取得
value = db.Get(key.name)


Python3でのCode
登録
db.Put( bytes(key, 'UTF-8'), bytes(value, 'UTF-8'))

取得
value = db.Get( bytes(key, 'UTF-8') ).decode()

2013年3月12日火曜日

python boto でInstance metadataを取得

# -*- coding: utf-8 -*-
import boto.utils

meta = boto.utils.get_instance_metadata(version='latest', url=u'http://169.254.169.254', timeout=None, num_retries=5)
# 情報がDICTに成ってる。持ってるDICTのKey一覧
for key in meta.keys():
    print key
# InstanceIDを取得
print meta.get(u'instance-id')

2013年2月15日金曜日

build.prop

ro.semc.enable.fast_dormancy=false
ro.ril.disable.power.collapse=1
ro.ril.enable.a52=0
ro.ril.enable.a53=1
ro.ril.hsdpa.category=10
ro.ril.hsupa.category=6
ro.ril.hsxpa=2
ro.ril.fast.dormancy.timeout=3
ro.ril.enable.dcm.feature=1
ro.ril.disable.fd.plmn.prefix=44010
ro.ril.enable.sdr=0
ro.ril.oem.mosms.mode=1
ro.telephony.default_network=2
ro.ril.def.agps.mode=2
ro.ril.def.agps.feature=2
ro.telephony.no_emg_calls_only=true
ro.semc.spn.currentname=NTT DoCoMo
ro.semc.spn.newname=NTT DOCOMO
ro.ril.oem.ecclist=110,118,119
ro.ril.oem.nosim.ecclist=110,118,119
ro.product.brand=docomo

ro.HOME_APP_ADJ=1
ro.HOME_APP_MIN_ADJ=0
ro.HOME_APP_MAX_ADJ=1