使用 部署 Lambda 函數 AWS CDK - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 部署 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 應用程式建立目錄,並初始化專案。

JavaScript
mkdir hello-lambda cd hello-lambda cdk init --language javascript
TypeScript
mkdir hello-lambda cd hello-lambda cdk init --language typescript
Python
mkdir hello-lambda cd hello-lambda cdk init --language python

專案啟動後,請啟用專案的虛擬環境,並安裝 的基準相依性 AWS CDK。

source .venv/bin/activate python -m pip install -r requirements.txt
Java
mkdir hello-lambda cd hello-lambda cdk init --language java

將此 Maven 專案匯入您的 Java 整合開發環境 (IDE)。例如,在 Eclipse 中,選擇檔案 匯入 Maven 現有 Maven 專案

C#
mkdir hello-lambda cd hello-lambda cdk init --language csharp
注意

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 函數,以利用動態輸入語言的靈活性和快速開發。

JavaScript

開啟 lib/hello-lambda-stack.js 檔案並將內容替換如下:

const { Stack } = require('aws-cdk-lib'); const lambda = require('aws-cdk-lib/aws-lambda'); const apigw = require('aws-cdk-lib/aws-apigateway'); class HelloLambdaStack extends Stack { /** * * @param {Construct} scope * @param {string} id * @param {StackProps=} props */ constructor(scope, id, props) { super(scope, id, props); const fn = new lambda.Function(this, 'MyFunction', { code: lambda.Code.asset('lib/lambda-handler'), runtime: lambda.Runtime.NODEJS_LATEST, handler: 'index.handler' }); const endpoint = new apigw.LambdaRestApi(this, 'MyEndpoint', { handler: fn, restApiName: "HelloApi" }); } } module.exports = { HelloLambdaStack }
TypeScript

開啟 lib/hello-lambda-stack.ts 檔案並將內容替換如下:

import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as apigw from "aws-cdk-lib/aws-apigateway"; import * as lambda from "aws-cdk-lib/aws-lambda"; import * as path from 'node:path'; export class HelloLambdaStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps){ super(scope, id, props) const fn = new lambda.Function(this, 'MyFunction', { runtime: lambda.Runtime.NODEJS_LATEST, handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')), }); const endpoint = new apigw.LambdaRestApi(this, `ApiGwEndpoint`, { handler: fn, restApiName: `HelloApi`, }); } }
Python

開啟 /hello-lambda/hello_lambda/hello_lambda_stack.py 檔案並將內容替換如下:

from aws_cdk import ( Stack, aws_apigateway as apigw, aws_lambda as _lambda ) from constructs import Construct class HelloLambdaStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) fn = _lambda.Function( self, "MyFunction", runtime=_lambda.Runtime.NODEJS_LATEST, handler="index.handler", code=_lambda.Code.from_asset("lib/lambda-handler") ) endpoint = apigw.LambdaRestApi( self, "ApiGwEndpoint", handler=fn, rest_api_name="HelloApi" )
Java

開啟 /hello-lambda/src/main/java/com/myorg/HelloLambdaStack.java 檔案並將內容替換如下:

package com.myorg; import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.services.apigateway.LambdaRestApi; import software.amazon.awscdk.services.lambda.Function; public class HelloLambdaStack extends Stack { public HelloLambdaStack(final Construct scope, final String id) { this(scope, id, null); } public HelloLambdaStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); Function hello = Function.Builder.create(this, "MyFunction") .runtime(software.amazon.awscdk.services.lambda.Runtime.NODEJS_LATEST) .code(software.amazon.awscdk.services.lambda.Code.fromAsset("lib/lambda-handler")) .handler("index.handler") .build(); LambdaRestApi api = LambdaRestApi.Builder.create(this, "ApiGwEndpoint") .restApiName("HelloApi") .handler(hello) .build(); } }
C#

開啟 src/HelloLambda/HelloLambdaStack.cs 檔案並將內容替換如下:

using Amazon.CDK; using Amazon.CDK.AWS.APIGateway; using Amazon.CDK.AWS.Lambda; using Constructs; namespace HelloLambda { public class HelloLambdaStack : Stack { internal HelloLambdaStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var fn = new Function(this, "MyFunction", new FunctionProps { Runtime = Runtime.NODEJS_LATEST, Code = Code.FromAsset("lib/lambda-handler"), Handler = "index.handler" }); var api = new LambdaRestApi(this, "ApiGwEndpoint", new LambdaRestApiProps { Handler = fn }); } } }

步驟 3:建立 Lambda 函數程式碼

  1. 從專案的根目錄 (hello-lambda) 建立 Lambda 函數程式碼的/lib/lambda-handler目錄。此目錄在 AWS CDK 堆疊的 code 屬性中指定。

  2. /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 堆疊

  1. 從專案根目錄執行 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 ...
  2. 執行 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 應用程式的相關資訊,請參閱下列內容:

TypeScript

使用 AWS CDK 中的 TypeScript

JavaScript

使用 AWS CDK 中的 JavaScript

Python

在 Python AWS CDK 中使用

Java

在 Java AWS CDK 中使用

C#

在 C# AWS CDK 中使用

Go

使用 in Go AWS CDK 中的