CloudFormation 提供了多種方式來組織和管理基礎設施即程式碼,其中模組、巨集和巢狀堆積疊是提升範本複用性和可讀性的關鍵工具。模組允許將常用的資源和組態封裝,並透過引數化的方式在不同環境中重複使用,簡化了範本的維護和更新。巨集則提供了更進階的自定義邏輯,可以根據特定條件生成動態資源組態,但相對複雜度較高。巢狀堆積疊則適用於將大型範本分解成更小的、可獨立管理的單元,提高了整體架構的清晰度和可維護性。選擇合適的工具取決於專案的規模和複雜度,以及團隊的技術能力。

使用巨集、巢狀堆積疊與模組擴充套件你的 CloudFormation 範本

在前面的章節中,我們探討瞭如何使用 CloudFormation 巨集和巢狀堆積疊來擴充套件和重用範本。現在,我們將進一步瞭解如何使用 CloudFormation 模組來簡化範本的開發和管理。

建立 CloudFormation 模組

與巨集不同,模組需要完全利用 CloudFormation 語言來定義資源屬性。以下是一個範例範本,展示了模組的關鍵部分:

// template.yaml
Parameters:
  ApplicationName:
    Type: String
  ApplicationImage:
    Type: String
  TaskCount:
    Type: Number
  NeedsDatabase:
    Type: String
    AllowedValues: [True, False]
  PubliclyAvailable:
    Type: String
    AllowedValues: [True, False]

  # 某些屬性會有預設值
  RDSEngine:
    Type: String
    Default: MySQL
  RDSSize:
    Type: String
    Default: db.t3.small
  RDSMultiAz:
    Type: String
    AllowedValues: [True, False]
    Default: False
  RDSStorage:
    Type: Number
    Default: 10

內容解密:

此範本定義了模組的輸入引數,包括應用程式名稱、映像檔、任務數量等。某些引數具有預設值,以避免因缺少引數而導致錯誤。

定義條件

條件用於控制資源的建立:

// template.yaml
Conditions:
  NeedsBalancer: !Equals [!Ref NeedsBalancer, True]
  NeedsDatabase: !Equals [!Ref NeedsDatabase, True]
  PubliclyAvailable: !Equals [!Ref PubliclyAvailable, True]

內容解密:

條件陳述式用於判斷是否需要建立某些資源,例如負載平衡器或資料函式庫。

建立資源

根據條件建立資源,例如:

// template.yaml
Resources:
  LbSg:
    Condition: NeedsBalancer
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "LB Security Group"
      VpcId: !Ref VpcId

內容解密:

此段程式碼根據 NeedsBalancer 條件建立負載平衡器的安全群組。

使用條件控制屬性

// template.yaml
Resources:
  Lb:
    Condition: NeedsBalancer
    Type: "AWS::ElasticLoadBalancingV2::LoadBalancer"
    Properties:
      Scheme:
        !If:
          - PubliclyAvailable,
          - "internet-facing"
          - "internal"
      SecurityGroups:
        - !Ref LbSg
      Subnets: !Ref PublicSubnets

內容解密:

此段程式碼根據 PubliclyAvailable 條件設定負載平衡器的方案。

模組的限制

CloudFormation 模組不支援堆積疊匯出和 Fn::ImportValue,也不支援巢狀堆積疊和標籤。這些限制未來可能會改變。

驗證和提交模組

$ cfn validate
Module fragment is valid.

$ cfn submit --region REGION
Module fragment is valid.
Successfully submitted type. Waiting for registration with token 'a9e0a24b-ccee-4ae2-a892-f843cc556bcf' to complete.
Registration complete.

內容解密:

此段程式碼驗證並提交模組至 CloudFormation 登入。

佈署模組化堆積疊

// standard_app.yaml
Resources:
  StandardApp:
    Type: "Org::Apps::StandardApp::MODULE"
    Properties:
      ApplicationName: nginx
      ApplicationImage: nginx:latest
      TaskCount: 1
      Memory: 512
      CPU: 512
      ApplicationPort: 80
      NeedsDatabase: False
      NeedsBalancer: False
      PubliclyAvailable: False
      VpcId: !ImportValue VpcId
      DbSubnetGroup: !ImportValue DbSubnetGroup
      ExecRoleArn: !ImportValue ExecRole
      EcsCluster: !ImportValue EcsCluster
      PublicSubnets: !Split [",", !ImportValue PublicSubnets]
      AppSubnets: !Split [",", !ImportValue AppSubnets]

內容解密:

此範本使用剛才建立的模組來佈署標準應用程式堆積疊。

模組化堆積疊的優點

使用模組可以簡化範本的開發和管理,提高範本的可重用性和可維護性。模組化的堆積疊可以讓你更輕鬆地管理和佈署複雜的應用程式。

CloudFormation 模組結構

  graph LR
    A[CloudFormation 範本] --> B[模組定義]
    B --> C[引數定義]
    B --> D[條件定義]
    B --> E[資源定義]
    C --> F[引數驗證]
    D --> G[條件判斷]
    E --> H[資源建立]
    F --> I[範本驗證]
    G --> I
    H --> I
    I --> J[佈署模組化堆積疊]

