geek.conf.2

あるエンジニアの備忘録

rubyでlistVMSnapshot@CloudStack APIを打ちたい

コンチワ。
CloudStack APIrubyで操作してごにょごにょしてます。その際に、cloudstack_ruby_clientを使っているのですが、これ、listVMSnapshotが利用できないんですね。なので、自分でRest API応答をこさえました。その時に、苦労したことがあるので、展開します。

CloudStack APIを叩く時にPortを8080を使う場合、URIに含める署名を作成する必要があります。その署名の作成方法を今日は紹介します。
その前に、CloudStack APIを叩く際のURIを構成する部品を整理します。

URI:http://YOUR_SERVER_NAME:8080/client/api?command=listVMSnapshot&response=json&apikey=YOUR_CLOUDSTACK_API_KEY&signature=YOUR_CLOUDSTACK_SIGNATURE
コマンドパラメータ:command=listVMSnapshot&response=json&apikey=YOUR_CLOUDSTACK_API_KEY
署名:signature=YOUR_CLOUDSTACK_SIGNATURE
秘密鍵YOUR_CLOUDSTACK_SECRET_KEY
はい。それでは、上記の署名を作成する方法です。ちなみにCloudStack 4.3ですね。バージョンは。

1. コマンドパラメータの要素を並べ替え
コマンドパラメータ内の&で区切りられた要素の要素名(apikeyとかcommandとか)をアルファベット順に並べ替えます。
コマンドパラメータ2:apikey=YOUR_CLOUDSTACK_API_KEY&command=listVMSnapshot&listall=true&response=json

2.コマンドパラメータ2をURLエンコード
並べ替えたコマンドパラメータ2をURLエンコードします。(コマンドパラメータ3とする)

3. コマンドパラメータ3を小文字化
URLエンコードしたコマンドパラメータ3のアルファベットを全て小文字にします。(コマンドパラメータ4とする)

4.コマンドパラメータ4をHMAC SHA-1でハッシュ化し、Base64エンコード
小文字化したコマンドパラメータ4をハッシュアルゴリズムHMAC SHA-1でハッシュ化します。さらにBase64エンコーディングし、UTF-8にします。(署名0とする)

5.署名0をURLエンコード
コマンドパラメータ4をハッシュ化してBase64エンコードした署名0をさらにURLエンコードします。(署名とする)

署名の出来上がりです。

これをrubyでこさえるとこんな感じです。※サーバURLやapikeyは外部ファイルから取っています。

command_param = "apikey=#{config['APIKEY']}&command=listVMSnapshot&listall=true&response=json"
urlenc_command_param =  URI.escape(command_param)
data = urlenc_command_param.downcase
base64_sig = Base64.encode64(OpenSSL::HMAC.digest( OpenSSL::Digest.new('sha1'), config['SECKEY'], data)).strip
enc_sig = CGI.escape(base64_sig)
access_uri = URI.parse("#{config['URL']}/client/api?#{command_param}&apikey=#{config['APIKEY']}&signature=#{enc_sig}")

そして、listVMSnapshotを実行して、作成されて1日経過しているものの個数を出力するコードはこんな感じになります。

rubyでCloudStack APIエンドポイントURIの署名作成方法ってあまり、なかったので書いてみました。
おしまい。

TOEIC 第202回 (僕は初回)

試験日:2015/07/26
結果発表日:2015/08/17 正午
点数:L:335, R:240 T:575/990
勉強期間:20日(2015/07/06 - 2015/07/25)
利用した参考書:1. はじめての新TOEICテスト完全攻略バイブル
        2. TOEICテスト究極の模試600問
勉強方法:
 まず、1. のはじめての新TOEICを3週し、次に2. の究極の模試600問を2週しました。
 これだけ。
 究極の模試での1週目の成績はテスト1:500、テスト2:540、テスト3:490、2週目は
 もちろん100点以上上がりました。
感想:
 思ったより、スコアが良かった!ここまで来ると600行きたかたが、
 Reading、、もっと勉強すれば、600行けたかなぁ

sensu + graphiteでのメモ

