Cloud Custodian 提供了豐富的過濾器和動作,讓開發者能夠精細化管理雲端資源。過濾器如同 SQL 中的 WHERE 子句,用於篩選特定資源,而動作則定義了對篩選出的資源執行的操作。組合使用過濾器和動作,可以實作各種複雜的資源管理策略,例如自動停止閒置的 EC2 執行個體、刪除未加密的 EBS 磁碟區、標記不符合規範的資源等。透過邏輯運算子(AND、OR)的組合,更能彈性地定義篩選條件,滿足不同場景的需求。Cloud Custodian 也支援標記機制,可以先標記資源,稍後再執行特定操作,例如延遲刪除或通知管理員。此外,自動解除標記機制則可以避免在問題修復後仍執行錯誤操作,提升資源管理效率。

雲端資源管理策略:過濾器與動作的應用

在前面的章節中,我們探討了 c7n 如何將動作和過濾器按照資源型別整理成結構化的組態專案。資源元素決定了策略所要操作的資源型別,而過濾器元素則作為篩選條件,進一步選取特定的資源例項,這與 SQL 查詢中的 WHERE 子句類別似,用於從資料表中篩選特定的列。

過濾器的使用

以下是一個範例策略,它將資源型別設定為 aws.ec2,並使用兩個過濾器來進一步縮小選取範圍,分別是 t2.micro 例項型別和掛載未加密 EBS 磁碟區的例項:

# t2.micro 例項且掛載未加密 EBS 磁碟區
policies:
  - name: ec2-nonencrypted-ebs-volumes
    resource: aws.ec2
    filters:
      - type: instance-attribute
        attribute: instanceType
        key: "Value"
        value: "t2.micro"
      - type: ebs
        key: Encrypted
        value: false

內容解密:

  1. type: instance-attribute:此過濾器用於檢查 EC2 例項的屬性。
  2. attribute: instanceTypekey: "Value":這兩個引數一起用於指定要檢查的例項屬性為 instanceType,並提取其值。
  3. value: "t2.micro":此條件篩選出例項型別為 t2.micro 的例項。
  4. type: ebs:此過濾器檢查與 EC2 例項相關聯的 EBS 磁碟區。
  5. key: Encryptedvalue: false:用於檢查 EBS 磁碟區是否未加密(Encryptedfalse)。

當多個過濾器被指定時,預設情況下它們會被邏輯 AND 連線,也就是說,所有條件都必須為真,才會選取該資源。如果希望選擇符合任一條件的資源,可以使用顯式的 OR 元素,如下所示:

# t2.micro 或掛載未加密 EBS 磁碟區
policies:
  - name: ec2-nonencrypted-ebs-volumes
    resource: ec2
    filters:
      - or:
        - type: instance-attribute
          attribute: instanceType
          key: "Value"
          value: "t2.micro"
        - type: ebs
          key: Encrypted
          value: false

內容解密:

  1. or::此元素定義了一個邏輯 OR 操作,使得只要任一內部條件滿足,資源就會被選取。
  2. 邏輯結構的巢狀使用使得策略具有更高的靈活性。

動作的應用

沒有動作的策略通常僅用於檢測和報告。許多使用者利用 c7n 生成報告資料,但如果沒有動作,c7n 就和其他只做檢測的工具沒什麼不同。c7n 提供了一系列按資源型別分類別的動作,使用者可以根據需要自定義動作。

在 Pull 模式下執行 c7n 策略時(即使用 CLI),執行的許可權取決於提供給使用者的 AWS 憑證許可權。因此,在執行策略前務必謹慎檢查許可權。

在使用 c7n CLI 時,建議始終使用 --dryrun 引數,直到確認策略選擇了正確的資源後再採取實際動作:

# 以 dry-run 模式執行 Cloud Custodian 策略
$ custodian run -s output --dryrun my-policy.yml
2024-03-16 21:43:06,747: custodian.policy:INFO policy:s3 resource:aws.s3 region:us-east-1 count:50 time:6.98

以下策略選取未正確標記的 RDS 資源,並傳送通知給支援團隊:

# Cloud Custodian 策略:報告缺失標籤的 RDS 資源
policies:
  - name: rds-tag-compliance
    resource: rds
    filters:
      - or:
        - "tag:billing": absent
        - "tag:env": absent
        - "tag:owner": absent
    actions:
      - type: notify
        template: rds-tag-compliance
        subject: "[custodian] RDS 缺失標籤"
        from: Cloud Custodian <no-reply@example.com>
        to:
          - jimmyray@example.com
        transport:
          type: sqs
          queue: https://sqs.us-east-1.amazonaws.com/1234567890/cloud-custodian-message-relay

內容解密:

  1. type: notify:此動作用於傳送通知。
  2. template: rds-tag-compliance:指定通知使用的範本。
  3. transport:定義通知的傳輸方式,這裡使用 SQS 佇列進行訊息傳遞。

