本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 部署 Lambda 函數 AWS CDK
AWS Cloud Development Kit (AWS CDK) 是作為程式碼 (IaC架構的基礎設施,您可以使用您選擇的程式設計語言來定義 AWS 雲端基礎設施。若要定義您自己的雲端基礎設施,您首先會撰寫包含一或多個堆疊的應用程式 (使用 CDK支援的其中一種語言)。然後,您將它合成到 AWS CloudFormation 範本,並將資源部署到 AWS 帳戶。請依照本主題中的步驟部署 Lambda 函數,該函數會從 Amazon API Gateway 端點傳回事件。
隨附於 的 AWS 建構程式庫CDK提供模組,可讓您用來建立 AWS 服務 所提供資源的模型。針對熱門服務,程式庫會提供具有智能預設和最佳實務的彙整建構。您可以使用 aws_lambda 模組來定義函數,並只支援幾行程式碼的資源。
必要條件
開始本教學課程之前,請執行下列命令 AWS CDK 來安裝 。
npm install -g aws-cdk
步驟 1:設定 AWS CDK 專案
為您的新 AWS CDK 應用程式建立目錄,並初始化專案。
注意
AWS CDK 應用程式範本使用專案目錄的名稱來產生來源檔案和類別的名稱。在此範例中,目錄名為 hello-lambda
。若使用不同的專案目錄名稱,您的應用程式將與這些說明不相符。
AWS CDK v2 包含單一套件 AWS 服務 中所有 的穩定建構,稱為 aws-cdk-lib
。在初始化專案時,此套件會安裝為相依性套件。使用某些程式設計語言時,套件會在您第一次建置專案時安裝。
步驟 2:定義 AWS CDK 堆疊
CDK 堆疊是一或多個架構的集合,可定義 AWS 資源。每個CDK堆疊代表CDK應用程式中的 AWS CloudFormation 堆疊。
若要定義您的 CDK,堆疊會遵循您偏好程式設計語言的指示。此堆疊定義下列內容:
-
函數的邏輯名稱:
MyFunction
-
屬性中指定的函數程式碼位置
code
。如需詳細資訊,請參閱 AWS Cloud Development Kit (AWS CDK) API 參考 中的處理常式程式碼。 -
REST API的邏輯名稱:
HelloApi
-
API Gateway 端點的邏輯名稱:
ApiGwEndpoint
請注意,本教學課程中的所有CDK堆疊都會使用 Node.js 執行期作為 Lambda 函數。您可以針對CDK堆疊和 Lambda 函數使用不同的程式設計語言,以利用每種語言的長處。例如,您可以將 TypeScript 用於 CDK堆疊,以利用基礎設施程式碼的靜態輸入優點。您可以使用 JavaScript 作為 Lambda 函數,以利用動態輸入語言的靈活性和快速開發。
步驟 3:建立 Lambda 函數程式碼
-
從專案的根目錄 (
hello-lambda
) 建立 Lambda 函數程式碼的/lib/lambda-handler
目錄。此目錄在 AWS CDK 堆疊的code
屬性中指定。 -
在
/lib/lambda-handler
目錄中建立新的名為index.js
的建檔。將以下程式碼貼到檔案。函數會從API請求中擷取特定屬性,並將其傳回為JSON回應。exports.handler = async (event) => { // Extract specific properties from the event object const { resource, path, httpMethod, headers, queryStringParameters, body } = event; const response = { resource, path, httpMethod, headers, queryStringParameters, body, }; return { body: JSON.stringify(response, null, 2), statusCode: 200, }; };
步驟 4:部署 AWS CDK 堆疊
-
從專案根目錄執行 cdk 合成命令:
cdk synth
此命令會從CDK堆疊合成 AWS CloudFormation 範本。範本是大約 400 行YAML的檔案,如下所示。
注意
如果出現下列錯誤,請確定您位於專案目錄的根目錄。
--app is required either in command-line, in cdk.json or in ~/.cdk.json
範例 AWS CloudFormation 範本
Resources: MyFunctionServiceRole3C357FF2: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: lambda.amazonaws.com Version: "2012-10-17" ManagedPolicyArns: - Fn::Join: - "" - - "arn:" - Ref: AWS::Partition - :iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Metadata: aws:cdk:path: HelloLambdaStack/MyFunction/ServiceRole/Resource MyFunction1BAA52E7: Type: AWS::Lambda::Function Properties: Code: S3Bucket: Fn::Sub: cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region} S3Key: ab1111111cd32708dc4b83e81a21c296d607ff2cdef00f1d7f48338782f92l3901.zip Handler: index.handler Role: Fn::GetAtt: - MyFunctionServiceRole3C357FF2 - Arn Runtime: nodejs20.x ...
-
執行 cdk 部署命令:
cdk deploy
等待您的資源建立。最終輸出包含API閘道端點URL的 。範例:
Outputs: HelloLambdaStack.ApiGwEndpoint77F417B1 =
https://abcd1234.execute-api.us-east-1.amazonaws.com/prod/
步驟 5:測試函數
若要叫用 Lambda 函數,請複製API閘道端點並將其貼到 Web 瀏覽器或執行curl
命令:
curl -s
https://abcd1234.execute-api.us-east-1.amazonaws.com/prod/
回應是從原始事件物件中選取屬性的JSON表示法,其中包含對API閘道端點提出之請求的相關資訊。範例:
{
"resource": "/",
"path": "/",
"httpMethod": "GET",
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept-Language": "en-US,en;q=0.9",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-ASN": "16509",
"CloudFront-Viewer-Country": "US",
"Host": "abcd1234.execute-api.us-east-1.amazonaws.com",
...
步驟 6:清除您的資源
API Gateway 端點可公開存取。若要避免意外費用,請執行 cdk 銷毀命令以刪除堆疊和所有相關資源。
cdk destroy
後續步驟
如需以您選擇的語言撰寫 AWS CDK 應用程式的相關資訊,請參閱下列內容: