AWS SAM 簡化了無伺服器應用程式的開發、測試和佈署流程,其範本語法比 CloudFormation 更簡潔易用,同時完全相容 CloudFormation 的所有功能。開發者可以利用 SAM CLI 在本地建置、測試和除錯應用程式,並直接佈署到 AWS 雲端。SAM 範本定義了無伺服器應用程式所需的資源,例如 Lambda 函式、API Gateway、DynamoDB 表格等,並透過轉換成 CloudFormation 範本進行佈署。這使得開發者可以專注於業務邏輯的開發,而無需管理底層基礎設施。SAM 還支援本地測試和除錯,可以有效縮短開發週期。對於複雜的應用程式,SAM 提供了模組化和可重複使用的機制,方便團隊協作和程式碼管理。

使用AWS SAM佈署無伺服器應用程式

介紹AWS SAM

在深入瞭解AWS SAM之前,讓我們快速瞭解一下什麼是無伺服器。無伺服器是一種開發、執行和操作應用程式的方式,而無需管理其底層基礎設施。你可能會想知道主要區別是什麼,因為你在AWS中不管理任何基礎設施,你的想法是正確的。

在AWS中,你不需要管理任何物理基礎設施,但是如果你執行一個EC2例項,你需要負責其底層作業系統、安全、補丁和更新。

然後,你需要考慮AWS的託管關聯式資料函式庫服務(RDS),你不需要擔心底層作業系統,但是你仍然需要調整其引數,透過重新組織查詢和表格以及建立資料函式庫索引來進行效能調優。

無伺服器並不保證不需要任何操作工作,但是例項型服務(如EC2、RDS、EMR和MSK)與無伺服器服務(如S3、SNS、SQS、Lambda和DynamoDB)之間存在多個差異。

使用無伺服器服務時,以下幾點是成立的:

  • 你只需為服務使用付費,例如儲存($ per GB)和實際計算操作(請求數量)
  • 你不操作例項,而是操作計算和儲存單元
  • 你使用特定的實體(例如函式而不是整個執行環境,或表格而不是整個資料函式庫)

這些核心概念使得無伺服器計算在許多業務案例中具有成本效益。

AWS SAM的推出是為了完全支援使用IaC方法開發、封裝和佈署無伺服器應用程式。

AWS SAM由兩個部分組成:

  • 實際的框架(執行所有操作的CLI)
  • 一個範本,其規範與CloudFormation類別似

與CDK類別似,AWS SAM可以在不需要額外操作的情況下執行所有操作,例如構建、在本地測試和向AWS提供無伺服器堆積疊。

AWS SAM範本範例

Transform: AWS::Serverless-2016-10-31
Resources:
  DynamoDb:
    Type: "AWS::Serverless::SimpleTable"
    Properties:
      TableName: "myTable"
      PrimaryKey:
        Name: "id"
        Type: "string"

內容解密:

此範本定義了一個簡單的DynamoDB表格。Transform行指定了這是一個AWS SAM範本,它將被CloudFormation處理。Resources部分定義了資源,在這裡是一個名為DynamoDb的簡單表格。Type欄位指定了資源型別為AWS::Serverless::SimpleTable,這是AWS SAM中的一個簡化資源型別。Properties部分定義了表格的屬性,包括表格名稱和主鍵。

與CloudFormation的比較

讓我們比較一下AWS SAM和CloudFormation,以便我們可以充分利用兩者。

AWS SAM範本在寫作上更容易,因為其功能受到限制。例如,DynamoDB表格定義如前所示。

經過轉換後,前面的範本將如下所示:

{
  "Resources": {
    "DynamoDb": {
      "Type": "AWS::DynamoDB::Table",
      "Properties": {
        "KeySchema": [
          {
            "KeyType": "HASH",
            "AttributeName": "id"
          }
        ],
        "TableName": "myTable",
        "AttributeDefinitions": [
          {
            "AttributeName": "id",
            "AttributeType": "S"
          }
        ],
        "BillingMode": "PAY_PER_REQUEST"
      }
    }
  }
}

內容解密:

這個JSON範本是經過轉換後的結果。可以看到,DynamoDb資源被轉換為AWS::DynamoDB::Table型別,並且其屬性被轉換為CloudFormation所需的格式。這表明AWS SAM範本最終會被轉換為CloudFormation範本。

