CloudFormation 提供了簡潔、可重複使用的基礎設施組態方法,有效降低手動操作風險。透過宣告式 YAML 或 JSON 範本,定義 Lambda 函式、IAM 角色等資源及其依賴關係,CloudFormation 自動化完成佈建流程。此方法確保環境一致性,方便版本控制和回復,也簡化了複雜應用架構的管理。文章將探討 CloudFormation 範本的關鍵組成,包含資源定義、內建函式、引數設定等,並搭配實際案例演示如何建立一個完整的無伺服器應用。同時,也將介紹 CloudFormation Designer 的視覺化設計功能,以及 AWS CLI 的指令操作,提供更全面的實戰。

使用AWS CloudFormation開始無伺服器運算

前言

Amazon CloudFormation是一種能夠以宣告式方式組態和管理AWS服務基礎設施的工具。相較於使用互動式工具如管理主控台或CLI,直接在範本中宣告所需的組態、依賴關係、輸入和輸出,CloudFormation將自動為您建立相關資源。這種以程式碼管理基礎設施的概念被稱為「基礎設施即程式碼」(Infrastructure as Code, IaC),是多數企業所遵循的實踐方法。您可以將組態程式碼儲存在程式碼倉函式庫中,並像其他程式碼一樣進行程式碼審查,從而實作組態的重用。

準備工作

在開始之前,請確保您已完成「Your first AWS Lambda」和「Your first Lambda with AWS CLI」章節的準備工作。

設定專案和S3儲存桶

本章節中,我們將重用在「Your Lambda with AWS CLI」章節中建立的Lambda函式。執行mvn clean package指令生成JAR檔案,並將其上傳至S3儲存桶:

aws s3 cp target/original-serverless-cookbook-lambda-handler-with-pojos-0.0.1-SNAPSHOT.jar s3://serverless-cookbook/lambda-handler-with-pojos-0.0.1-SNAPSHOT.jar --profile admin

請將serverless-cookbook替換為您的S3儲存桶名稱。

瞭解YAML和JSON

CloudFormation範本可以使用JSON或YAML撰寫。兩者都支援鍵值對、物件、陣列等資料結構。YAML還支援多行字串、註解等額外功能。本章節中的範例將使用YAML撰寫。

建立CloudFormation範本

  1. 資源元件指定所使用的AWS資源。我們的案例需要兩個資源:一個角色和一個Lambda函式。以下是CloudFormation範本的基本結構:
---
AWSTemplateFormatVersion: '2010-09-09'
Description: Building Lambda with AWS CloudFormation
Resources:
  IamRoleLambdaExecution:
    Type: AWS::IAM::Role
    Properties:
      # 角色屬性將在後續步驟中說明
  LambdaFunctionWithCF:
    Type: AWS::Lambda::Function
    Properties:
      # Lambda屬性將在後續步驟中說明
    DependsOn:
      - IamRoleLambdaExecution

#### 內容解密:

此範本定義了兩個資源:IamRoleLambdaExecution(IAM角色)和LambdaFunctionWithCF(Lambda函式)。DependsOn屬性確保Lambda函式在IAM角色建立後才會被建立。

  1. 角色需要一個信任關係政策,允許Lambda函式承擔該角色,並附加一個提供CloudWatch日誌記錄許可權的政策。AssumeRolePolicyDocument屬性指定了角色的信任關係政策:
AssumeRolePolicyDocument:
  Version: '2012-10-17'
  Statement:
    - Effect: Allow
      Principal:
        Service:
          - lambda.amazonaws.com
      Action:
        - sts:AssumeRole

#### 內容解密:

此信任關係政策允許Lambda服務承擔該角色。

  1. 政策在角色的Policies屬性中內聯指定:
Policies:
  - PolicyName: 'lambda-with-cf-policy'
    PolicyDocument:
      Version: '2012-10-17'
      Statement:
        - Effect: Allow
          Action:
            - logs:CreateLogGroup
            - logs:CreateLogStream
            - logs:PutLogEvents
          Resource: arn:aws:logs:*:*:*

#### 內容解密:

此政策允許Lambda函式建立日誌群組、日誌流並將日誌事件寫入CloudWatch。

  1. Lambda函式的基本組態如下:
LambdaFunctionWithCF:
  Type: AWS::Lambda::Function
  Properties:
    Code:
      S3Bucket: 'serverless-cookbook'
      S3Key: lambda-handler-with-pojos-0.0.1-SNAPSHOT.jar
    FunctionName: first-lambda-with-cloud-formation
    Handler: tech.heartin.books.serverlesscookbook.MyLambdaHandler::handleRequest
    MemorySize: 512
    Role:
      Fn::GetAtt:
        - IamRoleLambdaExecution
        - Arn
    Runtime: java8
    Timeout: 15
  DependsOn:
    - IamRoleLambdaExecution

#### 內容解密:

此Lambda函式組態指定了程式碼位置、函式名稱、處理程式、記憶體大小、執行角色、執行環境和超時時間。Fn::GetAtt函式用於動態檢索IAM角色的ARN。

建立CloudFormation堆積疊

CloudFormation堆積疊是一組需要作為單元管理的AWS資源。堆積疊中的所有資源都由CloudFormation範本定義。當您刪除堆積疊時,所有相關資源也將被刪除。 有多種方式可以建立CloudFormation堆積疊,包括:

  1. 在AWS管理主控台中的CloudFormation服務內選擇「Create Stack」。
  2. 在AWS管理主控台中的CloudFormation服務內的「Template Designer」中直接上傳範本。
  3. 使用AWS CLI。

#### 內容解密:

選擇適合您需求的方法來建立CloudFormation堆積疊,並確保仔細檢查範本中的資源定義和依賴關係,以避免建立過程中出現錯誤。

使用 AWS 開始無伺服器運算之旅:第 1 章

使用 CloudFormation 建立第一個 Lambda 函式

在這個章節中,我們將使用 AWS CloudFormation 服務來建立一個簡單的 Lambda 函式。首先,我們需要了解 CloudFormation 的基本概念和如何使用它來佈署 AWS 資源。

使用 Designer 建立 CloudFormation 堆積疊

AWS 提供了一個名為 CloudFormation Designer 的工具,可以用來視覺化和驗證 CloudFormation 範本。雖然在後續的章節中,我們將主要使用 AWS CLI 來佈署 CloudFormation 範本,但在這個章節中,我們將使用 Designer 來建立我們的堆積疊。

  1. 登入 AWS 管理控制檯,導航到 CloudFormation 服務。
  2. 點選「設計範本」按鈕以進入 Designer。
  3. 在 Designer 中,選擇 YAML 作為範本語言,並在編輯器中選擇「範本」標籤。
  4. 將您的 CloudFormation 範本複製並貼上到範本編輯器視窗中。
  5. 點選 Designer 中的「重新整理」按鈕,以在設計檢視中檢視範本。
  6. 如果需要進行更改,您可以在「範本」標籤或「元件」標籤中進行修改。
  7. 當一切看起來沒問題時,點選 Designer 左上角的上傳按鈕,以啟動堆積疊建立精靈。
  8. 按照精靈的指示進行操作,選擇預設值,並勾選「我確認 AWS CloudFormation 可能會建立具有自定義名稱的 IAM 資源」核取方塊。最後,點選「建立堆積疊」。

使用 AWS CLI 呼叫 Lambda 函式

建立堆積疊後,我們可以使用 AWS CLI 呼叫我們的 Lambda 函式,如下所示:

aws lambda invoke \
--invocation-type RequestResponse \
--function-name first-lambda-with-cloud-formation \
--log-type Tail \
--payload '{"name":"Heartin"}' \
--profile admin \
outputfile.txt

輸出結果將被儲存到 outputfile.txt 檔案中。

清理資源

要清理由 CloudFormation 建立的資源,只需刪除堆積疊即可。這是預設設定。由於我們使用 AWS 管理控制檯建立了堆積疊,因此我們也將使用它來刪除堆積疊。

從管理控制檯刪除 CloudFormation 堆積疊

  1. 導航到 CloudFormation 服務。
  2. 選擇要刪除的堆積疊。
  3. 點選「動作」,然後點選「刪除堆積疊」。

工作原理

在這個章節中,我們使用了以下 CloudFormation 範本元件:

  • Resource:指定了要建立的 AWS 資源。
  • AWSTemplateFormatVersion:指定了 CloudFormation 範本的版本。
  • Description:提供了對範本的描述。

我們使用了兩個資源:一個 IAM 角色(IAMRoleLambdaExecution)和一個 Lambda 函式(LambdaFunctionWithCF),該函式依賴於該角色。

Resource 元件的重要特性

  • Resource 元件指定了要在範本中建立的 AWS 資源。
  • 資源可以使用 Ref 元素相互參照。
  • 資源名稱可以是任意的。
  • Type 指定了資源的型別。
  • 每種型別都有其自己的屬性集合,可以在檔案中參考。

內建函式

CloudFormation 提供了多種內建函式,用於在範本中動態新增值。常用的內建函式包括:

  • Fn::Base64
  • Fn::Cidr
  • Fn::FindInMap
  • Fn::GetAtt
  • Fn::GetAZs
  • Fn::ImportValue
  • Fn::Join
  • Fn::Select
  • Fn::Split
  • Fn::Sub
  • Ref

內容解密:

在這個章節中,我們學習瞭如何使用 CloudFormation 建立一個簡單的 Lambda 函式,並瞭解了 CloudFormation 的基本概念和元件。我們還學習瞭如何使用 Designer 和 AWS CLI 來佈署和管理 CloudFormation 堆積疊。

更多資訊

您可以檢視檔案,瞭解更多關於 CloudFormation 範本元件和內建函式的資訊。

使用 Plantuml 圖表呈現 CloudFormation 堆積疊結構

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title CloudFormation 建立無伺服器 Lambda 函式

package "AWS 雲端架構" {
    package "網路層" {
        component [VPC] as vpc
        component [Subnet] as subnet
        component [Security Group] as sg
        component [Route Table] as rt
    }

    package "運算層" {
        component [EC2] as ec2
        component [Lambda] as lambda
        component [ECS/EKS] as container
    }

    package "儲存層" {
        database [RDS] as rds
        database [DynamoDB] as dynamo
        storage [S3] as s3
    }

    package "服務層" {
        component [API Gateway] as apigw
        component [ALB/NLB] as lb
        queue [SQS] as sqs
    }
}

apigw --> lambda
apigw --> lb
lb --> ec2
lb --> container
lambda --> dynamo
lambda --> s3
ec2 --> rds
container --> rds
vpc --> subnet
subnet --> sg
sg --> rt

@enduml

此圖示呈現了 CloudFormation 堆積疊的結構,包括 IAM 角色和 Lambda 函式之間的依賴關係。

圖表解密:

這個 Plantuml 圖表呈現了 CloudFormation 堆積疊的結構。堆積疊包含一個 IAM 角色和一個 Lambda 函式,Lambda 函式依賴於 IAM 角色。這個圖表幫助我們瞭解堆積疊中的資源之間的關係。

使用 AWS 進行無伺服器運算的起步 Chapter 1

CloudFormation 的基本使用與優勢

AWS CloudFormation 是一種基礎設施即程式碼(Infrastructure as Code, IaC)的服務,能夠自動化管理和佈建 AWS 資源。透過 CloudFormation,您可以建立範本來描述所需的資源及其依賴關係,從而實作自動化的資源建立和管理。

支援的函式與簡寫形式

在 CloudFormation 中,您可以使用內建函式來動態生成範本中的值。這些函式支援標準形式和簡寫形式(例如 !Base64!Cidr!Ref 等)。本章節主要使用標準語法,但在後續章節中將採用簡寫語法以提高可讀性。

CloudFormation Designer 的功能

CloudFormation Designer 是一個視覺化工具,能夠幫助您建立、驗證和上傳 CloudFormation 範本。它的主要功能包括:

  • 從零開始視覺化建立範本並進行驗證
  • 複製現有的範本並進行視覺化編輯
  • 拖曳所需資源並定義資源之間的關係
  • 直接存取相關服務的 CloudFormation 檔案
  • 編輯邏輯名稱和其他屬性
  • 將現有範本複製並貼上到設計檢視中
  • 直接將指令碼上傳到 S3 並啟動建立堆積疊精靈

CloudFormation 的額外好處

除了自動化資源佈建和重用之外,CloudFormation 還具備以下優勢:

  • 根據範本估算成本
  • 有效追蹤成本
  • 自動刪除不再需要的資源以節省成本
  • 根據範本生成的圖表有助於更好地理解系統架構

CloudFormation 的替代方案

除了 CloudFormation 之外,還有多種 IaC 工具可供選擇,包括 Ansible、Terraform、Chef、AWS OpsWorks 和 AWS Elastic Beanstalk。

使用 AWS SDK、Amazon CloudFormation 和 AWS CLI 與 Lambda 整合

AWS SDK 允許您編寫與 AWS 服務互動的程式碼。在本章節中,我們將使用 AWS Java SDK 進行 IAM 操作,以程式設計方式建立 Lambda 函式。

程式碼範例:使用 AWS Java SDK 進行 IAM 操作

首先,建立一個 Java Maven 專案並設定父專案為 serverless-cookbook-parent-aws-java

<parent>
    <groupId>tech.heartin.books.serverlesscookbook</groupId>
    <artifactId>serverless-cookbook-parent-aws-java</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

接著,在 POM 檔案中指定依賴項:

<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-core</artifactId>
        <version>${aws.lambda.java.core.version}</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-iam</artifactId>
        <version>${aws.sdk.version}</version>
    </dependency>
</dependencies>

建立請求和回應的 POJO

建立一個請求 POJO 用於接受請求:

import lombok.Data;

@Data
public class IAMOperationRequest {
    private String operation;
    private String userName;
}

建立一個回應 POJO 用於發送回應:

import lombok.AllArgsConstructor;
import lombok.Data;

@AllArgsConstructor
@Data
public class IAMOperationResponse {
    private String message;
    private String errorMessage;
}

#### 內容解密:

此處使用了 Project Lombok 的 @Data 註解自動生成 getter 和 setter 方法,簡化了 POJO 的實作。同時,使用了 @AllArgsConstructor 註解生成全引數建構函式,方便建立 IAMOperationResponse 物件。

建立服務類別以實作 IAM 操作

匯入所需的類別:

import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.amazonaws.services.identitymanagement.model.CreateUserRequest;
import com.amazonaws.services.identitymanagement.model.CreateUserResult;
import com.amazonaws.services.identitymanagement.model.DeleteConflictException;

#### 內容解密:

此段程式碼匯入了必要的 AWS SDK 類別,用於建立 IAM 使用者和管理相關操作。AmazonIdentityManagementAmazonIdentityManagementClientBuilder 用於建立和管理 IAM 使用者,而 CreateUserRequestCreateUserResult 則用於建立新使用者。DeleteConflictException 用於處理刪除操作中的衝突異常。