本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Lambda 函數很少單獨執行。相反,它們通常是具有其他資源 (例如資料庫、佇列和儲存體) 的無伺服器應用程式的一部分。使用基礎設施做為程式碼 (IaC)
用於 Lambda 的 IaC 工具
- AWS CloudFormation
-
CloudFormation 是來自 的基礎 IaC 服務 AWS。您可以使用 YAML 或 JSON 範本來建立和佈建整個 AWS 基礎設施,包括 Lambda 函數。CloudFormation 處理建立、更新和刪除 AWS 資源的複雜性。
- AWS Serverless Application Model (AWS SAM)
-
AWS SAM 是在 CloudFormation 上建置的開放原始碼架構。它提供可定義無伺服器應用程式的簡化語法。使用 AWS SAM 範本,只需幾行 YAML 即可快速佈建 Lambda 函數、API、資料庫和事件來源。
- AWS Cloud Development Kit (AWS CDK)
-
CDK 是 IaC 的程式碼優先方法。可以使用 TypeScript、JavaScript、Python、Java、C#、.Net 或 Go 來定義基於 Lambda 的架構。選擇您偏好的語言,並使用程式設計元素,例如參數、條件、迴圈、合成和繼承,來定義基礎設施的所需結果。然後,CDK 會產生基礎 CloudFormation 範本以進行部署。如需搭配使用 Lambda 與 CDK 的範例,請參閱 使用 部署 Lambda 函數 AWS CDK。

