2013年3月30日土曜日

aws : ec2で自身のインスタンスidを取得する

メモ。こんな方法なんですね。
$ wget -q -O - http://169.254.169.254/latest/meta-data/instance-id


2013年3月29日金曜日

vagrant-awsを使ってAWSインスタンを立ち上げる

Virtual Boxの便利なクライアントラッパーとして有名だったvagrantが、version1.1以降ではAWSやRackspaceなど有名なクラウド環境もサポートするようになりました。

AWSについては、vagrant-aws というプラグインを導入することで、vagrantからaws instanceの立ち上げ〜廃棄を行うことができます。

◯install
vagrantについては以下のサイトなどから適当に(1.1以上必須)。
http://www.vagrantup.com/

vagrant-awsについては以下のコマンドで追加できます。
$ vagrant plugin install vagrant-aws

$ vagrant plugin list
vagrant-aws (0.1.2)
◯init
$ vagrant init
まず"vagrant init"によってVagrantfileのひな形を作成します。
ここではawsのインスタンスを立ち上げる事を目標としているので、Vagrantfileをaws向けの設定に書き換えます。
vgrant-awsのREADMEを引用すると以下のような書式になります。
Vagrant.configure("2") do |config|
  config.vm.box = "dummy"

  config.vm.provider :aws do |aws|
    aws.access_key_id = "YOUR KEY"
    aws.secret_access_key = "YOUR SECRET KEY"
    aws.keypair_name = "KEYPAIR NAME"
    aws.ssh_private_key_path = "PATH TO YOUR PRIVATE KEY"

    aws.ami = "ami-7747d01e"
    aws.ssh_username = "ubuntu"
  end
end
まず 、"Vagrant.configure("2")"はおまじないみたいなもので、vagrantの1.1を使用する、という宣言です。
続いて、config.vm.boxで使用するboxを指定します。awsの場合、ec2側で登録されているamiを使用する形になるので、本来はこの設定は不要です。ただ、vagrant的には値の設定が必要なようなので、dummyのboxを指定します。
なおdummyのboxはvagrant-awsのgit上に用意されているので、あらかじめvagrantにaddしておきましょう。
vagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box   
aws provider周りの設定については、それぞれの項目に応じて設定します。あらかじめaccess keyやsecret access keyなどの値を控えておきましょう。
詳細な項目についてはvagrant-awsのREADMEの”Configuration"の項を参照ください。
https://github.com/mitchellh/vagrant-aws

なお、security group についてはssh portが空いているものを設定する必要があります。sshが接続できないとvagrantからコントロールすることが出来ず、インスタンスだけ立ち上がるけれどvagrant側はエラーになりdestroyできなくなる、という状況に陥ります。
※ 設定で嵌りそうな点についてはこの辺のブログなどを参照してください。
http://d.hatena.ne.jp/naoya/20130315/1363340698

◯operation
ひと通り設定が終わったら、vagrant upを実行します。provider情報として"aws"を指定する必要があります。
$ vagrant up --provider=aws
ec2のインスタンスが立ち上がったら、Virtual Boxの時と同じようにssh接続することができます。
$ vagrant ssh
使用が終わったら、destroyをすると立ち上げたインスタンスがterminateされます。
$ vagrant destroy
なお、私が試した環境では、"vagrant halt"が上手く動作しませんでした。イメージ的にはインスタンスがstopされて欲しいのですが…

◯所感
vagrant経由で簡単にawsをハンドリングする事ができるので、手軽にec2のインスタンスを立ち上げ、アプリケーションや構成管理ツール(chefなど)の動作確認を行うには非常に便利なツールだと思います。
ただ、ユースケースとしては、あくまで検証向きだと思います。本番環境の複数台のサーバーに対してvagrantで管理する、というイメージがあまり持てないので、検証領域での使用に留めるのが妥当かなと思っています。






2013年3月27日水曜日

jenkinsでロール管理を行う

jenkinsはユーザー単位で権限管理もできますが、ロール単位でも管理ができます。
ただし、標準機能では出来ないので、"Role Strategy Plugin"を追加する必要があります。

プラグインを追加した後の手順は、以下ブログが詳細で分かりやすいです。
http://d.hatena.ne.jp/tyuki39/20110111/1294759823

