使用 AWS CDK 部署 Lambda 函数
AWS Cloud Development Kit (AWS CDK) 是一个基础设施即代码(IaC)框架,可以让您使用所选编程语言来定义 AWS 云基础设施。要定义您自己的云基础设施,请首先编写一个包含一个或多个堆栈的应用程序(使用 CDK 支持的一种语言)。然后,将其合成为 AWS CloudFormation 模板并将您的资源部署到 AWS 账户。按照本主题中的步骤部署可从 Amazon API Gateway 端点返回事件的 Lambda 函数。
CDK 中包含的 AWS 构造库提供可用于对 AWS 服务 提供的资源进行建模的模块。对于常用的服务,该库提供具有智能默认值和最佳实践的精选构造。只需几行代码,就可以使用 aws_lambda 模块来定义您的函数和支持资源。
先决条件
在开始本教程之前,通过运行以下命令安装 AWS CDK。
npm install -g aws-cdk
第 1 步:设置您的 AWS CDK 项目
为您的新 AWS CDK 应用程序创建目录并初始化项目。
注意
AWS CDK 应用程序模板使用项目目录的名称来生成源文件和类的名称。在此示例中,该目录名为 hello-lambda
。如果您使用其他项目目录名称,则您的应用将与这些说明不匹配。
AWS CDK v2 在名为 aws-cdk-lib
的单个程序包中包含适用于所有 AWS 服务 的稳定构造。当您初始化该项目时,此程序包作为依赖项进行安装。使用某些编程语言时,会在您首次构建项目时安装该程序包。
步骤 2:定义 AWS CDK 堆栈
CDK 堆栈是一个或多个构造的集合,用于定义 AWS 资源。每个 CDK 堆栈代表您的 CDK 应用程序中的一个 AWS CloudFormation 堆栈。
要定义您的 CDK 堆栈,请按照首选编程语言的说明操作。此堆栈定义以下内容:
-
函数的逻辑名称:
MyFunction
-
在
code
属性中指定的函数代码的位置。有关更多信息,请参阅《AWS Cloud Development Kit (AWS CDK) API Reference》中的 Handler code。 -
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 synth 命令:
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 deploy 命令:
cdk deploy
等待资源创建完成。最终输出包括 API Gateway 端点的 URL。例如:
Outputs: HelloLambdaStack.ApiGwEndpoint77F417B1 =
https://abcd1234.execute-api.us-east-1.amazonaws.com/prod/
步骤 5:测试函数
要调用 Lambda 函数,请复制 API Gateway 端点,并将其粘贴到 Web 浏览器中或运行 curl
命令:
curl -s
https://abcd1234.execute-api.us-east-1.amazonaws.com/prod/
响应是原始事件对象中选定属性的 JSON 表示,其中包含有关向 API Gateway 端点发出的请求的信息。例如:
{
"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 destroy 命令,删除堆栈和所有关联资源。
cdk destroy
后续步骤
有关使用所选语言编写 AWS CDK 应用程序的信息,请参阅以下内容: