Cloud Custodian 是一款開源的雲端資源管理工具,能協助企業有效實施 FinOps 策略,降低雲端成本並提升資源使用效率。它透過定義策略(Policy)來監控和管理雲端資源,涵蓋 AWS、Azure 和 GCP 等主流平台。Cloud Custodian 支援多種運作模式,包含定期執行、事件觸發和即時監控,可根據企業需求彈性組態。除了成本最佳化,Cloud Custodian 也能提升安全性,例如自動刪除未加密的 EBS 磁碟區或停止未使用的 EC2 執行個體,降低潛在風險。此外,Cloud Custodian 還能自動化標記資源,方便追蹤和管理,並支援通知機制,讓管理者即時掌握資源狀態變化。

Cloud Custodian 實務操作與應用

Cloud Custodian 是一款強大的開源工具,用於管理和監控雲端資源。本文將介紹其基本操作、進階功能以及在不同雲端平台上的應用。

基本操作與報告生成

Cloud Custodian 的基本操作包括執行策略(policy)和生成報告。以下是一個簡單的例子,展示如何使用 c7n 命令執行策略並生成報告:

# 執行策略並生成報告
$ c7n report -s output --format simple policies/ec2-ebs-nonencrypted.yml \
--no-default-fields --field id=InstanceId --field type=InstanceType \
--field ip=PrivateIpAddress

內容解密:

此命令的作用是執行 ec2-ebs-nonencrypted.yml 策略,並生成一個簡單的報告。報告中包含了 EC2 例項的 ID、型別和私有 IP 地址。

  • --no-default-fields 引數用於移除預設欄位。
  • --field 引數用於新增自定義欄位,例如 id=InstanceId 表示將 InstanceId 對映到 id 欄位。

輸出的報告如下:

id                   type        ip
------------------- -------- ------------
I-02178...       t2.micro 10.41.55.34
I-0d93...        t2.micro 10.41.55.27
I-0bbf...        t2.micro 10.41.55.107

CloudTrail 模式與 Lambda 函式

Cloud Custodian 支援 CloudTrail 模式,可以透過 AWS Lambda 函式觸發策略執行。以下是一個範例策略,用於在建立 EC2 例項時自動新增標籤:

# CloudTrail 觸發的 Lambda 策略
policies:
  - name: ec2-tag-new
    resource: aws.ec2
    description: |
      自動標記新建立的 EC2 例項
    mode:
      type: cloudtrail
      tags:
        billing: lob-cc
        env: sandbox
        owner: jimmyray
      role: <ROLE_NAME_OR_ARN>
    events:
      - RunInstances
    actions:
      - type: tag
        tags:
          billing: lob-cc
          env: sandbox
          owner: jimmyray

內容解密:

此策略定義了一個名為 ec2-tag-new 的 Cloud Custodian 策略,用於在建立新的 EC2 例項時自動新增標籤。

  • mode.type: cloudtrail 表示此策略由 CloudTrail 事件觸發。
  • events: RunInstances 指定了觸發策略的事件為 RunInstances,即建立 EC2 例項的操作。
  • actions 部分定義了策略執行的動作,此處為新增標籤。

策略驗證與佈署

在佈署策略之前,可以使用 c7n validate 命令驗證策略檔案的正確性:

# 驗證策略檔案
$ c7n validate policies/cloudtrail/ct-ec2-tag-new-instance.yml

驗證透過後,可以使用 c7n run 命令佈署策略到 AWS 環境中:

# 佈署策略到 AWS 環境
$ c7n run -s output policies/cloudtrail/ct-ec2-tag-new-instance.yml

內容解密:

佈署過程中,Cloud Custodian 會在 AWS 賬戶中建立一個 Lambda 函式和相關的 EventBridge 規則,用於監聽 CloudTrail 事件並觸發策略執行。

資源清理

完成測試後,可以使用 mugc.py 指令碼清理由 Cloud Custodian 建立的 AWS 資源:

# 清理 AWS 資源
$ python3 mugc.py -c policies/cloudtrail/ct-ec2-tag-new-instance.yml --present

內容解密:

此命令會刪除由 ct-ec2-tag-new-instance.yml 策略建立的 Lambda 函式和 EventBridge 規則,確保資源被正確清理。

多雲支援

除了 AWS,Cloud Custodian 也支援 Azure 和 GCP 平台。在這些平台上,可以使用類別似的機制實作根據事件的策略執行。例如,在 Azure 上,可以使用 Azure Event Grid 和 Azure Functions;在 GCP 上,可以使用 API Audit Log Events 和 Cloud Functions。

使用 Cloud Custodian 實作 FinOps

前言

在雲端運算的世界中,成本管理是一個重要的課題。FinOps(Financial Operations)是一種結合財務管理和 DevOps 實踐的方法,旨在最佳化雲端資源的使用並降低成本。Cloud Custodian(c7n)是一個開源工具,可以幫助實作 FinOps 的目標。

FinOps 的定義

FinOps Foundation 將 FinOps 定義為財務營運和 DevOps 的結合。它強調在雲端工程過程中早期匯入成本管理的概念,而非僅在雲端成本過高時才進行處理。