・rabbitmqのWeb管理画面へログインするためには?
URL:http://hostname:15672
ユーザ名/パスワード:以下の手順で作成する

rabbitmqctl add_user admin password
rabbitmqctl set_permissions admin ".*" ".*" ".*"
rabbitmqctl set_user_tags admin administrator

※ユーザadminを作って、権限を付与して、ロールを設定

・graphiteへのメトリック情報をクリアする
sensuに登録済みmetricスクリプトを編集して収集するメトリックに変更を加えたい時、
whisperデータベースを削除しないとgraphiteに変更が反映されない。以下のように削除する。

rm -f /var/lib/carbon/whisper/

vagrant/chef-soloでいろいろprovisioningしたvmware fusionをbox化してAtlasにアップロード

※ローカルはmac OS X Yosemiteです。

1. Vagrant plugin for vmware fusionをインストール
# vagrant plugin install vagrant-vmware-fusion
# vagrant plugin license vagrant-vmware-fusion license.lic
※license.licはhashicorpから買う。確か$79だった。

2.centos6.4のvmware fusion用boxをadd
www.vagrantbox.es
から適当に。
# vagrant box add centos6-vmware_fusion https://dl.dropbox.com/u/5721940/vagrant-boxes/vagrant-centos-6.4-x86_64-vmware_fusion.box

3.vagrant up --provider=vmware_fusionする
このままprovisioningすると以下のエラーがでる。
default: Waiting for HGFS kernel module to load...
これを回避するためにprovisioningせずにただupして、sshして以下のコマンドを実行する。
echo "answer AUTO_KMODS_ENABLED yes" | sudo tee -a /etc/vmware-tools/locations

4.一旦box化
# cd .vagrant/machines/default/vmware_fusion/xxxxxxxx/
# /Applications/VMware\ Fusion.app/Contents/Library/vmware-vdiskmanager -d Virtual\ Disk.vmdk
※Defragment
# /Applications/VMware\ Fusion.app/Contents/Library/vmware-vdiskmanager -k Virtual\ Disk.vmdk
※Shrink
# rm -f vmware*.log
# tar cvzf centos-6.6-vmware_fusion-tmp.box ./*

5.box addする
# vagrant box remove centos6-vmware_fusion
# vagrant box add centos6-vmware_fusion centos-6.6-vmware_fusion-tmp.box

6.chef-soloでprovisioningしてserverspecでテスト
Vagrantfileでvagrant up --provider=vmware_fusion
※cookbookやらspecは適当に。
Vagrantfileについて
config.vm.box = "centos6-vmware_fusion"とする。
ミソはconfig.ssh.insert_key = falseを追加すること。
なんかv1.7.0以上だとinsecure keyっていうここのキーペアを利用している場合、replaceするらしい。DLしたvmware fusion用boxはここのキーペアを利用しているので、とりあえずreplaceしないようにconfig.ssh.insert_key = falseを追加する。

あとsudoレシピでvagrantユーザを追加しています。じゃないとserverspecをsudoでやると失敗します。

