Getting started with Amazon EC2 API Tools

06 May 2014

Amazon EC2是什麼東西,這裡就不多做介紹了,
這裡主要介紹 Amazon EC2 API Tools,這個tool讓developer用來管理EC2上的instances,
不管是create, terminate, stop, create key等等之類的操作都可以透過API tool來完成,
那什麼時候需要用到這個tool? 像是automation啊,或者如果你想要customize自己的AMI時,
還是得先安裝 Amazon EC2 API Tools以及AMI Tools,不過AMI就是另外一個課題了,有機會的話再開另一篇來講吧!
這裡就focus在下面兩個主題:
    1. how to setup API tools?
    2. how to create EC2 instance using API command line?
    3. how to grant permissions to instance using API command line?
    4. how to terminate instance using API command line?

在開始之前,記得先去註冊AWS的帳號啊!(有一張信用卡就可以註冊了)


1. Get certificate and Private key

因為tools需要先拿到cert and private key,才可以讓developer對自己的account做操作,
所以得先拿到!
怎麼拿呢?
先到Security credentials的頁面,
進去以後,請點選紅色框框中的按鈕『Create new certificate』(如下圖),

按下按鈕就建立好cert and private key了!就把cert and private key下載到『桌面』.
記得!!!一定要先下載private key!因為只有一次的機會!錯過就無法重新下載了!
cert也要一併下載下來.



2. Download the API tools

