AWS Elastic Beanstalk.輕鬆建構雲端應用程式
文/柳百郁 2012/11/5 上午 10:24:28
Amazon提供的網路服務AWS(Amazon Web services),提供了友善的Web介面『AWS Management Console』,供使用者管理AWS雲端下的服務。AWS Management Console管理控制台下的Elastic Beanstalk,則可以讓使用者用更快速、更便捷的方式佈署與管理自已的應用程式(包括其下的一些雲端資源),無須自行建構應用程式底層所需要的基礎架構。只要幾個步驟,Elastic Beanstalk便能自動管理可用性配置、負載平衡、自動擴充與應用程式狀態監控。
Elastic Beanstalk提供的項目,含括現今市場上的三大主流:
.給 .NET開發人員:一如使用Microsoft Visual Stuiod建立自有應用程式,你也可以用AWS Toolkit for Visual Studio將應用程式發表至AWS Elastic Beanstalk。或者是打包成Microsoft Web Deploy的zip檔,透過AWS Management Console上傳到AWS Elastic Beanstalk。這部份背後所使用的環境是Windows Server 2008 R2與IIS 7.5。
.給PHP與Python開發人員:使用者可以透過AWS Management Console、命令列介面,或web服務API,建立Elastic Beanstalk PHP或Python環境。只要安裝並設定Git進行部署,之後便可以透過Git提交與進行變更。這部份佈署時所執行的環境為Apache HTTP Server。
.給Java開發人員:將套件打包成可佈署的程式碼-也就是標準的 Java Web Application Archive(WAR 檔)。使用者可以透過AWS Management Console、AWS Toolkit for Eclipse、web服務API或命令列介面上傳WAR檔。這些佈署與配置WAR檔的動作,背後執行環境為Apache Tomcat應用程式伺服器。
上述三種環境皆可建立客製化的URL,例如:http://.elasticbeanstalk.com/。AWS Elastic Beanstalk針對Java應用程式的版本僅支援單一 WAR 檔,而對PHP、.NET與Python的應用也僅支援單一ZIP檔,檔案大小限制皆為250MB。
簡而言之,Elastic Beanstalk是一套由AWS Management console、Git佈署與命令列介面、AWS Toolkit for Visual Studio與AWS Toolkit for Eclipse這些工具組合而成的好用介面。本文將使用AWS DevTools(命令列介面)介紹使用Fedora(Linux)作業系統,透過本機上傳自有應用程式的過程,並以AWS Management Console(圖形介面)說明應用程式後續的更新。方便讀者可比較並挑選出適合的方式,在AWS下佈署自有應用程式。
命令列模式:透過 eb 與 Git 佈署 PHP 應用程式
一、安裝預備軟體並初始化Git軟體倉儲:
下載Git程式(必須為1.6.6以上版本)安裝在本機電腦上。本文測試環境的機作業系統為Fedora,因此還必須下載Ruby 1.8.7以上版本(http://www.ruby-lang.org/en/);如使用Windows作業系統,則需下載PowerShell 2.0(Windows 7與Windows Server 2008 R2皆已內附此程式)。完成這些套件的下載後,在切換到想要安裝命令列介面的目錄下,執行初始化Git軟體倉儲:
# yum install git ruby <= 使用yum安裝git與ruby套件,由yum程式自動解決相依性問題,此處安裝的git版本為1.7.11、ruby版本為1.9.3
# cd /opt/wordpress/ <=切換至自有應用程式開發目錄下
# git init . <= 初始化git軟體倉儲
Reinitialized existing Git repository in /opt/wordpress/.git/
Git
從小型公司至大型企業都適用分散式版本控制系統,為自由、開放源碼軟體。號稱比Subversion、CVS、Perforce和Clearcase這類SCM工具還好用、功能更多。
官方網站:http://git-scm.com/
二、本機開發與測試
# git add index.php
# git commit -m "initial check-in"
新增檔案index.php並提交之。
三、組態應用程式
命令列工具程式AWS DevTools下載後即可使用,無須執行安裝動作。此工具程式乃由第三方開發人員所貢獻(非AWS),AWS提供檔案下載連結與說明文件。執行eb初始化命令後,Elastic Beanstalk會提示相關訊息,若要使用預設值,按Enter即可。首先要你輸入的AWS access key與secret access key,只要連結至https://aws-portal.amazon.com/gp/aws/securityCredentials便可取得(需登入AWS)相關資訊。
執行流程簡述如下:
# wget https://s3.amazonaws.com/elasticbeanstalk/cli/AWS-ElasticBeanstalk-CLI-2.1.zip
# unzip AWS-ElasticBeanstalk-CLI-2.1.zip
# /opt/AWS-ElasticBeanstalk-CLI-2.1/eb/linux/python2.7/eb init <= 初始化
To get your AWS Access Key ID and Secret Access Key,
visit "https://aws-portal.amazon.com/gp/aws/securityCredentials".
Enter your AWS Access Key ID: AKIA------A
Enter your AWS Secret Access Key: yGJz-------------f
Select an AWS Elastic Beanstalk service region.
Available service regions are:
1) US East (Virginia)
2) US West (Oregon)
3) US West (North California)
4) EU West (Ireland)
5) Asia Pacific (Tokyo)
Select: (1 to 5): 1
Enter an AWS Elastic Beanstalk application name (auto-generated value is "wordpress"): wp34
Enter an AWS Elastic Beanstalk environment name (auto-generated value is "wp34-env"): <= 環境名稱則視上一個問題所輸入的應用程式名稱而定,皆可自行變更。
Select a solution stack.
Available solution stacks are:
1) 32bit Amazon Linux running PHP 5.3
2) 64bit Amazon Linux running PHP 5.3
3) 64bit Windows Server 2008 R2 running IIS 7.5
4) 32bit Amazon Linux running Tomcat 7
5) 64bit Amazon Linux running Tomcat 7
6) 32bit Amazon Linux running Tomcat 6
7) 64bit Amazon Linux running Tomcat 6
8) 32bit Amazon Linux running Python
9) 64bit Amazon Linux running Python
Select: (1 to 9): 2
首先,透過wget取得此命令列工具程式,再以unzip程式將該檔案解開。輸入eb的絕對路徑(亦即檔案解開所在的完成目錄)即可執行eb相關動作。最後,在解決方案的軟體堆疊裡選擇你所要使用的基礎架構,eb初始化便完成。eb指令透過Access Key ID與Secret Access Key辯識使用者身份,為了日後使用方便,可以將這兩個變數存在檔案裡,只要將檔案權限設定妥當,就比較沒有安全性上面的疑慮。你可以將檔案內容設定為:
AWSAccessKeyId=Write your AWS access ID
AWSSecretKey=Write your AWS secret key
再將這個檔案的權限設定為600(只有擁有者可讀寫,群組與其它人皆無讀、寫與執行的權限),之後再將該檔案匯出至AWS_CREDENTIAL_FILE環境變數(export AWS_CREDENTIAL_FILE=<上面提供ID與Key內容的檔案名稱>),讓eb命令列工具程式可以找到這些資訊。
預設狀態下,AWS Elastic Beanstalk會將服務終端URL設定為美東區域(US-East (Northern Virginia):(us-east-1)的elasticbeanstalk.us-east-1.amazonaws.com,這部份可使用export ELASTICBEANSTALK_URL=的指令變更之。如須設定成其它區域,參考表格如下:

執行eb init,則可變更初始化環境變數,使用者只須在不要變更的部份按下Enter,在必要之處輸入變更的資訊即可。
四、將應用程式佈署到AWS Elastic Beanstalk
在命令列模式下,執行eb start。這個動作可能會花上幾分鐘時間,若想停止只要按 Ctrl+C 即可,若環境狀態為綠燈,此處便會輸出應用程式的 URL,只要複製貼上就能看到你的應用程式:
# /opt/AWS-ElasticBeanstalk-CLI-2.1/eb/linux/python2.7/eb start
Starting application "wp34".
Environment "wp34-env" already exists. Skipped creating.
Application is available at "wp34-env-rppwmnkenw.elasticbeanstalk.com".
五、更新應用程式
當應用程式有所變更,只要提交變更部份,再重新佈署新的應用程式版本到既有的AWS Elastic Beanstalk環境下即可:
# git add index.php
# git commit -m "my third check-in"
# git aws.push <=將更新的應用程式上傳至AWS的軟體倉儲(repository)
當應用程式開發完成或之後更新,都必須將之上傳至軟體倉儲才算整個完成。git push為透過git將應用程式上傳至git軟體倉儲的標準用法;git aws.push是在安裝Elastic Beanstalk命令列工具程式之後所產生的選項功能,用來指定將應用程式上傳至AWS軟體倉儲。
圖形模式:透過瀏覽器(Web介面)更新應用程式
除了命令列模式外,你也可以使用較友善的圖形介面更新應用程式。只要在AWS Management Console左上方Service選單處選擇Elastic Beanstalk(或在瀏覽器下輸入https://console.aws.amazon.com/elasticbeanstalk/),便能進入Elastic Beanstalk管理頁面。
Elastic Beanstalk管理介面可粗略分為兩個部份,上半部為應用程式的相關細節,例如應用程式建立的日期、應用程式相關事件(Events)與版本細節(Version),完整記錄你每一次更新應用程式的資訊。下半部則為環境細節,也就是與應用程式基礎架構相關的部份,例如網址(URL)、執行中的應用程式版本、作業系統與底層執行程式版本(Container)、環境下的CPU、封包統計與環境事件(Events)等。
若要更新應用程式,只要選擇右上角的「Upload New Version」鍵,便能開啟更新應用程式版本的對話視窗:

▲ 上傳新版本應用程式
Version Label為必要資訊欄位,請輸入應用程式的版本編號。上傳的應用程式則是在本機中選擇打包好的.WAR或.ZIP檔。使用者可以選擇只要上傳不佈署或是上傳後直接布署到現有環境裡。之後佈署完成,便可以在Elastic Beanstalk管理介面中的環境細節裡檢視執行狀況,綠色代表成功佈署,一切正常。在Environment Detail裡提供的URL供使用者直接點選連結,檢視自有應用程式的畫面。若未佈署成功,你可以點選Environment Detail裡的Events頁面,看看是不是有值得參考的錯誤訊息。
結論
AWS提供多種方式,讓使用者選擇習慣與方便使用的環境連結並管理自有的應用程式。本文所介紹由第三方所開發的eb工具程式在連結與處理速度感覺上比圖形介面快很多,但較容易因本機端作業系統與套件版本差異而出現意料之外的問題,佈署失敗與更新不成功的機率相對較高。