無伺服器應用程式開發

AWS SAM為開發無伺服器應用程式提供了一種簡化的方法。透過使用AWS SAM,開發人員可以輕鬆地開發、構建、測試和佈署無伺服器應用程式。

使用AWS SAM的主要優點包括:

  • 簡化的範本語法
  • 與CloudFormation的相容性
  • 對無伺服器應用程式的原生支援

問題

  1. 什麼是AWS SAM?
  2. AWS SAM與CloudFormation的主要區別是什麼?
  3. 如何使用AWS SAM定義無伺服器資源?
  4. AWS SAM範本與CloudFormation範本之間的關係是什麼?
  5. 使用AWS SAM的主要優點是什麼?
  graph LR
    A[開始] --> B{AWS SAM範本}
    B -->|轉換| C[CloudFormation範本]
    C --> D[佈署]
    D --> E[無伺服器應用程式]

圖表翻譯: 此圖表展示了使用AWS SAM開發無伺服器應用程式的流程。首先,我們建立一個AWS SAM範本,然後該範本被轉換為CloudFormation範本。最後,CloudFormation範本被佈署,從而建立無伺服器應用程式。

使用AWS SAM佈署無伺服器應用程式

瞭解AWS SAM與CloudFormation的差異

首先,AWS SAM範本是專為無伺服器應用程式和服務設計的。目前,AWS SAM範本參考支援以下資源型別:

  • AWS::Serverless::API:建立API閘道器及相關資源
  • AWS::Serverless::Application:建立無伺服器應用程式
  • AWS::Serverless::Function:建立Lambda函式及相關資源
  • AWS::Serverless::HttpApi:建立HTTP API閘道器及相關資源
  • AWS::Serverless::LayerVersion:建立Lambda層
  • AWS::Serverless::SimpleTable:建立簡化的DynamoDB表(僅主鍵無排序鍵)

仍然可以將CloudFormation的資源與AWS SAM的資源結合使用。例如,如果我們想建立一個S3儲存桶與SimpleTable結合,可以透過新增CloudFormation資源來實作,如下程式碼所示:

Transform: AWS::Serverless-2016-10-31
Resources:
  DynamoDb:
    Type: AWS::Serverless::SimpleTable
    Properties:
      TableName: "myTable"
      PrimaryKey:
        Name: "id"
        Type: "string"
  Bucket:
    Type: "AWS::S3::Bucket"

我們只需要指定CloudFormation特定的資源型別。

其次,當我們想要透過CLI佈署AWS SAM應用程式且不使用互動式對話方塊時,必須擁有一個S3儲存桶。原因是AWS SAM應用程式由原始碼和範本組成。AWS SAM CLI將負責構建應用程式(如果需要編譯),並將Lambda函式的工件上傳到S3。

最後,AWS SAM允許透過建立本地API閘道器或針對應用程式執行測試事件來進行本地測試。

內容解密:

上述範本展示瞭如何混合使用AWS SAM和CloudFormation資源。Transform段指定了使用AWS SAM的版本。Resources段定義了兩個資源:一個是使用AWS SAM的SimpleTable,另一個是使用CloudFormation的S3儲存桶。SimpleTable資源簡化了DynamoDB表的建立過程,而S3儲存桶則是透過CloudFormation資源直接建立的。

使用AWS SAM編寫您的第一個無伺服器應用程式

在本文中,我們將建立幾個無伺服器應用程式,以涵蓋AWS SAM的大部分功能。第一個應用程式——“Hello, World”——將使用AWS Quick Start範本建立,以便我們能夠快速上手AWS SAM。

步驟1:安裝AWS SAM CLI

在開始之前,我們需要在本地機器上安裝AWS SAM CLI及其依賴項。安裝步驟根據作業系統的不同而有所不同。以下是macOS上的安裝步驟:

  1. 確保您已安裝Docker和Homebrew。
  2. 透過以下命令安裝AWS SAM CLI:
$ brew tap aws/tap
$ brew install aws-sam-cli
  1. 透過執行以下命令檢查安裝:
$ sam --version

如果沒有錯誤輸出,那麼您就可以開始使用了。

步驟2:建立Hello World應用程式

  1. 初始化專案:
$ sam init
  1. 按照對話方塊的提示進行操作。選擇1 - AWS Quick Start Templates
  2. 選擇執行時環境,例如python3.8
  3. 輸入應用程式名稱,例如hello-world
  4. 選擇Hello World Example範本。

AWS SAM將生成一個應用程式並提供下一步的指示。

檢查生成的目錄結構

生成的目錄結構如下:

.
├── README.md
├── __init__.py
├── events
│   └── event.json
├── hello_world
│   ├── __init__.py
│   ├── app.py
│   └── requirements.txt
├── template.yaml
└── tests
    ├── __init__.py
    └── unit
        ├── __init__.py
        └── test_handler.py

分析範本檔案

Globals:
  Function:
    Timeout: 3

Globals段用於定義多個資源分享的屬性。例如,如果您正在構建一個包含多個Lambda函式的應用程式,並且它們都使用相同的執行時和超時設定,那麼可以在Globals中定義這些屬性,以避免在每個資源中重複定義。

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get

Resources段定義了一個名為HelloWorldFunction的Lambda函式。它指定了函式的程式碼位置、處理程式、執行時以及觸發器事件。

內容解密:

上述範本定義了一個Lambda函式HelloWorldFunctionCodeUri指定了函式程式碼的位置,Handler指定了處理函式入口,Runtime指定了函式的執行時環境。Events段定義了一個API閘道器觸發器,當收到GET請求時觸發Lambda函式。

隨著無伺服器架構的持續發展,AWS SAM將繼續扮演重要的角色。透過進一步探索其功能和最佳實踐,我們可以更好地利用AWS SAM來構建高效、可擴充套件的無伺服器應用程式。

圖表示例

  graph LR
    A[開始] --> B[sam init]
    B --> C[選擇範本]
    C --> D[選擇執行時]
    D --> E[輸入應用程式名稱]
    E --> F[生成應用程式]
    F --> G[分析範本]
    G --> H[佈署應用程式]

圖表翻譯:

此圖示展示了使用AWS SAM建立無伺服器應用程式的流程。首先,透過sam init命令初始化專案,然後按照提示選擇範本和執行時,輸入應用程式名稱。完成這些步驟後,AWS SAM將生成應用程式。接下來,可以分析生成的範本檔案,並最終佈署應用程式。

技術深度分析

AWS SAM透過簡化無伺服器應用程式的開發流程,提供了諸多優勢。首先,其特定的資源型別(如AWS::Serverless::Function)簡化了Lambda函式的建立和組態。其次,AWS SAM與CloudFormation的相容性允許開發者利用CloudFormation的強大功能,同時享受無伺服器架構的優勢。

效能最佳化

在使用AWS SAM時,效能最佳化是一個重要的考量。透過合理組態Lambda函式的記憶體和超時設定,可以最佳化函式的效能。此外,利用AWS SAM的本地除錯功能,可以在佈署前發現並修復效能問題。

安全性考量

安全性是無伺服器應用程式開發中的一個關鍵方面。AWS SAM透過與IAM(身份和存取管理)整合,提供了細粒度的存取控制。開發者應確保為Lambda函式組態適當的IAM角色和許可權,以避免不必要的安全風險。

使用AWS SAM佈署無伺服器應用程式

隨著雲端運算技術的快速發展,無伺服器架構(Serverless Architecture)已成為現代軟體開發的主流趨勢之一。AWS SAM(Serverless Application Model)是AWS提供的一種開源框架,用於簡化無伺服器應用程式的開發、測試和佈署過程。本篇文章將探討如何使用AWS SAM來佈署無伺服器應用程式,並透過實際案例展示其強大的功能。

AWS SAM簡介

AWS SAM是一種根據AWS CloudFormation的框架,旨在簡化無伺服器應用程式的開發流程。它提供了一種簡單的語法來定義無伺服器應用程式的資源,如AWS Lambda函式、Amazon API Gateway、Amazon DynamoDB表等。透過使用AWS SAM,開發者可以更快速地開發和佈署無伺服器應用程式,並更好地管理相關資源。

關鍵特性

  • 簡化無伺服器應用程式的定義和佈署
  • 與AWS CloudFormation緊密整合,提供強大的資源管理能力
  • 支援多種AWS服務,包括AWS Lambda、Amazon API Gateway、Amazon DynamoDB等
  • 提供本地測試和除錯功能,加速開發流程

