CloudFormation - 雲端資源建置自動化
組裝一個 IKEA 衣櫃不算太複雜的任務。但如果需要在一小時內組裝一千個呢?這是為什麼我們需要自動化,用電腦幫人類處理重複性高且不需要複雜判斷的任務。
CloudFormation 是 AWS 提供的服務中的一個,能讓我們用 JSON 或 YAML 格式來部署所需要的 AWS 資源。有點像虛擬模具,用滑鼠點確認後能幫我們生出配備完全相同的高性能桌機、或在桌上端出跟去年完全一樣種類跟味道的年菜?
這個服務的好處是,我們可以先用 JSON 或 YAML 來設定 Template,CloudFormation 讀取 Template 後生成所需服務的集合體 Stack 來部署所需要的資源,如:EC2、VPC、RDS…等。除了建立新的服務,當然也能讀取 Template版本之前的差異進行變更或刪除 Stack 中的服務資源。
CloudFormation 建置步驟 #
取得建立資源所需要的IAM權限 #
因為CloudFormation能方便我們批次建立或變更 AWS 上的資源,Policy的設置和使用者權限的規劃就變得非常重要。舉例來說,下方的 Policy 範例可以提供相對應的使用者和群組瀏覽 CloudFormation Stack 但無法進行變更。
{
"Version":"2012-10-17",
"Statement":[{
"Effect":"Allow",
"Action":[
"cloudformation:DescribeStacks",
"cloudformation:DescribeStackEvents",
"cloudformation:DescribeStackResource",
"cloudformation:DescribeStackResources"
],
"Resource":"*"
}]
}
加上以下的內容就可以擁有 SQS 所有的權限和 建立瀏覽 CloudFormation Stack的權限。需要建立 EC2 或 S3 等當然也需要相對權限,詳細權限設定還是得根據需求和參考文件進行縝密的設定。(參考①)
{
"Version":"2012-10-17",
"Statement":[{
"Effect":"Allow",
"Action":[
"sqs:*",
"cloudformation:CreateStack",
"cloudformation:DescribeStacks",
"cloudformation:DescribeStackEvents",
"cloudformation:DescribeStackResources",
"cloudformation:GetTemplate",
"cloudformation:ValidateTemplate"
],
"Resource":"*"
}]
}
JSON 和 YAML #
JSON是基於Javascript的一種資料儲存傳送格式,最常被用於伺服器傳送資料給瀏覽器的網頁程式,因為和前端相容性高又方便閱讀,已經取代XML成為最常使用的交換格式。相對於 XML 使用
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
{
"employees":[
{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"},
{"firstName":"Peter", "lastName":"Jones"}
]
}
{a: 1, b: {c: 3, d: 4}}
or
a: 1
b:
c: 3
d: 4
建立 Template 定義所需要設置的服務 #
當用 Template 來定義時、不只在能讓我們對要設置的資源進行詳細確認、在事後需要修正或是清除時也能完整將不需要的資源移除。除了參考 AWS 官方文件來設置 Template, CloudFormation也有內建的 Designer能幫助我們進行設計。(參考②)
以下用建立新的 S3 Bucket 舉例,CloudFormation Template如下:
---
Resources:
S3Bucket:
Type: 'AWS::S3::Bucket'
DeletionPolicy: Retain
Properties:
BucketName: MY-LOVELY-BUCKET
- Resources: 需要設置的服務、種類與設定
- Outputs: 設置完成後的輸出內容
將上面的template上傳至 S3複製連結後,回到 CloudFormation → Create stack → Specify an Amazon S3 Template URL ,確認後 CloudFormation 就會幫我們生成所需的各種資源,也能透過 console來確認各資源的建置狀況。
Double Check Template中的資源設置 #
現實中設置資源之前,除了用肉眼進行確認,也有許多不同的工具能幫助我們檢查。如TaskCat,是一個 AWS QuickStart 小組開發的開源工具。除了能檢查 Template 在不同地區可能會遇到的問題外、也能生成測試報告回報問題,讓我們在在建置資源前多一份確認。或者像 cfn-nag ,由第三方開發的開源工具。能針對資源設置內容進行可能的安全性確認。(參考③)
下一步:Terraform? #
各大雲服務都有自己版本的 CloudFormation,GCP有 Deployment Manager,Azure有 Resource Manager。然而當服務被架構在不同的雲服務或是私人雲端網路上時,該如何是好呢?
完成 #cloudResumeChallenge之後的目標就是玩玩 開源中立的平台 Terraform 。(參考④)