githubにブロックされずにssh接続を行う

githubに22番ポートで接続をしていたら、あるタイミングで接続できなくなりました。
ssh: connect to host github.com port 22: Connection refused
githubのhelpを読んでいると”Using SSH over the HTTPS port”という項があり、HTTPSのポートを使用してSSHを接続することが推奨されています。
https://help.github.com/articles/using-ssh-over-the-https-port

ここに記載されているように、"/.ssh/config"に以下のような記述を追加すれば、ブロックされること無くSSH接続ができるようになります。
Host github.com
  Hostname ssh.github.com
  Port 443



64bit CentOS環境のjenkinsでAndroidのテストを実行する

jenkinsには"Android Emulator Plugin"が存在するので、こちらを利用すればAndroidアプリのテストをjenkinsの継続インテグレーションに組み込むことができます。

手順については、@ITの以下記事が良くまとまっているので、ここでは引用まで。
http://www.atmarkit.co.jp/fsmart/articles/androidtest06/01.html

ただ、手元の環境がCentOS6.3だったのですが、その環境でemulatorを動作させようとするとlibstdc++が見つからないという事でエラーになりました。
android create avd -f -a -c 64M -s WVGA800 -n hudson_ja-JP_160_WVGA_android-8 -t android-8
Auto-selecting single ABI armeabi
Android 2.2 is a basic Android platform.
Do you wish to create a custom hardware profile [no]
Error: /home/jenkins/.jenkins/tools/android-sdk/tools/mksdcard: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
Error: Failed to create the SD card.
Error: Failed to create sdcard in the AVD folder.
どうも以下のブログ記事などを見る限りだと、Linux系向けのAndroid SDKは32bitアプリケーションのため、64bit OS環境で動作させるためにはいくつかライブラリをインストールする必要があります。
http://iexcel.wordpress.com/2010/01/25/ia32-libs-for-android-sdk-on-fedora-12-x86_64/

上記ブログはFedora向けの説明ですが、概ねCentOSでも同じで大丈夫です。私は以下のライブラリについて"yum install xxxx"して、ひと通りjenkinsでテストが動くようになることを確認しました。
glibc.i686 
glibc-devel.i686 
libstdc++.i686 
zlib-devel.i686
ncurses-devel.i686 
libX11-devel.i686 
libXrender.i686 
libXrandr.i686



mavenと認証設定済みのnexusの連携

認証設定をしたnexusサーバーにpom.xml経由でjarの取得、もしくは登録を行いたい場合、~/.m2/settings.xml に以下のような設定を記載する必要があります。
 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLoc    ation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
     <servers>
         <server>
             <id>hoge</id>
             <username>fuga</username>
             <password>password</password>
         </server>
</settings>
idの部分に、pom.xmlでserver情報を一意に特定するためのサービスID(任意)を設定します。usernameならびにpasswordはnexusで使用するID・passwordです。

pom.xmlで管理しているプロジェクトのjarを"mvn deploy"でnexusに登録したい場合は、pom.xmlに以下のような記述を記載します。
 <distributionManagement>
      <repository>
           <id>hoge</id>
           <url>http://nexus.hoge.jp/content/repositories/releases</url>
      </repository>
 </distributionManagement>
上記pom.xmlのid"hoge"と、settings.xml中のid"hoge"は対応しています。ですので上記URLに接続する際、認証が求められた場合はsettings.xmlに記載した認証情報を元に接続をすることになります。

nexus上のrepositoryを取得したい場合は以下です。
 <repositories>
    <repository>
       <id>hoge</id>
       <url>http://nexus.hoge.jp/nexus/content/repositories/releases</url>
    </repository>
 </repositories>

ローカルPCの開発環境で上記設定を行う場合は、ログインしているユーザーの~/.m2/settings.xml を編集すればOKです。
jenkinsなどサーバー環境で設定が必要な場合は、たとえばjenkinsの場合はjenkins serverの実行ユーザーのsettings.xmlを、サーバー上で直接編集してあげる必要があります。

また、ID・パスワード認証以外の方法...たとえば公開鍵認証方式...でサーバーに接続する場合は、以下のmanualの内容を参考にしてください。
http://maven.apache.org/settings.html#Servers