7.正式box化の準備
vagrant sshでprovisioningしたvagrant boxにログインして
box化のためのお掃除をする。
# vagrant ssh
$ sudo yum clean all
$ sudo rm -rf /tmp/*
$ sudo rm -f /var/log/wtmp /var/log/btmp
$ history -c
$ sudo shutdown -h now

8.正式box化
# cd .vagrant/machines/default/vmware_fusion/yyyyyyyy/
# /Applications/VMware\ Fusion.app/Contents/Library/vmware-vdiskmanager -d Virtual\ Disk.vmdk
※Defragment
# /Applications/VMware\ Fusion.app/Contents/Library/vmware-vdiskmanager -k Virtual\ Disk.vmdk
※Shrink
# rm -f vmware*.log
# tar cvzf centos-6.6-vmware_fusion-cust.box ./*

9.正式box add
# vagrant box remove centos6-vmware_fusion
# vagrant box add centos6-vmware_fusion centos-6.6-vmware_fusion-cust.box

10.vagrant up からのserverspecでprovisioning
# vagrant up --provider=vmware_fusion --provision-with serverspec
※エラーが出ないことを確認する

11.Atlasにアップロード
centos-6.6-vmware_fusion-cust.boxをAtlasにアップロードする。
tsubauaaa/centos6.6-tsuba

12.box add
vagrant box add tsubauaaa/centos6.6-tsuba --provider=vmware_fusion
※とかアップロード先のAtlasのbox名およびproviderを指定する。

コードはこちら:tsubauaaa/Vagrant/centos6_vmware_fusion

vagrant

GIMPで下絵をくっきりと!

mac os x そしてGIMP 2.8で。
下絵は線画のみ手書きとする。

0.下絵の写真をファイルに保存してGIMPで開く

1.線をはっきりさせる
色→レベル
※入力レベルの右端の白点値を左に移動させて全体を白く明るくする。

gimp1

※ちなみに入力レベルの左端の黒点の値を右に移動させると全体が暗くなる。

2.保存して終わり

PackerとCentOSのAMI

PackerでCentOSのAMIをProvisioningして、そのAMIからLaunchしてもrootでsshログインできなかった。
CentOSのAMIはrc.localのスクリプトで/root/.sshディレクトリがすでにあると、Launch時に指定する公開鍵を/root/.ssh.authorized_keysに作成してくれない。

PackerでCentOSのAMIを作成するとPackerが一時的に秘密鍵を作成してauthorized_keysに登録する。
そのためそのAMIをLaunchして利用する秘密鍵を指定してもPackerの一時的な秘密鍵のままとなってしまい、
ログイン出来なかったのが、一行目の原因であーる。

これを回避するためにPackerのProvisionersに以下のshellを登録するべし。


{
"type": "shell",
"inline": [
"sudo rm -f /root/.ssh/authorized_keys"
]
}

Packer作成後に/root/.ssh/authorized_keysを削除している。

Terraformメモ

TerraformでAWSについて、アクセスキーとシークレットキーの受け渡し方を考察

なんか、カレントにterraform.tfvarsファイルを置いておけば読んでくれるみたい。
# vi terraform.tfvars


access_key = "foo"
secret_key = "bar"

terraform.tfvarsじゃなくても実行時に-var-fileで指定すればOK
そしてtfにvariable登録。


variable "access_key" {}
variable "secret_key" {}

そしてtfに以下のように定義。


provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "${var.region}"
}

VPCを作成するとTargetがlocalのmainルートテーブルが作成されるが、これは通常AWS APIが自動で
作成するものなのでTerraformで作成する必要はないと考えます。
しかし、このmain ルートテーブルをPrivateサブネットに反映したいので、そのやり方を考えてみました。


# private-1a Association definition
resource "aws_route_table_association" "pri-1a-asso" {
subnet_id = "${aws_subnet.private-1a.id}"
route_table_id = "${aws_vpc.vpcname.main_route_table_id}"
}

ってだけなんですけどね。てかaws_vpcのAttributesでmain_route_table_idてのがあってこれがmainルートテーブルのidとして使えるってだけなんですけどね。
同じようにNACLとかdefault VPC security groupとかもある。

他Terraform Tips
・terraform destroyしたときの計画確認


# terraform plan -destroy

・Terraformを経由して作成したものをAWS管理コンソールで編集した場合は、Terraformで修正削除可能。
・Terraformを経由しないで作成されたものはTerraformでは編集も削除も出来ない。stateファイルterraform.tfstateにないからね。

Atlasとの連携
access_tokenをATLASから発行
・export ATLAS_TOKEN=******を.bash_profileにでも書いておく。


# terraform remote -name=Atlasユーザ名/Atlasリポジトリ
※追記:上記コマンドの書き方はv0.4.0以降エラーになるようになっちゃった。
※Atlasリポジトリ名はなんでも可
これでterratermするとAtlasでstateファイルが追跡可能となる。
ちなみにATLAS_TOKENをexportしていないと以下のエラーになるよ。
missing 'access_token' configuration or ATLAS_TOKEN environmental variable

とりあえずここらへんで。