CloudFormation - 雲端資源建置自動化

AWS, TheCloudResumeChallenge

Cloud Resume Challenge CloudFormation

組裝一個 IKEA 衣櫃不算太複雜的任務。但如果需要在一小時內組裝一千個呢?這是為什麼我們需要自動化,用電腦幫人類處理重複性高且不需要複雜判斷的任務。

CloudFormation 是 AWS 提供的服務中的一個,能讓我們用 JSON 或 YAML 格式來部署所需要的 AWS 資源。有點像虛擬模具,用滑鼠點確認後能幫我們生出配備完全相同的高性能桌機、或在桌上端出跟去年完全一樣種類跟味道的年菜?

這個服務的好處是,我們可以先用 JSON 或 YAML 來設定 Template,CloudFormation 讀取 Template 後生成所需服務的集合體 Stack 來部署所需要的資源,如:EC2、VPC、RDS…等。除了建立新的服務,當然也能讀取 Template版本之前的差異進行變更或刪除 Stack 中的服務資源。

 


 

CloudFormation 建置步驟 #

Cloud Resume Challenge 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 使用 定義資料結構、JSON用 {} 和 [],YAML使用空格縮排定義資料結構。因此相較於兩位前輩 YAML 在 IaC 資源配置的世界裡有很高的人氣。

<?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 定義所需要設置的服務 #

Cloud Resume Challenge CloudFormation

當用 Template 來定義時、不只在能讓我們對要設置的資源進行詳細確認、在事後需要修正或是清除時也能完整將不需要的資源移除。除了參考 AWS 官方文件來設置 Template, CloudFormation也有內建的 Designer能幫助我們進行設計。(參考②)

Cloud Resume Challenge CloudFormation

以下用建立新的 S3 Bucket 舉例,CloudFormation Template如下:

---
Resources:
  S3Bucket:
    Type: 'AWS::S3::Bucket'
    DeletionPolicy: Retain
    Properties:
      BucketName: MY-LOVELY-BUCKET

將上面的template上傳至 S3複製連結後,回到 CloudFormation → Create stack → Specify an Amazon S3 Template URL ,確認後 CloudFormation 就會幫我們生成所需的各種資源,也能透過 console來確認各資源的建置狀況。

Cloud Resume Challenge CloudFormation

Double Check Template中的資源設置 #

現實中設置資源之前,除了用肉眼進行確認,也有許多不同的工具能幫助我們檢查。如TaskCat,是一個 AWS QuickStart 小組開發的開源工具。除了能檢查 Template 在不同地區可能會遇到的問題外、也能生成測試報告回報問題,讓我們在在建置資源前多一份確認。或者像 cfn-nag ,由第三方開發的開源工具。能針對資源設置內容進行可能的安全性確認。(參考③)

Cloud Resume Challenge CloudFormation

 


 

下一步:Terraform? #

各大雲服務都有自己版本的 CloudFormation,GCP有 Deployment Manager,Azure有 Resource Manager。然而當服務被架構在不同的雲服務或是私人雲端網路上時,該如何是好呢?

完成 #cloudResumeChallenge之後的目標就是玩玩 開源中立的平台 Terraform 。(參考④)

  1. Controlling access with AWS Identity and Access Management
  2. Template reference
  3. 【AWS Black Belt Online Seminar】AWS CloudFormation
  4. Terraform