原文地址:https://lukeshaughnessy.medium.com/infrastructure-as-code-is-not-the-answer-cfaf4882dcba
以下是譯文
當(dāng)然检痰,你聽過銷售宣傳。如果你在 DevOps、平臺或 SRE 領(lǐng)域工作,那么你可能已經(jīng)自己推銷過它获茬「绍裕基礎(chǔ)設(shè)施即代碼(Infrastructure as Code)!其好處多種多樣且不言自明:
- 它是可復(fù)制的碴萧!
- 它是自文檔化的棵譬!
- 它是可見的显蝌!
- 它可以防止錯誤發(fā)生!
- 它能降低成本订咸!
- 它可以防止偏移(drift)發(fā)生曼尊!
- 它可以避免重復(fù)勞動,增加工作樂趣脏嚷!
- 自助服務(wù)骆撇!
毫無疑問,所有這些事情都可能是真的可以實(shí)現(xiàn)的父叙。在理想的世界里神郊,所有這些好處都將顯而易見肴裙,并且對于愿意投入前期資金將基礎(chǔ)設(shè)施部署轉(zhuǎn)換為代碼和配置管理的任何組織都將大有裨益。而我們大多數(shù)人也確實(shí)如此涌乳。但是蜻懦,那些不在理想世界中的事情呢?采用 IAC 存在哪些實(shí)際成本夕晓、風(fēng)險(xiǎn)和困難宛乃?在現(xiàn)實(shí)的光芒下,華麗銷售宣傳在哪里開始融化了呢蒸辆?讓我們看一下上面提到的一些優(yōu)點(diǎn)征炼,并檢查其中的一些假設(shè)。
它是可復(fù)制的躬贡!
嗯谆奥,有點(diǎn)道理。我會說基礎(chǔ)設(shè)施代碼在一段時(shí)間內(nèi)是非扯阂耍可復(fù)制的 —— 但是隨后...事情變得不穩(wěn)定了。軟件包過時(shí)了空骚。功能被棄用并停止工作纺讲。代碼語法發(fā)生了變化。鏡像不再可用囤屹。Dockerhub 要你付費(fèi)熬甚。某些用戶賬戶已經(jīng)建立,而他們已經(jīng)不再在這里工作了肋坚。許多相互依存的依賴關(guān)系使得部署正常運(yùn)行乡括,但它們隨時(shí)間改變。重點(diǎn)是部署代碼具有一定的壽命智厌,如果你不不斷地更新它诲泌,當(dāng)你突然需要它時(shí),它將不起作用铣鹏。
譯注:意思是雖然基礎(chǔ)設(shè)施的代碼是被版本化的敷扫,是穩(wěn)定的。但是它所依賴的東西卻可能是不穩(wěn)定的诚卸。
它是自文檔化的葵第!
同樣,有點(diǎn)道理合溺。然而卒密,這個論點(diǎn)有幾個缺陷。第一個問題與上面提到的問題有關(guān)棠赛。你的代碼在一段時(shí)間后開始變得陳舊不堪哮奇。這意味著膛腐,第一次查看你的代碼的工程師可能會開始追尋兔子洞,試圖使一些舊模塊在新的云環(huán)境中運(yùn)行屏镊,在那里許多關(guān)于如何完成任務(wù)的假設(shè)已經(jīng)不再適用依疼。我有同事花了數(shù)天時(shí)間來追查失敗的部署,并一步步調(diào)試而芥,因?yàn)樗麄冊诖a中看到的內(nèi)容與現(xiàn)實(shí)不符而感到完全困惑律罢。事實(shí)上,如果他們重新開始編寫新代碼棍丐,可能會更快误辑、更好。
譯注:是代碼就會有代碼質(zhì)量問題歌逢。作者所言的問是他使用的老模板的依賴發(fā)生了變化巾钉,導(dǎo)致老模板的失敗。
第二個問題是秘案,我認(rèn)為代碼真的不適合作為文檔砰苍。我自己寫過代碼,六個月后回來看阱高,我完全想不起我當(dāng)時(shí)做了什么赚导。在編寫代碼時(shí),你可能會使用各種各樣的技巧赤惊、半成品和明顯錯誤的東西吼旧,因?yàn)楹芸赡茉谧龅臅r(shí)候還在學(xué)習(xí)相關(guān)知識∥粗郏回頭再看這些代碼時(shí)圈暗,你會發(fā)現(xiàn)其中存在許多混亂和難以理解的部分≡0颍基礎(chǔ)設(shè)施代碼同樣存在這些問題员串,它可能會包含各種不穩(wěn)定的假設(shè)和方法。這些假設(shè)和方法可能會使其他工程師在查看時(shí)感到困惑或無法理解昼扛。
譯注:只要是代碼昵济,都會遇到同樣的問題。作者說的是代碼的可讀性問題野揪。
它是可見的访忿!
是的,它是可見的 —— 就像我在 CTO 的辦公室角落用西里爾字母噴涂標(biāo)語一樣斯稳。這會很酷也很叛逆海铆,但沒有人知道它說了什么。問題在于代碼挣惰,嗯卧斟,是 代碼殴边。這不是非工程師可以輕易閱讀的內(nèi)容,甚至對于不熟悉 Terraform 或其他技術(shù)的工程師來說也不容易閱讀珍语。理解其中的信息需要實(shí)踐和培訓(xùn)锤岸,有時(shí)即使經(jīng)驗(yàn)豐富的工程師也需要一些時(shí)間才能完全弄清楚所有信息的位置,特別是如果你有很多嵌套文件板乙、依賴項(xiàng)和調(diào)用腳本的腳本是偷。重點(diǎn)是,是的募逞,你可以看到它蛋铆,但這并不意味著你可以迅速或輕松地理解它。
譯注:其實(shí)放接,這并不是什么問題刺啦,我們可以想辦法根據(jù)代碼生成基礎(chǔ)設(shè)施的圖。
它可以防止錯誤發(fā)生纠脾!
或者玛瘸,它可以像氫彈核心周圍的重氫外套一樣放大它們。我曾經(jīng)聽過一個故事苟蹈,說有個工程師在他的筆記本電腦上運(yùn)行了“terraform destroy”命令——但是在錯誤的標(biāo)簽頁上糊渊。他處于“Prod”目錄下,并開始對生產(chǎn)環(huán)境進(jìn)行摧毀汉操。意識到自己的錯誤后再来,他按下了Control-C退出了命令蒙兰,但為時(shí)已晚磷瘤。很多東西已經(jīng)消失了,除此之外搜变,終止進(jìn)程也讓狀態(tài)文件處于混亂狀態(tài)采缚。他們通過手動修復(fù)狀態(tài)文件并重新運(yùn)行terraform來恢復(fù)了它,并在幾個小時(shí)內(nèi)解決了這個問題挠他。但這是一個非常容易犯的錯誤扳抽,任何人都可能會犯。
譯注:作者說的案例是流程上問題殖侵。即使不使用基礎(chǔ)設(shè)施即代碼也會發(fā)生同樣的問題贸呢。但是這個問題從側(cè)面說明的是基礎(chǔ)設(shè)施即代碼需要配上一定的操作流程。
它能降低成本拢军!
如果一切都完美地運(yùn)作楞陷,從不發(fā)生變化,而且您一直做同樣的事情茉唉,那當(dāng)然可以固蛾。但根據(jù)我的經(jīng)驗(yàn)结执,保持代碼更新需要花費(fèi)工程師大量時(shí)間和精力。工程師每天需要花費(fèi)數(shù)小時(shí)進(jìn)行調(diào)試艾凯、故障排除献幔、學(xué)習(xí)和編寫代碼。如果你只是登錄控制臺并點(diǎn)擊一些框趾诗,可能只需要幾分鐘就能完成的任務(wù)蜡感,可能需要數(shù)天的工作才能自動化完成。如果您經(jīng)常使用自己的代碼沧竟,那么它值得投資铸敏。但您需要認(rèn)真考慮自己有多少次實(shí)際上會部署新的RDS實(shí)例或新的Cloudfront分發(fā)?其中許多任務(wù)只需完成一次悟泵,您可能永遠(yuǎn)不會再做了杈笔。你真的需要花費(fèi)數(shù)天時(shí)間來自動化這個過程嗎?
譯注:作者說的是基礎(chǔ)設(shè)施的規(guī)模問題糕非。也就是我們在實(shí)踐基礎(chǔ)設(shè)施即代碼時(shí)蒙具,需要考慮基礎(chǔ)設(shè)施的規(guī)模。
它可以防止偏移(drift)發(fā)生朽肥!
只有當(dāng)您創(chuàng)建代碼以更改環(huán)境中的內(nèi)容時(shí)禁筏,這才是正確的。一旦一個人擁有控制臺的訪問權(quán)限衡招,你就可能會遇到“漂移”問題篱昔。那么這個神經(jīng)病般的罪犯是誰,在控制臺上不斷進(jìn)行變更呢始腾?嗯州刽,有時(shí)候就是你自己。因?yàn)槌霈F(xiàn)了故障浪箭,你需要在負(fù)載均衡器中添加新的證書穗椅,或者因?yàn)槟阏谑艿紻DOS攻擊,需要添加CloudFront分發(fā)來吸收傳入請求奶栖∑ケ恚或者因?yàn)槟阈枰獙⒛承〇|西進(jìn)行規(guī)模擴(kuò)展以處理意外負(fù)載。現(xiàn)在顯然宣鄙,你可以事后回過頭來重新編寫你的代碼袍镀,以反映你所做的更改。這看起來很愚蠢冻晤,但在我的經(jīng)驗(yàn)中苇羡,這種情況在現(xiàn)實(shí)世界中經(jīng)常發(fā)生。
譯注:作者說的基礎(chǔ)設(shè)施即代碼中經(jīng)常遇到的問題:界面操作先于代碼操作明也。這種情況在實(shí)際情況會有發(fā)生宣虾,但是要看頻繁程度和規(guī)模惯裕。如果經(jīng)常發(fā)生,且界面上進(jìn)行大量的操作绣硝,那么蜻势,這其實(shí)需要在流程上控制,且說明之前的基礎(chǔ)設(shè)施的設(shè)計(jì)就存在問題鹉胖。
它可以避免重復(fù)勞動握玛,增加工作樂趣!
你想處理一些瑣碎乏味的任務(wù)嗎甫菠?比如將Terraform 0.10版本升級到1.3版本挠铲?這個過程中有相當(dāng)多的語法變化,盡管一些自動化工具可以幫助處理寂诱。但是舊版本的Terraform需要很多奇怪的解決方法拂苹,而這些問題在新版本中已得到改進(jìn)并增加了新功能。因此痰洒,僅僅使用自動化工具來重新處理語法是不夠的瓢棒,你需要全面重構(gòu)整個代碼庫。我有同事已經(jīng)進(jìn)行了一年以上的Terraform遷移工作丘喻。這是一個需要投入許多工程師小時(shí)數(shù)才能更新的巨大工作脯宿。有時(shí)候很難說服老板這么做,特別是如果你已經(jīng)消耗了所有的好感度以及花費(fèi)幾個月時(shí)間創(chuàng)建代碼泉粉。
譯注:這段文本談到了如何將Terraform代碼庫從0.10版本升級到1.3版本连霉,需要進(jìn)行全面重構(gòu)和大量工程師時(shí)間的投入。此外嗡靡,這也涉及到舊版本的一些語法變化和解決方案跺撼,而新版本已經(jīng)增加了新功能和改進(jìn)。這種更新過程可能會被認(rèn)為是瑣碎乏味的任務(wù)叽躯,但它是必要的财边,因?yàn)樗梢蕴岣叽a質(zhì)量和可維護(hù)性肌括。然而点骑,向老板證明這種更新的必要性有時(shí)可能很難,尤其是當(dāng)團(tuán)隊(duì)已經(jīng)花費(fèi)了大量時(shí)間創(chuàng)建代碼并消耗了所有好感度時(shí)谍夭。
自助服務(wù)黑滴!
平臺團(tuán)隊(duì)的終極目標(biāo)是為整個公司打造一個自助PAAS(平臺即服務(wù))系統(tǒng)。所有基礎(chǔ)設(shè)施和服務(wù)都經(jīng)過了徹底的自動化紧索,以至于非DevOps工程師可以拉取git存儲庫袁辈,編輯一些模板文件,然后將其推回珠漂,并且你的CI/CD系統(tǒng)會自動部署它們晚缩。所有的日志記錄尾膊、警報(bào)、指標(biāo)和安全策略都已經(jīng)內(nèi)置荞彼。我真的很喜歡這個想法冈敛,我正在努力讓我的當(dāng)前公司達(dá)到這個狀態(tài)。但這又與現(xiàn)實(shí)相沖突鸣皂。例如抓谴,我們曾經(jīng)有一個非常復(fù)雜的自動化系統(tǒng)來管理Github中的用戶賬戶。我們會編輯文件寞缝,將它們推送到CI中癌压,然后用戶和repo就會被填充。然而荆陆,我們意識到這是不必要的復(fù)雜性滩届,顯著減緩了新員工的入職進(jìn)度,因?yàn)樗麄冃枰却夹g(shù)人員編輯自動化文件被啼。直接確保團(tuán)隊(duì)經(jīng)理經(jīng)過審核并接受了安全策略的培訓(xùn)并獲得直接訪問Github丐吓,比起使用自動化管理用戶賬戶更容易快速。我們相信他們會正確地點(diǎn)擊來添加新賬戶并授予權(quán)限趟据。
譯注:作者舉了一個Github用戶授權(quán)管理的例子券犁,想說明的是并不是基礎(chǔ)設(shè)施并不一定要所有都通過“Code”來實(shí)現(xiàn),有時(shí)通過界面點(diǎn)點(diǎn)可能效率更高汹碱。
總結(jié)
這是否意味著我們放棄IAC的整個想法而重新回到在控制臺上點(diǎn)擊操作呢粘衬?當(dāng)然不是。我認(rèn)為這是最好的答案咳促。就像過去的好主意一樣——比如敏捷開發(fā)稚新、Scrum、DevOps跪腹、無服務(wù)器計(jì)算褂删、微服務(wù)——它們都可以帶來很大的價(jià)值。你不能固執(zhí)地認(rèn)為你必須全身心地致力于這個想法冲茸。IAC有其使用場景屯阀,但僅僅是一個使用場景而已。并非每種情況都相同轴术,總存在一些魔鬼般的細(xì)節(jié)需要應(yīng)對难衰。一個好的工程師或工程經(jīng)理會知道何時(shí)該放棄自動化完美的柏拉圖式理念,允許人們在必要時(shí)靈活一些逗栽。