圖表翻譯: 此圖表展示了 CloudFormation 模組的結構,包括範本、引數、條件和資源的定義與建立流程。

隨著 CloudFormation 的不斷發展,模組的功能和應用場景將會更加廣泛。未來,我們可以期待更多的功能和改進,以簡化範本的開發和管理。模組化的設計將使得 CloudFormation 範本更加靈活和可重用,從而提高基礎設施即程式碼(IaC)的管理效率。

使用巨集(Macros)、巢狀堆積疊(Nested Stacks)和模組(Modules)擴充套件您的 CloudFormation 範本

在前面的章節中,我們已經學習瞭如何使用 AWS CloudFormation 來建立和管理基礎設施即程式碼(IaC)。然而,當您的範本變得越來越複雜時,您可能會遇到一些挑戰,例如範本的可讀性、可維護性和可重用性。在本章中,我們將探討如何使用巨集、巢狀堆積疊和模組來擴充套件您的 CloudFormation 範本。

使用巨集(Macros)簡化範本

巨集是一種允許您在範本中執行自定義邏輯的功能。您可以使用巨集來簡化範本、提高可讀性和可維護性。在 AWS CloudFormation 中,巨集是一種特殊的資源型別,它允許您執行 Lambda 函式來處理範本。

建立和使用巨集

要建立一個巨集,您需要建立一個 Lambda 函式,該函式將處理範本並傳回處理後的結果。然後,您需要在 CloudFormation 中註冊該巨集。

import boto3

lambda_client = boto3.client('lambda')

def handler(event, context):
    # 處理範本的邏輯
    processed_template = process_template(event['template'])
    return {
        'status': 'SUCCESS',
        'processed_template': processed_template
    }

def process_template(template):
    # 在此實作您的範本處理邏輯
    return template

使用 AWS 提供的巨集

AWS 提供了一些內建的巨集,例如 AWS::ServerlessAWS::Include。這些巨集可以幫助您簡化範本並提高可讀性。

使用巢狀堆積疊(Nested Stacks)模組化您的範本

巢狀堆積疊允許您將一個 CloudFormation 堆積疊巢狀在另一個堆積疊中。這使得您可以模組化您的範本並提高可重用性。

建立巢狀堆積疊

要建立一個巢狀堆積疊,您需要在父堆積疊中使用 AWS::CloudFormation::Stack 資源型別。

Resources:
  NestedStack:
    Type: 'AWS::CloudFormation::Stack'
    Properties:
      TemplateURL: 'https://s3.amazonaws.com/your-bucket/nested-stack.yaml'

使用模組(Modules)擴充套件您的範本

模組是 CloudFormation 的一種新功能,它允許您將可重用的資源和組態封裝成一個模組。模組可以幫助您簡化範本並提高可重用性。

建立和使用模組

要建立一個模組,您需要建立一個 CloudFormation 範本,該範本定義了模組的資源和組態。然後,您需要在 CloudFormation 中註冊該模組。

Resources:
  MyModule:
    Type: 'Org::Apps::StandardApp::MODULE'
    Properties:
      # 模組的屬性

比較巨集、巢狀堆積疊和模組

功能 巨集(Macros) 巢狀堆積疊(Nested Stacks) 模組(Modules)
目的 簡化範本、執行自定義邏輯 模組化範本、提高可重用性 簡化範本、提高可重用性
複雜度
可讀性

在下一章中,我們將學習如何使用 AWS Cloud Development Kit(CDK)來建立和管理 CloudFormation 堆積疊。CDK 提供了一種新的方式來建立和管理基礎設施即程式碼(IaC)。

問題

  1. 當巨集處理範本時,它傳回的格式是什麼?
  2. 在 CloudFormation 的轉換請求中,什麼是片段(Fragment)?
  3. 如果巨集函式傳回一個非 SUCCESS 狀態,會發生什麼?
  4. 您可以在單個範本中使用多個巨集嗎?
  5. 我們可以在模組中使用 CloudFormation 語言擴充套件嗎?

進一步閱讀

使用 AWS CDK 建立 CloudFormation 範本

AWS CDK 是一種新的框架,它允許您使用高階程式語言來建立和管理 CloudFormation 堆積疊。CDK 提供了一種新的方式來建立和管理基礎設施即程式碼(IaC)。

CDK 的優點
  • 使用高階程式語言來建立和管理 CloudFormation 堆積疊
  • 支援多種程式語言,包括 TypeScript、JavaScript、Python、C# 和 Java
  • 提供了一種新的方式來建立和管理基礎設施即程式碼(IaC)
使用 CDK 建立 CloudFormation 範本

要使用 CDK 建立 CloudFormation 範本,您需要安裝 CDK 並建立一個新的 CDK 專案。

npm install -g aws-cdk
cdk init app --language python

然後,您可以使用 CDK 的 API 來建立和管理 CloudFormation 堆積疊。

from aws_cdk import Stack, App
from constructs import Construct
import aws_cdk.aws_s3 as s3

class BucketStack(Stack):
    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        s3.Bucket(self, 'MyBucket')