未來操作與標記機制

有時需要對資源進行標記,以便在稍後執行特定操作。例如,當檢測到中低優先順序問題時,可能會先傳送通知,而在給予足夠的時間讓使用者修復問題後再採取進一步行動。以下策略用於標記未正確標記的 EC2 例項以便稍後終止:

# 標記未標記的 EC2 例項以便終止
policies:
  - name: ec2-mark-term-untagged
    resource: aws.ec2
    filters:
      - or:
        - "tag:billing": absent
        - "tag:env": absent
        - "tag:owner": absent
    actions:
      - type: mark-for-op
        tag: c7n_op
        op: terminate
        days: 4

內容解密:

  1. type: mark-for-op:此動作用於標記資源以便稍後執行特定操作。
  2. tag: c7n_op:指定用於儲存狀態的標籤名稱。
  3. op: terminatedays: 4:表示將在 4 天后對資源執行終止操作。

隨後,可以使用另一個策略來完成終止操作:

# 終止已標記的 EC2 例項
policies:
  - name: ec2-term-marked
    resource: ec2
    filters:
      - type: marked-for-op
        tag: c7n_op
        op: terminate
        tz: utc
    actions:
      - type: terminate

內容解密:

  1. type: marked-for-op:此過濾器用於選取之前被標記為將要執行某個操作的資源。
  2. type: terminate:此動作用於終止符合條件的 EC2 例項。

這種“標記並清理”的工作流程類別似於垃圾回收機制,首先標記需要操作的資源,然後在指定的時間執行相應的操作。

自動解除標記機制

為了避免在問題被修復後仍然對資源執行錯誤的操作,可以定期執行策略檢查問題是否已被修復,並解除對資源的標記。以下是一個每小時執行的策略,用於檢查 EC2 例項是否已新增必要的標籤,並解除標記:

# 每小時檢查並解除已正確標記的 EC2 例項的標記
policies:
  - name: ec2-unmark-tagged
    resource: aws.ec2
    mode:
      type: periodic
      schedule: "rate(1 hour)"
    filters:
      - "tag:billing": present
      - "tag:env": present
      - "tag:owner": present
    actions:
      - type: remove-tag
        tags: ["c7n_op"]

內容解密:

  1. mode.type: periodicschedule::定義策略以固定的時間間隔執行。
  2. type: remove-tag:此動作用於移除指定的標籤,從而解除對資源的標記。

透過這種機制,可以確保在問題被修復後,相關資源不會被錯誤地執行預定的操作。

圖表說明

以下是上述工作流程的圖示:

  graph LR;
    A[開始] --> B[檢查 EC2 例項標籤];
    B -->|缺失標籤|> C[標記例項以終止];
    B -->|標籤完整|> D[保持現狀];
    C --> E[稍後終止例項];
    E --> F[結束];
    D --> F;

圖表翻譯: 此圖展示了 Cloud Custodian 策略的工作流程。首先檢查 EC2 例項的標籤,如果發現缺失,則標記該例項以便稍後終止;如果標籤完整,則保持現狀。隨後,對已標記的例項執行終止操作。整個流程確保了資源管理的自動化和高效性。

後續展望

隨著雲端運算技術的不斷發展,雲端資源管理的重要性日益凸顯。未來,我們可以預見更多的自動化和智慧化工具將被開發出來,以應對日益複雜的雲端環境。而 Cloud Custodian 正是這一領域的有力工具之一,透過其靈活的策略組態和強大的功能,使用者可以更好地管理和最佳化自己的雲端資源,為業務的持續發展提供堅實的支援。

詳細分析與未來趨勢

在雲端運算領域,資源管理策略的有效實施對於保障企業營運的安全性和高效性至關重要。Cloud Custodian 的出現,為企業提供了一種強有力的工具,用於自動化管理和最佳化雲端資源。透過本文介紹的過濾器和動作機制,企業可以根據自身需求,制定出符合業務目標的管理策略。

未來,隨著雲端技術的不斷演進,我們可以預期 Cloud Custodian 將會持續更新和完善,提供更多功能和改進,以滿足使用者日益增長的需求。同時,其他相關工具和技術也將不斷湧現,共同推動雲端資源管理領域的發展。

因此,對於企業和技術人員來說,持續關注最新的技術動態和最佳實踐,將有助於更好地利用 Cloud Custodian 等工具,提升雲端資源管理的水平,為企業的發展注入新的動力。

總字數:9,985字

Cloud Custodian 策略註解與執行詳解

描述策略

Cloud Custodian(c7n)的策略領域特定語言(DSL)支援三個元素,能夠幫助您為策略新增相關資訊。commentsdescription 元素允許您新增大量文字,用於描述您的策略。正如第一章所述,PaC 解決方案中的策略應追溯到企業標準和政策。過去,我曾使用 commentsdescriptions 來新增這類別資訊。它們可以互換使用,但 description 欄位實際上會傳播到雲端服務提供商(CSP)的函式(如 Lambda),為函式提供描述。comments 欄位內容則保留在策略內。

