返回文章列表

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

本文探討如何使用 AWS SAM 佈署無伺服器應用程式,包含 AWS SAM 的基本概念、與 CloudFormation 的比較、SAM 範本範例、無伺服器應用程式開發流程、以及實際案例示範。文章涵蓋了 SAM CLI 的安裝、Hello World 應用程式建立、範本檔案分析、應用程式建置與佈署、本地測試、佈署到

無伺服器 雲端運算

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的主要優點是什麼?

圖表翻譯: 此圖表展示了使用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來構建高效、可擴充套件的無伺服器應用程式。

圖表示例

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

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

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

圖表翻譯:

此圖示展示了使用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雲端並進行驗證。