在今天的文章中,我整理出了大量當(dāng)初曾經(jīng)錯過、而至今仍將我追悔莫及的Amazon Web Services(簡稱AWS)使用心得。在幾年來的實踐當(dāng)中,我通過在AWS之上新手構(gòu)建及部署各類應(yīng)用程序而積累到了這些經(jīng)驗。雖然內(nèi)容有些雜亂,但相信仍然能給各位帶來一點啟示。
從物理服務(wù)器向“云環(huán)境”轉(zhuǎn)移的過程不僅僅是一項技術(shù)任務(wù),同時也意味著我們的思維方式需要作出針對性的轉(zhuǎn)變??傮w而言,在物理環(huán)境下我們需要關(guān)注的只是每一臺獨立主機; 它們各自擁有自己的靜態(tài)IP,我們能夠?qū)ζ浞謩e加以監(jiān)控。而一旦其中一臺發(fā)生故障,我們必須盡大可能讓其快速恢復(fù)運轉(zhuǎn)。大家可以以為只要將基礎(chǔ)設(shè)施轉(zhuǎn)移到AWS環(huán)境之下,就能直接享受到“云”技術(shù)帶來的種種收益了。遺憾的是,事情可沒那么簡單(相信我,我親身嘗試過了)。在AWS環(huán)境之下,我們必須轉(zhuǎn)變思維,而且這方面的任務(wù)往往不像技術(shù)難題那么容易被察覺。因此,受到了SehropeSarkuni最近一篇帖子的啟發(fā),我將自己幾年來積累得出的AWS 使用心得匯總于此,而且說實話、我真希望自己當(dāng)初剛剛接觸AWS時能有人告訴我這些寶貴經(jīng)驗。這些心得總結(jié)自我在AWS之上部署個人及工作應(yīng)用程序時的親身感受,其中一部分屬于需要高度關(guān)注的“疑難雜癥”(我自己就是直接受害者),而另一部分則是我聽其他朋友說起過、并隨后親自確認(rèn)有效的解決方案。不過總體而言,為了積累這些經(jīng)驗,我確實付出了相當(dāng)慘痛的代價:)
應(yīng)用程序開發(fā)
千萬不要把應(yīng)用程序狀態(tài)保存在自己的服務(wù)器上。
之所以這么說,是因為一旦我們的服務(wù)器發(fā)生故障,那么應(yīng)用程序狀態(tài)很可能也隨之徹底消失。有鑒于此,會話應(yīng)當(dāng)被存儲在一套數(shù)據(jù)庫(或者其它某些集中式存儲體系、memcached或者redis當(dāng)中)而非本地文件系統(tǒng)內(nèi)。日志信息應(yīng)當(dāng)通過系統(tǒng)日志(或者其它類似方案)進(jìn)行處理,并被發(fā)送至遠(yuǎn)程位置加以保存。上傳內(nèi)容應(yīng)當(dāng)直接指向S3(舉例來說,不要將其存儲在本地文件系統(tǒng)內(nèi),并通過其它流程隨后遷移到S3)。再有,任何已經(jīng)處理過或者需要長期運行的任務(wù)都應(yīng)該通過異步隊列(SQS非常適合處理此類任務(wù))來實現(xiàn)。
編輯點評:對于S3上傳內(nèi)容而言,HN用戶Krallin指出,我們可以徹底避免其與自有服務(wù)器的接觸,并利用預(yù)簽名URL保證用戶的上傳數(shù)據(jù)被直接發(fā)送至S3當(dāng)中。
將額外信息保存在日志當(dāng)中。
日志記錄通常包含有時間戳以及pid等信息。大家也可能希望將實例id、服務(wù)區(qū)域、可用區(qū)以及環(huán)境(例如分步環(huán)境或者生產(chǎn)環(huán)境等)添加進(jìn)來,而這些都能在日后的調(diào)試工作中作為參考。大家可以從instance metadata service當(dāng)中獲取到這些信息。我所采用的方法是將這些信息作為引導(dǎo)腳本的組成部分,并將其以文件形式存儲在文件系統(tǒng)當(dāng)中(例如/env/az或者 /env/region等)。這樣一來,我就用不著持續(xù)查詢元數(shù)據(jù)服務(wù)來獲取這些信息了。大家應(yīng)當(dāng)確保這些信息能夠在實例重新啟動時得到正確更新,畢竟我們都不希望在保存AMI時發(fā)現(xiàn)其中的數(shù)據(jù)還跟上次完全一樣,這肯定屬于非正常狀況。
如果我們需要與AWS進(jìn)行交互,請在當(dāng)前語言中使用對應(yīng)SDK。
千萬不要試圖自己動手。我當(dāng)初就犯過這個錯誤,因為我認(rèn)為自己只是單純需要向S3上傳內(nèi)容,但隨著后續(xù)服務(wù)的持續(xù)增加、我發(fā)現(xiàn)自己的決定簡直愚蠢至極。AWS SDK的編寫質(zhì)量很高,能夠自動處理驗證、處理重試邏輯,而且由Amazon官方負(fù)責(zé)維護(hù)與迭代。此外,如果大家使用EC2 IAM角色(大家絕對應(yīng)該這么做,這一點我們后面會進(jìn)一步提到),那么該SDK將幫助我們自動獲取到正確的證書。
利用工具查看應(yīng)用程序日志。
大家應(yīng)當(dāng)采用管理員工具、系統(tǒng)日志查看器或者其它方案,從而幫助自己在無需在運行中實例內(nèi)使用SSH的方式查看當(dāng)前實時日志信息。如果大家擁有集中式日志記錄系統(tǒng)(我強烈建議大家使用此類系統(tǒng)),那么當(dāng)然希望能在不使用SSH的情況下完成日志內(nèi)容查看任務(wù)。很明顯,將SSH引入正處于運行狀態(tài)的應(yīng)用程序?qū)嵗龝l(fā)諸多弊端。