AWS 也提供名為 的服務 AWS Infrastructure Composer ,以使用簡單的圖形界面開發 IaC 範本。使用 Infrastructure Composer,您可以透過在視覺化畫布 AWS 服務 中拖曳、分組和連線來設計應用程式架構。Infrastructure Composer 接著會從您的設計建立 AWS SAM 範本或 AWS CloudFormation 範本,供您用來部署應用程式。
在下面的 開始使用適用於 Lambda 的 IaC 章節中,您可以使用 Infrastructure Composer,根據現有的 Lambda 函數為無伺服器應用程式開發範本。
開始使用適用於 Lambda 的 IaC
在本教學課程中,您可以從現有的 Lambda 函數建立 AWS SAM 範本,然後在 Infrastructure Composer 中新增其他 AWS 資源,以開始使用 IaC 搭配 Lambda。
執行本教學課程時,您將學習一些基本概念,例如如何指定 AWS 資源 AWS SAM。您也將了解如何使用 Infrastructure Composer 來建置您可以使用 AWS SAM 或 部署的無伺服器應用程式 AWS CloudFormation。
請執行下列步驟以完成本教學課程:
-
建立範例 Lambda 函數
-
使用 Lambda 主控台檢視函數的 AWS SAM 範本
-
將函數的組態匯出至 , AWS Infrastructure Composer 並根據函數的組態設計簡單的無伺服器應用程式
-
儲存更新後的 AWS SAM 範本,做為部署無伺服器應用程式的基礎
先決條件
在本教學課程中,您會使用 Infrastructure Composer 的本機同步處理功能,將範本和程式碼檔案儲存到本機建置機器。要使用此功能,您需要一個支援檔案系統存取 API 的瀏覽器,該瀏覽器允許 Web 應用程式在本機檔案系統中讀取、寫入和儲存文件。我們建議使用 Google Chrome 或 Microsoft Edge。如需檔案系統存取 API 的詳細資訊,請參閱什麼是檔案系統存取 API?
建立 Lambda 函數
在此第一步驟中,將會建立 Lambda 函數,可用於完成本教學課程的其餘部分。為了簡化事情,您可以使用 Lambda 主控台,使用 Python 3.11 執行期來建立基本的「Hello world」函數。
若要使用主控台建立「Hello world」Lambda 函數
-
開啟 Lambda 主控台
。 -
選擇 Create function (建立函數)。
-
保持選取從頭開始撰寫,然後在基本資訊之下的函數名稱中輸入
LambdaIaCDemo
。 -
針對執行期,選取 Python 3.11。
-
選擇 Create function (建立函數)。
檢視函數的 AWS SAM 範本
在您將函數組態匯出至 Infrastructure Composer 之前,請使用 Lambda 主控台以 AWS SAM 範本的方式檢視函數目前的組態。透過遵循本節中的步驟,您將了解 AWS SAM 範本的結構,以及如何定義 Lambda 函數之類的資源,以開始指定無伺服器應用程式。
檢視函數的 AWS SAM 範本
-
開啟 Lambda 主控台中的函數頁面
。 -
選擇您剛建立的函數 (
LambdaIaCDemo
)。 -
在函數概觀窗格中,選擇範本。
您會看到函數的 AWS SAM 範本,而不是代表函數組態的圖表。範本看起來應該如下所示。
# This AWS SAM template has been generated from your function's # configuration. If your function has one or more triggers, note # that the AWS resources associated with these triggers aren't fully # specified in this template and include placeholder values.Open this template # in AWS Application Composer or your favorite IDE and modify # it to specify a serverless application with other AWS resources. AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: An AWS Serverless Specification template describing your function. Resources: LambdaIaCDemo: Type: AWS::Serverless::Function Properties: CodeUri: . Description: '' MemorySize: 128 Timeout: 3 Handler: lambda_function.lambda_handler Runtime: python3.11 Architectures: - x86_64 EventInvokeConfig: MaximumEventAgeInSeconds: 21600 MaximumRetryAttempts: 2 EphemeralStorage: Size: 512 RuntimeManagementConfig: UpdateRuntimeOn: Auto SnapStart: ApplyOn: None PackageType: Zip Policies: Statement: - Effect: Allow Action: - logs:CreateLogGroup Resource: arn:aws:logs:us-east-1:123456789012:* - Effect: Allow Action: - logs:CreateLogStream - logs:PutLogEvents Resource: - >- arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/LambdaIaCDemo:*
讓我們花一點時間看看函數的 YAML 範本,並了解一些重要概念。
範本以宣告 Transform: AWS::Serverless-2016-10-31
開始。此宣告是必要的,因為在幕後, AWS SAM 範本是透過 部署的 AWS CloudFormation。使用 Transform
陳述式將範本識別為 AWS SAM 範本檔案。
在 Transform
聲明之後伴隨的 Resources
部分。這是定義您要使用 AWS SAM 範本部署 AWS 的資源。 AWS SAM 範本可以包含 AWS SAM 資源和資源的組合 AWS CloudFormation 。這是因為在部署期間, AWS SAM 範本會擴展到 AWS CloudFormation 範本,因此任何有效的 AWS CloudFormation 語法都可以新增到 AWS SAM 範本。
目前,範本 Resources
區段中只定義了一個資源,即您的 Lambda 函數 LambdaIaCDemo
。若要將 Lambda 函數新增至 AWS SAM 範本,請使用 AWS::Serverless::Function
資源類型。Lambda 函數資源的 Properties
定義函數的執行期、函數處理常式和其他組態選項。此處也定義了函數的原始程式碼路徑,該程式碼 AWS SAM 應該用來部署函數。若要進一步了解 中的 Lambda 函數資源 AWS SAM,請參閱《 AWS SAM 開發人員指南》中的 AWS::Serverless::Function。
除了函數屬性和組態之外, 範本也會為您的函數指定 AWS Identity and Access Management (IAM) 政策。此政策授予您函數將日誌寫入 Amazon CloudWatch Logs 的許可。當您在 Lambda 主控台中建立函數時,Lambda 會自動將此政策附加至您的函數。若要進一步了解如何為 AWS SAM 範本中的函數指定 IAM 政策,請參閱《 AWS SAM 開發人員指南》的 AWS::Serverless::Function 頁面上的 policies
屬性。
若要進一步了解 AWS SAM 範本的結構,請參閱AWS SAM 範本結構。
使用 AWS Infrastructure Composer 設計無伺服器應用程式
若要使用函數的 AWS SAM 範本作為起點開始建置簡單的無伺服器應用程式,請將函數組態匯出至 Infrastructure Composer,並啟用 Infrastructure Composer 的本機同步模式。本機同步會自動將函數的程式碼和 AWS SAM 範本儲存到本機建置機器,並在您在 Infrastructure Composer 中新增其他 AWS 資源時保持儲存的範本同步。
若要將您的函數匯出至 Infrastructure Composer
-
在函數概觀窗格中,選擇匯出至應用程式編寫器。
若要將函數的組態和程式碼匯出至 Infrastructure Composer,Lambda 會在您的帳戶中建立 Amazon S3 儲存貯體來暫時存放此資料。
-
在對話方塊中,選擇確認並建立專案以接受此儲存貯體的預設名稱,並將函數的設定和程式碼匯出至 Infrastructure Composer。
-
(選擇性) 若要為 Lambda 建立的 Amazon S3 儲存貯體選擇其他名稱,請輸入新名稱,然後選擇確認並建立專案。Amazon S3 儲存貯體的名稱必須是全域唯一的,並遵循儲存貯體命名規則。
選取確認並建立專案會開啟 Infrastructure Composer 主控台。在畫布上,您將看到您 Lambda 函數。
-
從選單下拉式清單中選擇啟用本機同步。
-
在開啟的對話方塊中,選擇選取資料夾,然後選取本機建置機器上的資料夾。
-
選擇啟用以啟用本機同步。
若要將您的函數匯出至 Infrastructure Composer,您需要有使用某些 API 動作的許可。如果您無法匯出函數,請見 所需的許可 並確認您有所需的許可。
注意
標準 Amazon S3 定價
若要避免將額外費用新增至您的 AWS 帳戶,請遵循將函數匯出至 Infrastructure Composer 後刪除儲存貯體中的指示。如需 Lambda 所建立 Amazon S3 儲存貯體的詳細資訊,請參閱 AWS Lambda 搭配 使用 AWS Infrastructure Composer。
若要在 Infrastructure Composer 中設計無伺服器應用程式
啟用本機同步後,您在 Infrastructure Composer 中所做的變更將反映在本機建置機器上儲存的 AWS SAM 範本中。您現在可以將其他 AWS 資源拖放到 Infrastructure Composer 畫布上,以建置您的應用程式。在此範例中,您將 Amazon SQS 簡單佇列新增為 Lambda 函數的觸發程序,以及新增 DynamoDB 資料表供函數寫入資料。
-
執行下列動作,將 Amazon SQS 觸發條件新增至您的 Lambda 函數:
-
在資源面板的搜尋欄位中,輸入
SQS
。 -
將 SQS 佇列資源拖曳到畫布上,並將其放置在 Lambda 函數的左側。
-
選擇詳細資訊,然後為邏輯 ID 輸入
LambdaIaCQueue
。 -
選擇 Save (儲存)。
-
按一下 SQS 佇列卡上的訂閱連接埠,然後將它拖曳至 Lambda 函數卡上的左側連接埠,即可連接您的 Amazon SQS 和 Lambda 資源。兩個資源之間出現一條線表示連線成功。Infrastructure Composer 也會在畫布底部顯示訊息,指示出兩個資源已成功連線。
-
-
執行下列動作,為您的 Lambda 函數新增 Amazon DynamoDB 資料表,以便將資料寫入:
-
在資源面板的搜尋欄位中,輸入
DynamoDB
。 -
將 DynamoDB 資料表資源拖曳到畫布上,並將其放置在 Lambda 函數的右側。
-
選擇詳細資訊,然後為邏輯 ID 輸入
LambdaIaCTable
。 -
選擇 Save (儲存)。
-
按一下 Lambda 函數卡的右側連接埠,然後將其拖曳至 DynamoDB 卡上的左側連接埠,藉此將 DynamoDB 資料表連接至 Lambda 函數。
-
現在您已新增這些額外資源,讓我們來看看 Infrastructure Composer 已建立的更新 AWS SAM 範本。
檢視更新後的 AWS SAM 範本
-
在 Infrastructure Composer 畫布上,選擇範本以從畫布檢視切換至範本檢視。
您的 AWS SAM 範本現在應包含下列其他資源和屬性:
-
識別碼為
LambdaIaCQueue
的 Amazon SQS 佇列LambdaIaCQueue: Type: AWS::SQS::Queue Properties: MessageRetentionPeriod: 345600
當您使用 Infrastructure Composer 新增 Amazon SQS 佇列時,Infrastructure Composer 會設定
MessageRetentionPeriod
屬性。您也可以選取 SQS 佇列卡上的詳細資訊,然後核取或取消核取 Fifo 佇列來設定FifoQueue
屬性。若要設定佇列的其他屬性,您可以手動編輯範本以新增它們。若要進一步瞭解
AWS::SQS::Queue
資源及其可用的屬性,請參閱《AWS CloudFormation 使用者指南》中的AWS::SQS::Queue。 -
Lambda 函數定義中的
Events
屬性,可將 Amazon SQS 佇列指定為函數的觸發程序Events: LambdaIaCQueue: Type: SQS Properties: Queue: !GetAtt LambdaIaCQueue.Arn BatchSize: 1
此
Events
屬性由事件類型和一組依賴於類型的屬性組成。若要了解 AWS 服務 您可以設定以觸發 Lambda 函數的不同 ,以及您可以設定的屬性,請參閱《 AWS SAM 開發人員指南》中的 EventSource。 -
具有識別碼
LambdaIaCTable
的 DynamoDB 資料表LambdaIaCTable: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: id AttributeType: S BillingMode: PAY_PER_REQUEST KeySchema: - AttributeName: id KeyType: HASH StreamSpecification: StreamViewType: NEW_AND_OLD_IMAGES
使用 Infrastructure Composer 新增 DynamoDB 資料表時,您可以選擇 DynamoDB 資料表卡片上的詳細資料並編輯索引鍵值來設定資料表的索引鍵。Infrastructure Composer 也會設定許多其他屬性的預設值,包括
BillingMode
和StreamViewType
。若要進一步了解這些屬性和您可以新增至 AWS SAM 範本的其他屬性,請參閱 AWS CloudFormation 使用者指南中的 AWS::DynamoDB::Table。
-
一項新的 IAM 政策,可讓您在新增的 DynamoDB 資料表上執行 CRUD 操作的函數許可。
Policies: ... - DynamoDBCrudPolicy: TableName: !Ref LambdaIaCTable
完整的最終 AWS SAM 範本應如下所示。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Specification template describing your function.
Resources:
LambdaIaCDemo:
Type: AWS::Serverless::Function
Properties:
CodeUri: .
Description: ''
MemorySize: 128
Timeout: 3
Handler: lambda_function.lambda_handler
Runtime: python3.11
Architectures:
- x86_64
EventInvokeConfig:
MaximumEventAgeInSeconds: 21600
MaximumRetryAttempts: 2
EphemeralStorage:
Size: 512
RuntimeManagementConfig:
UpdateRuntimeOn: Auto
SnapStart:
ApplyOn: None
PackageType: Zip
Policies:
- Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
Resource: arn:aws:logs:us-east-1:594035263019:*
- Effect: Allow
Action:
- logs:CreateLogStream
- logs:PutLogEvents
Resource:
- arn:aws:logs:us-east-1:594035263019:log-group:/aws/lambda/LambdaIaCDemo:*
- DynamoDBCrudPolicy:
TableName: !Ref LambdaIaCTable
Events:
LambdaIaCQueue:
Type: SQS
Properties:
Queue: !GetAtt LambdaIaCQueue.Arn
BatchSize: 1
Environment:
Variables:
LAMBDAIACTABLE_TABLE_NAME: !Ref LambdaIaCTable
LAMBDAIACTABLE_TABLE_ARN: !GetAtt LambdaIaCTable.Arn
LambdaIaCQueue:
Type: AWS::SQS::Queue
Properties:
MessageRetentionPeriod: 345600
LambdaIaCTable:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: id
AttributeType: S
BillingMode: PAY_PER_REQUEST
KeySchema:
- AttributeName: id
KeyType: HASH
StreamSpecification:
StreamViewType: NEW_AND_OLD_IMAGES
使用 部署無伺服器應用程式 AWS SAM (選用)
如果您想要使用 AWS SAM 來使用您剛在 Infrastructure Composer 中建立的範本來部署無伺服器應用程式,您必須先安裝 AWS SAM CLI。若要執行此操作,請遵循安裝 CLI AWS SAM中的指示。
在部署應用程式之前,您也需要更新 Infrastructure Composer 與範本一起儲存的函數程式碼。目前,Infrastructure Composer 儲存的 lambda_function.py
檔案只包含 Lambda 在建立函數時提供的基本 'Hello world' 程式碼。
若要更新函數程式碼,請複製下列程式碼,並將其貼到 Infrastructure Composer 儲存至本機建置機器的 lambda_function.py
檔案中。當您啟動本機同步模式時,已指定 Infrastructure Composer 要儲存此檔案的目錄。
此程式碼接受來自您在 Infrastructure Composer 中建立之 Amazon SQS 佇列的訊息中的鍵值對。如果索引鍵和值都是字串,則程式碼會使用它們將項目寫入範本中定義的 DynamoDB 資料表。
import boto3
import os
import json
# define the DynamoDB table that Lambda will connect to
tablename = os.environ['LAMBDAIACTABLE_TABLE_NAME']
# create the DynamoDB resource
dynamo = boto3.client('dynamodb')
def lambda_handler(event, context):
# get the message out of the SQS event
message = event['Records'][0]['body']
data = json.loads(message)
# write event data to DDB table
if check_message_format(data):
key = next(iter(data))
value = data[key]
dynamo.put_item(
TableName=tablename,
Item={
'id': {'S': key},
'Value': {'S': value}
}
)
else:
raise ValueError("Input data not in the correct format")
# check that the event object contains a single key value
# pair that can be written to the database
def check_message_format(message):
if len(message) != 1:
return False
key, value = next(iter(message.items()))
if not (isinstance(key, str) and isinstance(value, str)):
return False
else:
return True
若要部署您的無伺服器應用程式
若要使用 部署您的應用程式 AWS SAM CLI,請執行下列步驟。若要讓您的函數正確建置和部署,Python 第 3.11 版本必須安裝在您的建置機器和 PATH
。
-
從 Infrastructure Composer 儲存
template.yaml
和lambda_function.py
檔案的目錄中執行下列命令。sam build
此命令會收集應用程式的建置成品,並將它們放置在適當的格式和位置以進行部署。
-
若要部署應用程式並建立 AWS SAM 範本中指定的 Lambda、Amazon SQS 和 DynamoDB 資源,請執行下列命令。
sam deploy --guided
使用
--guided
旗標表示 AWS SAM 會顯示提示,引導您完成部署程序。對於此部署,請按 Enter 接受預設選項。
在部署過程中, 會在您的 中 AWS SAM 建立下列資源 AWS 帳戶:
-
名為 的 An AWS CloudFormation stack
sam-app
-
名稱格式為
sam-app-LambdaIaCDemo-
的 Lambda 函數99VXPpYQVv1M
-
名稱格式為
sam-app-LambdaIaCQueue-
的 Amazon SQS 佇列xL87VeKsGiIo
-
名稱格式為
sam-app-LambdaIaCTable-
的 DynamoDB 資料表CN0S66C0VLNV
AWS SAM 也會建立必要的 IAM 角色和政策,讓您的 Lambda 函數可以從 Amazon SQS 佇列讀取訊息,並在 DynamoDB 資料表上執行 CRUD 操作。
測試已部署的應用程式 (選擇性)
若要確認您的無伺服器應用程式是否正確部署,請將訊息傳送至包含索引鍵值組的 Amazon SQS 佇列,並檢查 Lambda 是否使用這些值將項目寫入 DynamoDB 資料表。
測試您的無伺服器應用程式
-
開啟 Amazon SQS 主控台的佇列
頁面,然後選取從範本所建立 AWS SAM 的佇列。名稱具有格式 sam-app-LambdaIaCQueue-
。xL87VeKsGiIo
-
選擇傳送和接收訊息,然後將以下 JSON 貼到傳送訊息區段裡的訊息內文中。
{ "myKey": "myValue" }
-
選擇傳送訊息。
將訊息傳送至佇列會導致 Lambda 透過範本 AWS SAM 中定義的事件來源映射調用您的函數。若要確認 Lambda 已如預期調用您的函數,請確認項目已新增至 DynamoDB 資料表中。
-
開啟 DynamoDB 主控台的 資料表
頁面,然後選擇資料表。名稱具有格式 sam-app-LambdaIaCTable-
。CN0S66C0VLNV
-
選擇 探索資料表項目 。在 Items returned 窗格中,應該會看到一個包含 id
myKey
和 數值myValue
的項目。