新增策略資訊

policies:
  - name: ec2-mandatory-tags
    resource: aws.ec2
    filters:
      - "State.Name": running
      - or:
          - "tag:billing": absent
          - "tag:env": absent
          - "tag:owner": absent
    metadata:
      severity: high
      author: jimmyray
      control-id: GRC-001
      control-info: EC2 instances must contain required tags [billing, env, owner]
    comments: |
      Lorem ipsum dolor sit amet, consectetur adipiscing elit...
    description: |
      Lorem ipsum dolor sit amet, consectetur adipiscing elit...

內容解密:

此 YAML 檔案定義了一個名為 ec2-mandatory-tags 的 Cloud Custodian 策略,用於檢查正在執行的 EC2 例項是否具備必要的標籤(billing、env 和 owner)。如果這些標籤不存在,策略將標記這些例項。metadata 部分提供了額外的後設資料,如嚴重性和控制 ID,這些資訊對於策略的分類別和自動化非常有用。commentsdescription 欄位提供了詳細的描述和註解,有助於理解策略的目的。

策略執行

c7n 策略可以在多種不同的模式下執行,取決於您使用的環境和架構。本文主要關注 pullCloudTrail 和週期性 AWS 模式。您可以使用 c7n schema mode 命令列出可用的 c7n 執行模式。

# 列出 c7n schema modes
c7n schema mode

輸出結果顯示了多種執行模式,包括 pullperiodiccloudtrail 等。

內容解密:

此命令用於查詢 c7n 支援的執行模式。不同的模式適用於不同的場景,例如 pull 模式用於從雲端提供商查詢資源並執行過濾和操作。

Pull 模式策略執行

pull 模式是原型設計和執行 c7n 策略最簡單的方式。在此模式下,您使用 c7n CLI 的 run 命令從桌面執行策略到目標環境。

# 執行策略以檢測具有未加密 EBS 卷的 EC2 例項
$ c7n run -s output policies/ec2-ebs-nonencrypted.yml
2023-09-27 20:54:40,652: custodian.policy:INFO policy:ec2-nonencrypted-ebs-volumes resource:ec2 region:us-east-1 count:3 time:1.47

內容解密:

此命令執行了一個名為 ec2-ebs-nonencrypted.yml 的策略,用於檢測具有未加密 EBS 卷的 EC2 例項。輸出結果顯示該策略在 us-east-1 區域選擇了三個 EC2 資源,並花費了 1.47 秒執行。

輸出檔案

除了命令輸出外,策略執行還建立了三個檔案在輸出目錄中:

  1. custodian-run.log:每次策略執行時更新的日誌檔案。
  2. metadata.json:包含上次成功執行策略的後設資料。
  3. resources.json:包含上次執行根據資源型別和過濾器選擇的資源資料。

metadata.json 示例:

{
  "policy": {
    "name": "ec2-nonencrypted-ebs-volumes",
    "resource": "ec2",
    "filters": [
      {
        "type": "instance-attribute",
        "attribute": "instanceType",
        "key": "Value",
        "value": "t2.micro"
      },
      {
        "type": "ebs",
        "key": "Encrypted",
        "value": false
      }
    ]
  },
  "version": "0.9.31",
  "execution": {
    "id": "4c2e3059-ad7b-4ac3-9e6b-f39a68d3ec2d",
    "start": 1695862479.174487,
    "end_time": 1695862480.6559172,
    "duration": 1.4814300537109375
  },
  "config": {
    "region": "us-east-1",
    "regions": [
      "us-east-1"
    ],
    "cache": "~/.cache/cloud-custodian.cache",
    ...
  }
}

內容解密:

此 JSON 檔案包含了上次成功執行策略的詳細後設資料,包括所使用的過濾器、執行時間和組態資訊。

資源資料處理

可以使用 jq 命令來解析 resources.json 檔案中的資料,以取得所需的資訊。

# 使用 jq 解析 resources.json 資料
$ jq '.[]| .["Name"]=(.Tags[]|select(.Key=="Name").Value)|.["Owner"]=(.Tags[]|select(.Key=="Owner").Value)|{id:.InstanceId,type:.InstanceType,name:.Name,az:.Placement.AvailabilityZone,owner:.Owner}' output/ec2-nonencrypted-ebs-volumes/resources.json

輸出結果顯示了每個 EC2 例項的 ID、型別、名稱、可用區和所有者等資訊。

內容解密:

jq 命令用於解析 resources.json 檔案,提取每個 EC2 例項的關鍵資訊,如例項 ID、型別、名稱、可用區和所有者。這有助於進一步分析和處理這些資源資料。