2013-01-22 34 views
12

我們可以使用AWS::CloudFormation::Init在啓動實例後執行命令並上傳文件。但是有沒有人知道這個操作的內部(來自亞馬遜的方面)?AWS :: CloudFormation :: Init它是如何工作的?

當我們傳入一個模板時,文件或命令傳輸到VM的位置是什麼時候?這是Xen功能(通過特殊管道)還是通過網絡?

"Resources": { 
    "MyInstance": { 
    "Type": "AWS::EC2::Instance", 
    "Metadata" : { 
     "AWS::CloudFormation::Init" : { 
     "config" : { 
      "packages" : { 
      : 
      }, 
      "sources" : { 
      : 
      }, 
      "commands" : { 
      : 
      }, 
      "files" : { 
      : 
      }, 
      "services" : { 
      : 
      }, 
      "users" : { 
      : 
      }, 
      "groups" : { 
      : 
      } 
     } 
     } 
    }, 
    "Properties": { 
     : 
    } 
    } 
} 

回答

26

創建AWS :: CloudFormation ::初始化資源作爲元數據,以EC2實例不會導致實例本身做任何事情。

對於實際執行該資源中指定的所有操作的實例,它必須運行cfn-init命令行工具。在Amazon EC2 AMI上,該命令已安裝在/opt/aws/bin/cfn-init。該命令需要幾個選項,其中包括AWS :: CloudFormation :: Init資源的名稱,EC2服務器資源的名稱以及您正在運行的區域。您還需要提供AWS安全證書。

如果您希望在創建新實例時自動運行(我確實這樣做了),您必須使用EC2實例的UserData創建一個shell腳本,該腳本將在第一次啓動時運行該實例,並將其中的cfn-init命令。

我在我的博客written about this specific issue最近。

+1

謝謝,這真的是非常有用的信息。但是我仍然想知道,它是如何工作在cfn-init後面的(這些命令和文件如何通過網絡或其他虛擬設備傳輸到虛擬機?) – SoYoung

+1

cfn-init向Amazon地址發出HTTP請求以獲取資源中的數據。然後它執行模板中指定的操作。模板在哪裏?在亞馬遜控制的服務器上的某處。 –

+0

那麼,所有這些行動都基於網絡?這聽起來很合理,但仍有一些不方便的情況。如果我不想打開SecurityGroup出於安全原因(只有22端口),自動部署我的應用程序將會是一個問題。說實話,我希望他們通過特殊的管道或設備(在xen)傳播。任何方式,感謝您的幫助! – SoYoung