amazon web services - script - 什麼要烘烤到AWS AMI以及如何使用cloud-init進行配置?




aws user data (2)

我喜歡將機器配置從環境配置中分離出來。

一般來說,我使用以下作為指導:

建設階段

  • 使用Packer等構建基本機器映像,包括運行應用程序所需的所有軟件。 從這個創建一個AMI。
  • 將應用程序安裝到創建應用程序映像的基礎機器映像上。 標記和版本這個工件。 不要像數據庫連接等在這裡嵌入環境特定的東西,因為這可以避免在不同的環境運行時間輕鬆地重複使用AMI。
  • 確保所有服務都停止

發布階段

  • 使用像CFN這樣的東西,創建一個由圖像和紅外圖像組成的環境。
  • 使用Cloud-Init user-data 配置應用程序環境(數據庫連接,日誌轉發等),然後啟動應用程序/服務

這種方法提供了最大的靈活性,並乾淨地分離出連續交付管道的各種問題。

我正在使用AWS Cloudformation為我的Web應用程序設置眾多網絡基礎結構元素(VPC,安全組,子網,自動縮放組等)。 我希望整個過程自動化。 我想點擊一個按鈕,並能夠啟動整個事情。

我成功地創建了一個Cloudformation模板來設置所有這些網絡基礎設施。 然而,EC2實例目前在其上沒有任何需要的軟件的情況下啟動。 現在我正在試圖弄清楚如何最好地在他們的軟件。

為此,我使用Packer.io創建AMI。 但有些人反而要求我使用Cloud-Init。 我應該使用什麼樣的啟發來決定怎樣烘烤AMI和/或通過Cloud-Init配置什麼?

例如,我想預先配置一個EC2實例,允許我( saqib )從我自己的筆記本電腦上無需密碼登錄。 因此,EC2必須有一個用戶。 該用戶必須有一個主目錄。 並且在主目錄中必須存在包含加密代碼的文件.ssh/known_hosts 。 我應該把這些目錄燒成AMI嗎? 還是應該使用cloud-init來設置它們? 而我應該如何決定在這個和其他類似的情況?


決定如何組裝服務器,AMI和基礎架構規劃的重要因素之一是回答這個問題:在生產中,我需要多快才能啟動一個新實例?

這個問題的答案將決定你對AMI的烘烤程度,以及你在啟動之後建立了多少。

注:我的經驗是廚師服務器,所以我將使用廚師的術語,但概念是相同的任何其他配置管理堆棧。

一般的經驗法則是把你的“基礎設施作為代碼”。 這意味著考慮啟動實例的過程,在該機器上創建用戶,以及管理known_hosts文件和SSH密鑰的過程與應用程序代碼一樣。 能夠跟踪源代碼中對基礎結構的更改使得管理更容易,重新部署甚至更容易。

這個廚師介紹涵蓋食譜,食譜,資源等廚師的術語。 它向您展示瞭如何構建一個簡單的LAMP堆棧,以及如何使用一個命令輕鬆地重新啟動它。

所以考慮到你的問題的例子,在高層次,我會做以下幾點:

  • 使用CloudForms腳本啟動基本Ubuntu Linux AMI(當前為14.04)。
  • 在實例配置的UserData部分,引導Chef客戶端安裝過程。
  • 運行一個食譜來創建一個用戶。
  • 運行食譜為用戶創建known_hosts文件

使用像Chef這樣的工具是因為您可以將基礎架構分解成執行特定功能的小塊代碼。 已經有許多Cookbook已經建立並可用 ,它們執行創建服務,安裝軟件包等的基本構建塊。

所有這一切,有時候,為了您的特定領域和要求,您必須偏離最佳實踐。 考慮到基礎設施管理的所有優點,您可能仍然需要將物品烘焙到AMI中。

假設您的應用程序執行圖像處理,並且需要使用ImageMagick。 假設您需要從源代碼構建ImageMagick。 如果你是通過廚師食譜做到這一點,這可能會增加7分鐘的ImageMagick編譯正常的實例啟動時間。 如果等待10-12分鐘太長,新的實例上線,那麼你可能要考慮烘烤自己的AMI已經編譯和安裝的ImageMagick。

這是一個可以接受的解決方案,但是您應該記住,管理自己的預烘烤AMIs會增加額外的基礎架構開銷。 您將需要保持您的自定義AMI更新為新的AMIs,您擴展到不同的實例類型和不同的AWS區域。





cloud-init