建立第一個無伺服器應用程式

讓我們從建立一個簡單的「Hello, World」應用程式開始,逐步瞭解如何使用AWS SAM來開發和佈署無伺服器應用程式。

步驟1:初始化專案

首先,我們需要安裝AWS SAM CLI工具。安裝完成後,可以透過以下命令初始化一個新的AWS SAM專案:

sam init

步驟2:檢視範本檔案

初始化完成後,開啟template.yaml檔案,可以看到以下內容:

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  HelloWorldFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: app.lambda_handler
      Runtime: python3.8
      CodeUri: hello_world/
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get
Outputs:
  HelloWorldApi:
    Description: "API Gateway endpoint URL for Prod stage for Hello World function"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
  HelloWorldFunction:
    Description: "Hello World Lambda Function ARN"
    Value: !GetAtt HelloWorldFunction.Arn
  HelloWorldFunctionIamRole:
    Description: "Implicit IAM Role created for Hello World function"
    Value: !GetAtt HelloWorldFunctionRole.Arn

#### 內容解密:

  • AWSTemplateFormatVersionTransform定義了範本的版本和使用的AWS SAM轉換器。
  • Resources部分定義了無伺服器應用程式的資源,包括一個名為HelloWorldFunction的AWS Lambda函式。
  • Properties部分定義了Lambda函式的屬性,如處理程式(Handler)、執行環境(Runtime)和程式碼位置(CodeUri)。
  • Events部分定義了觸發Lambda函式的事件源,在此例中是一個API Gateway事件。
  • Outputs部分定義了佈署後輸出的值,包括API Gateway的端點URL和Lambda函式的ARN。

建置和佈署應用程式

步驟1:建置應用程式

使用以下命令建置應用程式:

sam build --use-container

這個命令會在容器中建置應用程式,確保所有相依性都被正確安裝。

#### 內容解密:

  • --use-container引數指示SAM CLI使用Docker容器來建置應用程式,以確保建置環境的一致性。
  • 建置完成後,相關的建置產物將被儲存在.aws-sam/build目錄下。

步驟2:本地測試

建置完成後,可以使用以下命令進行本地測試:

sam local invoke

或者啟動本地API Gateway進行測試:

sam local start-api

#### 內容解密:

  • sam local invoke命令允許開發者在本地呼叫Lambda函式,無需佈署到AWS雲端。
  • sam local start-api命令啟動一個本地API Gateway,模擬實際佈署後的API端點。

佈署到AWS雲端

完成本地測試後,可以使用以下命令將應用程式佈署到AWS雲端:

sam deploy --stack-name hello-world --capabilities CAPABILITY_IAM --resolve-s3

#### 內容解密:

  • --stack-name引數指定了CloudFormation堆積疊的名稱。
  • --capabilities CAPABILITY_IAM引數允許SAM建立必要的IAM角色。
  • --resolve-s3引數自動處理S3儲存桶的建立,用於存放佈署包。

檢視日誌和分析

AWS SAM提供了檢視日誌的功能,可以使用以下命令檢視Lambda函式的日誌:

sam logs -n HelloWorldFunction --stack-name hello-world --tail

#### 內容解密:

  • -n引數指定了要檢視日誌的Lambda函式名稱。
  • --stack-name引數指定了相關的CloudFormation堆積疊名稱。
  • --tail引數表示持續檢視最新的日誌記錄。

建立複雜應用程式

在掌握了基本的AWS SAM應用程式開發和佈署流程後,我們可以進一步建立更複雜的應用程式。例如,建立一個小型派對企劃應用程式,用於處理和儲存派對和嘉賓的相關資訊。

設計考量

  • 使用AWS Lambda處理業務邏輯。
  • 使用Amazon DynamoDB儲存派對和嘉賓的資料。
  • 使用Amazon API Gateway提供RESTful API介面。

實作步驟

  1. 定義AWS SAM範本,描述相關資源。
  2. 編寫Lambda函式程式碼,處理業務邏輯。
  3. 使用AWS SAM CLI建置和佈署應用程式。
  4. 進行本地測試和除錯。
  5. 佈署到AWS雲端並進行驗證。