FinOps 的文化意義

FinOps 不僅是一種技術實踐,也是一種文化變革。它需要將成本意識(Cloud Cost Consciousness, CCC)融入組織文化中,讓團隊在建立和管理雲端資源時能夠意識到成本的重要性。

使用 Cloud Custodian 實作 FinOps 控管

Cloud Custodian 可以透過多種模式執行,以實作 FinOps 控管。其中一個常見的浪費情況是雲端運算資源被過度組態但未充分利用。以下是一些使用 c7n 政策來減少運算浪費的範例:

檢查未充分利用的 EC2 例項

policies:
  - name: underutilized-ec2-instances
    resource: aws.ec2
    filters:
      - type: metrics
        name: CPUUtilization
        statistic: Average
        days: 30
        value: 5
        op: le
    actions:
      - type: stop
        force: true

內容解密:

此政策選取過去 30 天內平均 CPU 使用率小於或等於 5% 的 EC2 例項,並將其停止以節省成本。

  • resource: aws.ec2 指定了要管理的資源型別為 EC2 例項。
  • filters 部分使用 CloudWatch 指標來篩選例項。
    • type: metrics 表示使用 CloudWatch 指標進行篩選。
    • name: CPUUtilization 指定要檢查的指標是 CPU 使用率。
    • statistic: Average 表示計算平均值。
    • days: 30 指定檢查的時間範圍為過去 30 天。
    • value: 5op: le 表示篩選出 CPU 使用率小於或等於 5% 的例項。
  • actions 部分定義了對篩選出的例項執行的動作。
    • type: stop 表示停止例項。
    • force: true 表示強制停止例項。

自動化標記和清理資源

另一個常見的浪費情況是資源未被正確標記,導致難以追蹤和清理。以下是一個自動化標記資源的範例:

policies:
  - name: tag-resources
    resource: aws.ec2
    filters:
      - or:
        - "tag:billing": absent
        - "tag:env": absent
        - "tag:owner": absent
    actions:
      - type: tag
        tags:
          billing: lob-cc
          env: sandbox
          owner: jimmyray

內容解密:

此政策選取未被正確標記的 EC2 例項,並為其新增必要的標籤。

  • filters 部分檢查例項是否缺少特定的標籤。
  • actions 部分為篩選出的例項新增標籤。

隨著雲端運算的不斷發展,FinOps 和 Cloud Custodian 的應用將變得越來越重要。未來,我們可以期待看到更多關於如何使用 c7n 來實作 FinOps 的最佳實踐和案例研究。同時,隨著雲端服務提供商不斷推出新的服務和功能,c7n 也將不斷演進,以支援更多的資源型別和更複雜的管理需求。

Cloud Custodian 工作流程

  graph LR;
    A[開始] --> B[定義政策];
    B --> C[選擇資源];
    C --> D[套用篩選條件];
    D --> E[執行動作];
    E --> F[結果輸出];
    F --> G[結束];

圖表翻譯: 此圖表示 Cloud Custodian 的工作流程。首先定義政策,然後選擇要管理的資源,接著套用篩選條件,最後執行相應的動作並輸出結果。

雲端資源管理最佳化:利用 Cloud Custodian 實踐 FinOps 策略

在現代雲端運算環境中,如何有效管理與最佳化資源使用已成為企業的重要課題。Cloud Custodian 作為一個強大的開源工具,能夠幫助企業實施 FinOps(Financial Operations)策略,以降低成本、提升資源利用率並增強安全性。本文將探討如何利用 Cloud Custodian 制定各種 FinOps 策略,以最佳化 AWS 與 Azure 等雲端平台上的資源使用。

CPU 使用率過低的 EC2 例項管理

針對 CPU 使用率長期偏低的 EC2 例項,Cloud Custodian 可以制定精確的策略進行自動化管理。以下是一個典型的策略範例:

policies:
  - name: ec2-cpu-metrics
    resource: aws.ec2
    filters:
      - type: metrics
        name: CPUUtilization
        days: 14
        value: 5.0
        missing-value: 0
        op: lte
    actions:
      - stop
      - type: tag
        tags:
          c7n-status: cpu-underutilized
      - type: notify
        to:
          - event-user
          - resource-creator
          - jimmyray@example.com
        owner_absent_contact:
          - backup@example.com
        template: policy-template
        transport:
          type: sqs
          region: us-east-1
          queue: c7n-message-queue

內容解密:

  1. 策略目的:針對過去 14 天內平均 CPU 使用率低於 5% 的 EC2 例項採取行動。
  2. 主要動作
    • 停止例項運作
    • 新增標籤標記狀態
    • 透過 SQS 佇列傳送通知給相關人員
  3. 通知機制
    • 通知物件包括事件使用者、資源建立者和特定信箱地址
    • 若資源擁有者無法聯絡,則通知備用聯絡人

大型計算例項的主動管理

對於大型計算例項,企業可以制定主動檢測與管理的策略。以下是一個根據 CloudTrail 事件的策略範例:

vars:
  large-instance-types: &large-instance-types
    - m7i.8xlarge
    - m7i.12xlarge
    - m7i.16xlarge
    - m7i.24xlarge
    - m7i.48xlarge

policies:
  - name: ec2-stop-larges
    resource: aws.ec2
    mode:
      type: cloudtrail
      tags:
        billing: lob-cc
        env: sandbox
        owner: jimmyray
      role: <ROLE_NAME_OR_ARN>
      events:
        - RunInstances
    filters:
      - type: value
        key: InstanceType
        value: *large-instance-types
        op: in
    actions:
      - stop
      - type: tag
        tags:
          c7n-status: ec2-too-large

內容解密:

  1. 策略核心:監控特定大型例項型別的建立事件。
  2. 關鍵過濾條件
    • 例項型別必須在預定義的大型例項列表中。
  3. 執行動作
    • 自動停止符合條件的例項。
    • 新增自定義標籤以記錄處理狀態。

RDS 資料函式庫例項最佳化

針對 RDS 例項的最佳化同樣重要,以下是兩個針對不同場景的策略:

低利用率 RDS 例項檢測

policies:
  - name: rds-underutilized
    resource: aws.rds
    filters:
      - type: value
        value-type: age
        key: InstanceCreateTime
        value: 14
        op: gt
      - type: metrics
        name: CPUUtilization
        statistics: average
        days: 14
        value: 10
        missing-value: 0
        op: lte
    actions:
      - stop

未使用的 RDS 例項檢測

policies:
  - name: rds-unused
    resource: aws.rds
    filters:
      - type: value
        value_type: age
        value: 14
        op: gte
      - type: metrics
        name: DatabaseConnections
        days: 14
        value: 0
        missing-value: 0
        op: eq

內容解密:

  1. 低利用率檢測
    • 篩選出已存在超過 14 天且平均 CPU 使用率低於 10% 的 RDS 例項。
  2. 未使用檢測
    • 篩選出已存在至少 14 天且過去兩週無任何資料函式庫連線的 RDS 例項。

虛擬磁碟與負載平衡器最佳化

未使用的 EBS 磁碟區清理

policies:
  - name: ebs-volumes-avail-14
    resource: aws.ebs
    filters:
      - Attachments: []
      - type: value
        key: CreateTime
        value_type: age
        op: gte
        value: 14
    actions:
      - snapshot
      - delete

未使用的 Azure 磁碟檢測

policies:
  - name: azure-disk-orphan 
    resource: azure.disk 
    filters:
      - type: value 
        key: managedBy 
        value: null 

空閒的 ELB 負載平衡器檢測

policies:
  - name: els-no-instances 
    resource: aws.elb 
    filters:
      - Instances: [] 
      - type: value 
        key: CreateTime 
        value_type: age 
        op: gte 
        value: 1 

圖表翻譯:

此圖示呈現了不同雲端資源最佳化策略之間的關聯性與執行流程。

  graph LR 
A[開始] --> B{資源型別} 
B -->|EC2| C[CPU利用率檢查] 
B -->|RDS| D[資料函式庫連線檢查] 
B -->|EBS| E[掛載狀態檢查] 
C -->|低利用率| F[停止例項] 
D -->|無連線| G[停止資料函式庫] 
E -->|未掛載| H[快照並刪除] 
F --> I[通知相關人員] 
G --> I 
H --> I 

圖表翻譯:

此圖表展示了根據不同雲端資源型別(EC2、RDS、EBS)的最佳化流程。系統會根據各資源的特定指標(如 CPU 利用率、資料函式庫連線數、掛載狀態)進行檢查,並對不符合預期的資源採取相應的最佳化措施(如停止執行個體、停止資料函式庫、建立快照並刪除),最後通知相關人員。

非工作時間自動排程管理

為了進一步最佳化資源使用,企業可以實施根據時間的自動化管理策略:

policies:
  - name: offhour-pm-stop 
    resource: aws.ec2 
    mode:
      type: periodic 
      schedule: rate(1 hour) 
      role: <ROLE_NAME_OR_ARN> 
    tags:
      billingc7n-status:: lob-cc custodian_downtime envdowntime : sandboxopt-out : false owner : jimmyray- "tagdowntime": absent : aws : autoscaling : groupName actions:- stop- name : offhour-am-start resource : aws.ec2 mode:type : periodic schedule : rate(1 hour) role:<ROLE_NAME_OR_ARN> tags : billing : lob-cc env : sandbox owner : jimmyray filters:- type : offhour tag : custodian_downtime default_tz : et offhour : offhour17 : opt-out17 : false- "tagfalse": absent : aws : autoscaling : groupNameactions :- start 

圖表翻譯:

此圖表說明瞭根據時間的自動化管理流程,展示瞭如何在特定時間自動停止或啟動 EC2 例項。

  graph LR 
A[開始] --> B{當前時間} 
B -->|上班前| C[啟動EC2] 
B -->|下班後| D[停止EC2] 
C --> E[檢查AutoScaling標籤] 
D --> E 
E -->|未標註opt-out| F[執行操作]