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