接著就去下載API tools,
先在home目錄底下建立一個.ec2的folder,
這folder會存放cert and private key,以及api tools,
cd 
mkdir .ec2 # create folder
cd .ec2
wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip # download tools
unzip ec2-api-tools.zip
mv ~/Desktop/*.pem . # move cert and private key



3. Environment setup

接著要設定環境變數,
打開你的.bash_profile
vim ~/.bash_profile

並且insert下列的內容,
export EC2_HOME=~/.ec2    
export PATH=$PATH:$EC2_HOME/bin
export EC2_PRIVATE_KEY=$EC2_HOME/pk-xxxxxxxxxx.pem # remember to replace xxxx to your file name
export EC2_CERT=$EC2_HOME/cert-xxxxxxxxxxx.pem # remember to replace xxxx to your file name
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home/ # because API tools are written in java
export EC2_URL=https://ec2.us-west-2.amazonaws.com

其實設定都還蠻淺顯易懂的,
EC2_URL比較需要特別說明,
這個超重要!為什麼呢?
因為你不設的話,你待會下某些指令都會找不到東西!指令還得帶上--region option才行!
為了省下麻煩,就在bash_profile設定吧!當然你可以把us-west-2改成你想要的region!

最後記得要讓bash_profile生效!
source ~/.bash_profile


4. Gen key

接著先建立key,這key是等等用來ssh連線到你的instance的!
ec2-add-keypair ec2-keypair
這指令會幫你gen key,gen完以後會顯示在console上,
請把它複製起來!(從-----BEGIN RSA PRIVATE KEY-----開始複製,一直到-----END RSA PRIVATE KEY-----)
然後建立一個ec2-keypair的檔案,把內容貼在裡面!
cd ~/.ec2
vim ec2-keypair


5. Create instance

在create之前,你應該要知道你想要create哪一類型的instance!像是ubuntu, centos, amazon linux....etc.
所以要透過下面的指令去查有哪些instance,
ec2-describe-images -a --filter architecture=x86_64 >> ~/image_list
-a意思就是show all
然後--filter出architecture是x86_64的image!
因為其實資料蠻亂的,建議你還是output到一個file來看你想要create哪一種instance!
這裡我選擇了ami-6ac2a85a,這個是ubuntu14.04的instance!

接著就可以create了!下面的option應該就不用多作說明了,有玩ec2的應該都知道
ec2-run-instances  ami-6ac2a85a  --key ec2-keypair  --region us-west-2  --instance-type t1.micro


6. Connect to instance

一開始你想要ssh進去instance,一定是不行的!
因為預設的group permission是沒有開22 port的!
所以要用下面的指令去打開!
ec2-authorize default -p 22

打開以後就可以ssh進去了!
ssh -i ec2-keypair ec2-xxx-xxx-xxx-xxx.us-west-2.compute.amazonaws.com

喔!對了!如果你忘記自己instance的ip或者相關資訊,
可以透過下面指令來查!
ec2-describe-instances



7. Terminate instance

要terminate一個instance非常簡單!
你只要知道自己的instance id就好了!(如果忘記id是什麼,一樣用ec2-describe-instances去查!)
ec2-terminate-instances i-xxxxxxx
















read more »


Build a deb package from source

10 March 2014

最近因為安全性的關係,
我要在ubuntu 10.04上面將openssl從0.9.8k更新至1.0.1e,
以及將openssh從5.3p1更新至6.2p2
但偏偏這兩個較新的版本都沒有給10.04用的package....
所以這時候只好自己build了!
有人可能會覺得奇怪,為什麼要包成package安裝?
而不直接tar開source,然後make install就好?
因為我需要重複的更新很多次,很多檯機器!
如果在每一檯都去./configure, make, make install...那真的會很花時間!
所以最快的方式就是先在一檯機器上build package,
然後再把package拿到每一檯去安裝,
會快上許多!

喔!對了!這邊教你的是怎麼build出一包debian package!
如果你想要把這包package撒出去給別人使用,建議你要加上sign key啦!
甚至如果你想要撒到launchpad上的話,更要加上sign key!
但這裡只會教怎麼build而已!

恩,其實build還是很簡單!
難的是環境的準備跟環境的設定啊.....


在這裡會介紹兩種build debian package的方法!
  1. checkinstall
  2. debuild


這兩種的方式差蠻多的,
checkinstall它是用錄製的方式,
透過make install,然後錄下整個安裝過程,
再把打包成一個debian package!
而debuild可以想像成就是動態的去build,把所需的檔案通通包進去package!

1. install tools

先安裝所需的package,第一個是checkinstall,再來安裝ubuntu-dev-tools這個package,
ubuntu-dev-tools裡面就包含了debuild等相關需要的tools.
apt-get install checkinstall
apt-get install ubuntu-dev-tools bzr-builddeb debhelper

2. download and decompress tarball

把source code下載下來和解壓縮開,
cd ~
wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz // download ssl
tar xvzf openssl-1.0.1e.tar.gz

wget http://openbsd.org.ar/pub/OpenBSD/OpenSSH/portable/openssh-6.2p2.tar.gz // download ssh

cd openssl-1.0.1e

3. Config and Compile source code

這一步蠻重要的,
要進行config和make(compile),
但!!!只有checkintall需要“先”config and compile!
先config,openssl的config還好,但openssh的config要稍微注意一點,
openssh的config要特別帶一個--sysconfdir,
這個參數是說明你將來的sshd_config, ssh_config, ssh_host_xxx_key要放在哪裡,
如果你沒有帶這個參數,預設應該是會存在/usr/etc/底下,老實說蠻奇怪的!
所以還是指定一下吧!
那因為前面剛剛說了,只有openssl需要先config,所以等等會再說openssh怎麼去設定config,
先設定openssl的config,
./config

進行make,make就是compile,把你的source code compile成binary,
make


4. Build package (checkinstall)

前面說了build package,這裡會介紹兩種方法(其實蠻多種方法的),
我會先用checkinstall build ssl,然後用debuild build ssh,
首先是ssl,
checkinstall make install
checkinstall的原理就是會去錄製接在它後面那個command所作的事情,
所以我們後面接make install(就是安裝),
make install下下去以後就會真的去安裝這個package,
然後checkintall就會在旁邊錄起來!
checkinstall這個指令按下enter以後,會出現幾個preconfig的訊息,
你要先替這個package建立一些information,
第一個是會問你doc,這個就是直接y下去!(如下圖)

接著是要你描述一下這個package是做什麼的(如下圖)

最後就是這package的相關資訊,你可以改掉maintainer是誰,
改成自己email!(如下圖)

那怎麼看有沒有成功?
因為你是下make install,
所以最後build的流程會去幫你安裝,
如果安裝失敗, 那你的package也不會存在!

那有人可能只是單純想要build package,而不想要安裝這個package在這檯機器上,
那該怎麼辦?
checkinstall有額外的參數可以做這件事情,多帶一個--install就行!
checkinstall --install=no make install



5. Build package (debuild)

上面介紹了checkinstall的方法,
現在要介紹debuild的方式,
那這裡我們以opennssh為範例,
透過debuild比較算是debian的practice,
首先要先有debian的資料夾,
這資料夾下面有一堆林林種種的config file,甚至是init.d,
那我們難道要一個一個的設定這些config?
當然不用,可以透過dh_make去幫我們產生template,

那可是透過dh_make也有點麻煩,就是要接一堆參數,
那好險Canonical有提供另一個tool(bzr)去幫我們handle這件事情,
透過bzr就可以幫我們產生debian/*底下的template,
cd ~
bzr dh-make openssh 6.2p2 openssh-6.2p2.tar.gz
bzr會問你這是一個single binary, indep binary, multiple binary, library, kernel module, kernel patch or cdbs?
就選single binary(如下圖),


dh-make會先幫你建立一個opepssh的資料夾,裡面其實就是下載的那個tarball解開!
進到openssh資料夾,你會發現裡面會有另外一個debian資料夾,
這個資料夾裡面通通都是build debian package所需要的file,
有幾個file蠻重要的,
像是control, changelog, docs,
這些就是dh_make幫我們建好的template,既然是template,
所以就有些欄位要改掉!不過都是一些基本的information,所以這裡就不一一介紹!

接著就要開始build,
build其實是靠debian/rule來trigger,
rule裡面要放一些dh_autoconfiguration, dh_install, dh_xxxx.....etc,
一堆的command,
不過template已經幫我們建立好了dh $@,我們就不用一一處理!

在開始build之前,
有個比較dirty的事情要先做,
前面不是有說要設定--sysconfdir嗎?
debian的practice是透過override_dh_auto_configure去做,
override_dh_auto_configure會幫我們把要帶的參數再帶給./configure,
但偏偏我怎麼試都帶不過去,最後只好用dirty的方式,
就是去找到source code,去硬改sysconfdir的位置,
預設會是/etc,
但我想要放在/etc/ssh底下,
那個source code位置就在/usr/share/perl5/Debian/Debhelper/Buildsystem/autoconf.pm,
找到下面這行,把/etc再改成我要的...
push @opts, "--sysconfdir=/etc";
那因為這方法真的蠻dirty的,如果有哪位大大知道該怎麼正確的透過override_dh_auto_configure去設定,
歡迎告訴我~


最後就可以用debuild build了
後面帶的參數意思就是不要sign source pacakge and .changes files,
debuild -uc -us -B


最後說明一下另一個command,
這command可以來看package裡面有些什麼!
lesspipe openssh-6.2p2.deb
可以拿這command來簡單的驗證一下build有沒有成功!

















read more »


How to build Android image?

24 February 2014

因緣際會下,剛好有機會可以練習如何build android source code,
(是android source code!不是app!)

不過練習完以後,發現其實build android真的很簡單!
難的在於prepare build environment.....
所以這篇會從頭做起,從一個完全乾淨的ubuntu 12.04開始做起!



1. install ubuntu 12.04

第一步就是去下載ubuntu 12.04 64 bits
要裝server版或者是desktop版都可以,
安裝desktop版的好處就是你build好image的時候,
要測試很簡單!
像我是用server版build,因為沒有x-window,我也不想再裝!
就只好把build好的image抓出來,抓到我自己的mac上,
然後透過emulator來測試!


2. install add-apt-repository

剛安裝完的ubuntu預設是沒有add-apt-repository這個package的,
所以得手動安裝,請安裝下列兩項packages
sudo apt-get install software-properties-common
sudo apt-get install python-software-properties


3. install sun-java6-sdk

那因為不能用openjdk build android,
所以得換成sun(oracle)的版本,
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer


4. install required packages

安裝一些必要的packages,
sudo apt-get install git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so


5. Configuring USB Access

因為linux預設無法access到USB device,
所以得加一些udev的rule,
先在udev底下建立一個檔案,
sudo vim /etc/udev/rules.d/51-android.rules

然後貼入下列的內容!注意!!請把owner改成你自己的ubuntu user name!
# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="ken"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="ken"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="ken"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="ken"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="ken"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="ken"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="ken"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="ken"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="ken"
# adb protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="ken"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="ken"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="ken"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="ken"
# adb protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="ken"
# fastboot protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="ken"
# adb protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="ken"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER=“ken"


6. install Repo

接著要安裝Repo這個tool,
Repo是一個讓你可以輕鬆使用git的tool,

先在你的home目錄建立一個bin目錄,
mkdir ~/bin
PATH=~/bin:$PATH

開始下載repo tool
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo


7. Initialize a Repo client and Download Android source

安裝好repo以後,就開始來設定他,
首先先建立一個資料夾,這資料夾準備用來存android source code,
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY

接著就init,其實就跟git差不多,
最後-b的意思就是checkout哪個branch的意思,
repo init -u https://android.googlesource.com/platform/manifest -b android-4.4.2_r2


設定完repo以後,就開始下載android source吧!
repo sync

8. change the default shell environment

完成下載以後,在開始build之前,還有一些要設定,
ubuntu的預設的shell是dash,
那據說用dash build會fail,
所以要把它換成bash,就使用下面的指令,
使用以後,就選No!就完成了!
sudo dpkg-reconfigure dash


9. Initialize build environment

接著就要initialize你的build environment,
很簡單,靠下面一個script就可做到,
. build/envsetup.sh


10. Choose a Target

接著就要選擇你要build的target,
有很多種可以選,可以來這看(點我
那因為我們等等是用emulator去做測試,
所以我們是選擇aosp_arm-eng!
lunch aosp_arm-eng


11. build code

接著就可以開始build,
直接下make就可以build,後面會帶一個參數是-jN,
N是一個數字,通常取決於你的hardware thread的數量!
build還蠻花時間的,我的機器在沒有做cache的情況下,build了差不多2小時..
所以耐心等待吧!
make -j4

build成功以後,應該會看到下面的字樣,
Install system fs image: out/target/product/generic/system.img 
out/target/product/generic/system.img+ maxsize=588791808 blocksize=2112 total=576716800 reserve=5947392


12. Test

接著就要來測試剛剛build好的image是否可以使用,
如果你是使用desktop的ubuntu,
理論上你只要下下面的指令就可以測試,
emulator

但剛好我是使用server版本去build...
我又懶得裝ubuntu-desktop,
我就只好抓回來我的mac環境來測試!
注意!前提是你的mac環境已經有android-sdk,而且你也把system.img也抓回來了!

首先請先建立一個avd,就是emulator,
注意!emulator的api level要是19!
為什麼呢?
因為我們剛剛checkout branch的時候是4.4.2!
你可以利用下面的指令來建立一個avd,
cd ~/your_android_sdk_dir/tools
./android create avd -n test-emulator -t 15 -c 100M --abi armeabi-v7a

接著就把你的system.img複製到剛剛建立的avd資料夾下!
只要搬到該資料夾下,等emluator啟動時,就會試著去load那個system.img!
cp system.img ~/.android/test-emulator

啟動emulator
./emulator -avd test-emulator

理論上看到android字樣的開機畫面,應該就代表build成功了!


















read more »