@aws-cdk/aws-lambda

中文文档
1.204.0发布于 2023/06/20Apache-2.0TypeScriptCommonJS近 30 天下载 35.7万

AWS 的 CDK 构造库: Lambda

此软件包已被标记为弃用

AWS CDK v1 has reached End-of-Support on 2023-06-01. This package is no longer being updated, and users should migrate to AWS CDK v2. For more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html

中文使用文档
文档目录31 节
  1. 处理器代码
  2. Docker 图像
  3. 执行角色
  4. 函数超时
  5. 资源政策
  6. 版本数
  7. currentVersion : 更新散列逻辑
  8. currentVersion : 更新层版本的散列逻辑
  9. 别名
  10. 函数 URL
  11. IAM 认证函数 URL
  12. 匿名函数 URL
  13. 函数 URL 的 CORS 配置
  14. 层
  15. 建筑
  16. Lambda 透视
  17. 事件规则目标
  18. 事件源
  19. 进口的羊肉
  20. 带 DLQ 的 Lambda
  21. 有X光追踪的Lambda
  22. 使用剖面图的Lambda
  23. 保留执行的Lambda
  24. 自动缩放
  25. 日志组
  26. 文件系统访问
  27. 电子存储
  28. Singleton 函数
  29. 捆绑资产代码
  30. 语言专用 API
  31. 代码签名

AWS Lambda 构造库


End-of-Support

AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.

关于如何移徙的更多信息,请参见: 移动到 AWS CDK v2 指南。 。 。 .


此构建库允许您定义 AWS Lambda 函数 .

const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
});

处理器代码

这个 lambda.Code 类别包括各种类型的静态便利方法 运行时间代码 .

  • lambda.Code.fromBucket(bucket, key[, objectVersion]) - 指定 S3 对象 包含您运行时代码的归档 .
  • lambda.Code.fromInline(code) - 手柄代码作为字符串插入。 这是 仅限于所支持的运行时间,代码不能超过 4KiB.
  • lambda.Code.fromAsset(path) - 在本地端指定目录或.zip文件 文件系统,在部署前会将其拉链并上传到S3。 另见 捆绑资产代码。 。 。 .
  • lambda.Code.fromDockerBuild(path, options) - 使用一个多克的结果 构建为代码。 运行时代码预计位于 /asset 输入 图像, 并将作为资产被拉链并上传到 S3 .

以下示例显示如何定义 Python 函数并部署代码 从本地目录 my-lambda-handler 页:1

本地资产的Lambda代码示例

当部署包含此代码的堆栈时, 目录将被zip 存档后上传到 S3 桶,然后是 S3 的确切位置 当部署堆栈时,对象会被传递.

在合成过程中, CDK 期望在该资产中找到磁盘上的目录 指定目录。 请注意,我们相对地参考了资产目录 到我们的 CDK 项目目录。 这很重要,当我们想分享 这个构造通过一个图书馆。 不同的编程语言 将资源捆绑到图书馆的不同技术.

Docker 图像

Lambda函数允许在嵌入器图像中指定它们的处理器. 夹克 图像可以是来自 ECR 的图像, 也可以是本地资产, CDK 将包装 进入ECR.

以下内容: DockerImageFunction 构造使用带有 Dockerfile 是用作函数处理器的资产 .

new lambda.DockerImageFunction(this, 'AssetFunction', {
  code: lambda.DockerImageCode.fromImageAsset(path.join(__dirname, 'docker-handler')),
});

也可以指定在ECR中已经存在的图像作为函数处理器.

import * as ecr from '@aws-cdk/aws-ecr';
const repo = new ecr.Repository(this, 'Repository');

new lambda.DockerImageFunction(this, 'ECRFunction', {
  code: lambda.DockerImageCode.fromEcr(repo),
});

这些嵌入器图像资源的道具可以压倒图像 CMD, (中文(简体) ), ENTRYPOINT,以及 WORKDIR 配置以及选择特定的标记或摘要。 更多信息见其文件.

执行角色

Lambda功能在执行期间承担IAM角色. 在CDK默认情况下, Lambda 函数将使用自动生成的角色,如果不提供.

自动生成的角色会自动获得执行 Lambda 的权限 函数。 引用自动生成的角色 :

const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
});

const role = fn.role; // the Role

也可以提供自己的IAM角色. 如果IAM角色不会自动出现 获得执行 Lambda 函数的权限。 发挥作用和提供赠款 适当权限:

const myRole = new iam.Role(this, 'My Role', {
  assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
});

const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  role: myRole, // user-provided role
});

myRole.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSLambdaBasicExecutionRole"));
myRole.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSLambdaVPCAccessExecutionRole")); // only required if your function lives in a VPC

函数超时

AWS Lambda 函数的默认超时为 3 秒, 但可以增加 最多15分钟 超时时间为 Function 这样 在你的堆栈里可以参考它。 比如,你可以用它来创造 a Cloud Watch 提醒以报告函数超时时 :

import * as cdk from '@aws-cdk/core';
import * as cloudwatch from '@aws-cdk/aws-cloudwatch';

const fn = new lambda.Function(this, 'MyFunction', {
   runtime: lambda.Runtime.NODEJS_16_X,
   handler: 'index.handler',
   code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
   timeout: cdk.Duration.minutes(5),
});

if (fn.timeout) {
   new cloudwatch.Alarm(this, `MyAlarm`, {
      metric: fn.metricDuration().with({
         statistic: 'Maximum',
      }),
      evaluationPeriods: 1,
      datapointsToAlarm: 1,
      threshold: fn.timeout.toMilliseconds(),
      treatMissingData: cloudwatch.TreatMissingData.IGNORE,
      alarmName: 'My Lambda Timeout',
   });
}

资源政策

AWS Lambda支持基于资源的政策,以控制Lambda的接入 按资源分列的函数和层次。 特别是,这允许你 允许 AWS 服务和其他 AWS 账户修改和引用您的 函数。 您还可以通过提供 源账户或 ARN( 代表资源的账户和标识符) 以访问函数或层.

declare const fn: lambda.Function;
const principal = new iam.ServicePrincipal('my-service');

fn.grantInvoke(principal);

// Equivalent to:
fn.addPermission('my-service Invocation', {
  principal: principal,
});

更多信息见 基于资源 政策 在 AWS Lambda 开发者指南中.

提供未拥有的本金(如账户本金、通用ARN) 校长、服务负责人和其他账户的负责人) fn.grantInvoke 将产生一项基于资源的政策。 如果 有关本金有限制源账户或ARN的条件 操作(见上文),这些条件将自动添加到 资源政策.

declare const fn: lambda.Function;
const servicePrincipal = new iam.ServicePrincipal('my-service');
const sourceArn = 'arn:aws:s3:::my-bucket';
const sourceAccount = '111122223333';
const servicePrincipalWithConditions = servicePrincipal.withConditions({
  ArnLike: {
    'aws:SourceArn': sourceArn,
  },
  StringEquals: {
    'aws:SourceAccount': sourceAccount,
  },
});

fn.grantInvoke(servicePrincipalWithConditions);

// Equivalent to:
fn.addPermission('my-service Invocation', {
  principal: servicePrincipal,
  sourceArn: sourceArn,
  sourceAccount: sourceAccount,
});

版本数

你用得着 版本 管理您的 AWS Lambda 函数的部署。 比如说,你可以 为β测试发布新版本的功能,但不影响用户 稳定生产版本.

功能版包括以下信息: 功能版 功能版 功能版

  • 函数代码和所有相关的依赖.
  • 执行此功能的 Lambda 运行时间 .
  • 所有函数设置,包括环境变量.
  • 一个独特的亚马逊资源名(ARN)来识别这个版本的功能.

您可以使用 : Version 构造.

declare const fn: lambda.Function;
const version = new lambda.Version(this, 'MyVersion', {
  lambda: fn,
});

这里需要知道的主要警告是,一个功能版本必须始终指向 函数的特定“ 版本 ” 。 当函数被修改时, 版本 将继续指向该函数的“当时版本”.

一种确保 lambda.Version 总是指向最新版本 您的电话 lambda.Function 设置一个在 不像你的代码那样频繁 这可以确保功能总是有 最新代码。 比如说..

const codeVersion = "stringOrMethodToGetCodeVersion";
const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  environment: {
    'CodeVersionString': codeVersion,
  },
});

这个 fn.latestVersion 属性返回 a lambda.IVersion 表示 页:1 $LATEST 伪相.

然而,大多数AWS服务需要特定的AWS Lambda版本, 不允许你使用 $LATEST因此,你通常希望 用于 lambda.currentVersion。 。 。 .

这个 fn.currentVersion 属性可用于获取 lambda.Version 资源代表应用程序中定义的 AWS Lambda 函数. 对函数代码或配置的任何修改都将导致创建 新版本资源。 您可以通过 currentVersionOptions 属性.

注: currentVersion 属性仅在您的 AWS Lambda 函数时被支持 使用任意 lambda.Code.fromAsset 或者说 lambda.Code.fromInline其他类型 代码提供者(例如: lambda.Code.fromBucket)要求您定义 lambda.Version 由于 CDK 无法确定 他们的内容已经改变.

currentVersion: 更新散列逻辑

每次修改了Lambda函数后,要制作出一个新的Lambda版本 currentVersion ,根据 函数的属性。 这告诉了云阵,一个新的 AWS::Lambda::Version 应该创建资源,指向更新的 Lambda 函数.

然而,在这个计算中引入了一个错误,导致逻辑 ID 导致 不需要时更改( 如: 当函数 Tags 财产,或 当 DependsOn 修改了条款)。 这导致部署失败 因为Lambda服务不允许创建重复版本.

这在 AWS CDK 中已固定, 但是 现有 用户需要通过 特性旗。运行的用户 cdk init 由于这个固定将选择在, 默认.

否则,您需要启用 特性旗 @aws-cdk/aws-lambda:recognizeVersionProps。由于云阵没有 允许复制版本,您还需要对 您的功能可以创建一个新版本。 有效率和微不足道 立即修改您所有 lambda 函数, 您可以附加 FunctionVersionUpgrade 边到堆栈,稍作修改 函数描述。 这个方面是一次性用于升级 版本中您的所有功能同时被删除,并且可以在 部署一次.

const stack = new Stack();
Aspects.of(stack).add(new lambda.FunctionVersionUpgrade(LAMBDA_RECOGNIZE_VERSION_PROPS));

当新逻辑生效时, 您可能很少遇到以下错误 : The following properties are not recognized as version properties. 这将 发生时间,通常为 属性覆盖 当使用新属性时 引入于 AWS::Lambda::Function 用于 CDK 仍然不知道 .

要克服这个错误, 请使用 API Function.classifyVersionProperty() 改为 记录该属性更改时是否应当生成新版本. 这通常可以通过检查财产是否可以 使用 更新功能配置 API与否.

currentVersion: 更新层版本的散列逻辑

对散列逻辑的补充更新解决了围绕地层的两个问题. 在修改之前,更新羊肉地层版本不会对 函数版本。 此外,为功能提供了羊肉地层的顺序 被不必要地烤入散列.

这在从2.27版本开始的AWS CDK中已被固定. 如果你跑了的话 cdk init 您需要通过一个 特性旗。 。 。 . 如果你运行 cdk init 与 v2.27 或 以后, 默认情况下, 将选择此固定 .

现有用户需要使用户能够 特性旗 @aws-cdk/aws-lambda:recognizeLayerVersion。由于云阵没有 允许复制版本,它们还需要对 函数可以创建新版本。 有效率和微不足道 立即修改您的 lambda 函数, 用户可以附加 FunctionVersionUpgrade 边到堆栈,稍作修改 函数描述。 这个方面是一次性用于升级 版本中您的所有功能同时被删除,并且可以在 部署一次.

const stack = new Stack();
Aspects.of(stack).add(new lambda.FunctionVersionUpgrade(LAMBDA_RECOGNIZE_LAYER_VERSION));

别名

您可以定义一个或多个 别名 为您的 AWS Lambda 函数。 一个Lambda的别名就像指向一个特定的 Lambda函数版本. 用户可以使用别名访问函数版本 ARN (英语).

这个 version.addAlias() 方法可以用来定义 AWS Lambda 化名: 指向特定版本.

以下示例定义了命名为 live 将永远指向 代表您 CDK 应用程序中定义的函数的版本。 当你改变 您的 lambda 代码或配置将创建新的资源。 你们可以 通过 currentVersionOptions 属性.

const fn = new lambda.Function(this, 'MyFunction', {
  currentVersionOptions: {
    removalPolicy: RemovalPolicy.RETAIN, // retain old versions
    retryAttempts: 1,                   // async retry attempts
  },
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
});

fn.addAlias('live');

函数 URL

函数 URL 是您 Lambda 函数的专用 HTTP( S) 端点 。 当创建函数 URL 时, Lambda 自动为您生成一个独特的 URL 端点 。 函数 URL 可以为最新版本的 Lambda 函数创建,或函数异名(但不为版本创建).

函数URL是双堆放的,支持IPv4和IPv6,以及跨源资源共享(CORS)配置. 在您为您的功能配置一个函数 URL后, 您可以通过网页浏览器、 卷曲、 Postman 或 HTTP 客户端引用您的功能 。 要使用 IAM 认证函数, 您的 HTTP 客户端必须支持 SigV4 签名 .

见 引用函数 URL aWS Lambda 开发者指南的章节 以这种方式引用的函数的输入和输出有效载荷的更多信息.

IAM 认证函数 URL

要创建可用 IAM 身份调用的函数 URL, 请调用 addFunctionUrl(),然后是 grantInvokeFunctionUrl()数字 :

// Can be a Function or an Alias
declare const fn: lambda.Function;
declare const myRole: iam.Role;

const fnUrl = fn.addFunctionUrl();
fnUrl.grantInvokeUrl(myRole);

new CfnOutput(this, 'TheUrl', {
  // The .url attributes will return the unique Function URL
  value: fnUrl.url,
});

此 URL 的呼叫需要与 SigV4 签名 .

匿名函数 URL

要创建可匿名调用的函数 URL, 通过 authType: FunctionUrlAuthType.NONE 改为 addFunctionUrl()数字 :

// Can be a Function or an Alias
declare const fn: lambda.Function;

const fnUrl = fn.addFunctionUrl({
  authType: lambda.FunctionUrlAuthType.NONE,
});

new CfnOutput(this, 'TheUrl', {
  value: fnUrl.url,
});

函数 URL 的 CORS 配置

如果您希望您的函数 URL 可以从浏览器中的网页中调出, 您 需要配置跨源资源共享以允许调用(如果有的话) 不这样做,你的浏览器会拒绝打电话:

declare const fn: lambda.Function;

fn.addFunctionUrl({
  authType: lambda.FunctionUrlAuthType.NONE,
  cors: {
    // Allow this to be called from websites on https://example.com.
    // Can also be ['*'] to allow all domain.
    allowedOrigins: ['https://example.com'],

    // More options are possible here, see the documentation for FunctionUrlCorsOptions
  },
});

层

这个 lambda.LayerVersion 类可用于定义 Lambda 层并管理 允许其他 AWS 账户或组织使用.

Lambda 层使用示例

默认情况下,更新一层将创建一个新的层版,CloudFormation将作为堆栈更新的一部分来删除旧版.

或者,可以使用去除政策保留旧版本:

new lambda.LayerVersion(this, 'MyLayer', {
  removalPolicy: RemovalPolicy.RETAIN,
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
});

建筑

Lambda功能默认运行在具有64位x86架构的计算系统上.

AWS Lambda服务也在ARM架构上运行计算,这可以降低成本 一些工作量.

可以配置一个 lambda 函数在其中的一个平台上运行:

new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  architecture: lambda.Architecture.ARM_64,
});

同样地,Lambda地层版本也可以被它兼容的架构所标记.

new lambda.LayerVersion(this, 'MyLayer', {
  removalPolicy: RemovalPolicy.RETAIN,
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  compatibleArchitectures: [lambda.Architecture.X86_64, lambda.Architecture.ARM_64],
});

Lambda 透视

可以配置 Lambda 函数以使用 Cloud Watch Lambda 透视 它为Lambda函数提供了低水平运行时间度量.

new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  insightsVersion: lambda.LambdaInsightsVersion.VERSION_1_0_98_0,
});

如果在CDK中还不能提供真知灼见的版本,您也可以以这种方式直接提供ARN-

const layerArn = 'arn:aws:lambda:us-east-1:580247275435:layer:LambdaInsightsExtension:14';
new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  insightsVersion: lambda.LambdaInsightsVersion.fromInsightVersionArn(layerArn),
});

如果您正在部署 ARM 64 Lambda 函数, 您必须指定一个 Lambda Insights 版本 ### 1_0_119_0。 。 。 .

new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  architecture: lambda.Architecture.ARM_64,
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  insightsVersion: lambda.LambdaInsightsVersion.VERSION_1_0_119_0,
});

事件规则目标

您可以使用 AWS Lambda 函数作为亚马逊云表事件的目标 规则:

import * as events from '@aws-cdk/aws-events';
import * as targets from '@aws-cdk/aws-events-targets';

declare const fn: lambda.Function;
const rule = new events.Rule(this, 'Schedule Rule', {
 schedule: events.Schedule.cron({ minute: '0', hour: '4' }),
});
rule.addTarget(new targets.LambdaFunction(fn));

事件源

AWS Lambda 支持一个 各种事件源。 。 。 .

在多数情况下,由于发生下列事件而触发函数是可能的: 使用其中的 add<Event>Notification 用于源构造的方法。 对于 实例 s3.Bucket 构造有一个 onEvent 可用于 当S3桶上发生诸如Put Object之类的事件时,触发了 Lambda .

将事件源添加到函数的另一种方法是使用 function.addEventSource(source)。 。 。 . 此方法接受 IEventSource 对象。 模块 @aws-cdk/aws-lambda-event- sources (原始内容存档于2018-09-28) 包括AWS Lambda所支持的各种事件源的课程.

例如,以下代码添加了 SQS 队列作为函数的事件源 :

import * as eventsources from '@aws-cdk/aws-lambda-event-sources';
import * as sqs from '@aws-cdk/aws-sqs';

declare const fn: lambda.Function;
const queue = new sqs.Queue(this, 'Queue');
fn.addEventSource(new eventsources.SqsEventSource(queue));

以下代码增加了 S3 桶通知作为事件源 :

import * as eventsources from '@aws-cdk/aws-lambda-event-sources';
import * as s3 from '@aws-cdk/aws-s3';

declare const fn: lambda.Function;
const bucket = new s3.Bucket(this, 'Bucket');
fn.addEventSource(new eventsources.S3EventSource(bucket, {
  events: [ s3.EventType.OBJECT_CREATED, s3.EventType.OBJECT_REMOVED ],
  filters: [ { prefix: 'subdir/' } ] // optional
}));

见文件 @aws-cdk/aws-lambda-event- sources (原始内容存档于2018-09-28) 模块以获取更多细节.

进口的羊肉

当引用 CDK 中导入的羊肉时, 请使用 fromFunctionArn() 用于大多数情况:

const fn = lambda.Function.fromFunctionArn(
  this,
  'Function',
  'arn:aws:lambda:us-east-1:123456789012:function:MyFn',
);

这个 fromFunctionAttributes() API可用于更具体的使用案例:

const fn = lambda.Function.fromFunctionAttributes(this, 'Function', {
  functionArn: 'arn:aws:lambda:us-east-1:123456789012:function:MyFn',
  // The following are optional properties for specific use cases and should be used with caution:

  // Use Case: imported function is in the same account as the stack. This tells the CDK that it
  // can modify the function's permissions.
  sameEnvironment: true,

  // Use Case: imported function is in a different account and user commits to ensuring that the
  // imported function has the correct permissions outside the CDK.
  skipPermissions: true,
});

若为 fromFunctionArn() 造成与必须提供不同构件中的账户和/或区域有关的错误, 羊肉在同一个账户和地区 与你输入的堆栈, 您可以使用 Function.fromFunctionName() 相反:

const fn = lambda.Function.fromFunctionName(this, 'Function', 'MyFn');

带 DLQ 的 Lambda

为 Lambda 函数自动创建死字母队列 设置 deadLetterQueueEnabled: true 配置 。 在这种情况下, 创建 CDK (单位:千美元) sqs.Queue 作为 deadLetterQueue。 。 。 .

const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromInline('exports.handler = function(event, ctx, cb) { return cb(null, "hi"); }'),
  deadLetterQueueEnabled: true,
});

也可以提供一个死字队列, 而不是新建队列 :

import * as sqs from '@aws-cdk/aws-sqs';

const dlq = new sqs.Queue(this, 'DLQ');
const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromInline('exports.handler = function(event, ctx, cb) { return cb(null, "hi"); }'),
  deadLetterQueue: dlq,
});

您也可以使用一个 sns.Topic 而不是一个 sqs.Queue 作为死字母队列 :

import * as sns from '@aws-cdk/aws-sns';

const dlt = new sns.Topic(this, 'DLQ');
const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromInline('// your code here'),
  deadLetterTopic: dlt,
});

见 aWS 文档 了解更多关于AWS Lambdas和DLQs的信息.

有X光追踪的Lambda

const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromInline('exports.handler = function(event, ctx, cb) { return cb(null, "hi"); }'),
  tracing: lambda.Tracing.ACTIVE,
});

见 aWS 文档 了解更多关于AWS Lambda的X射线支持.

使用剖面图的Lambda

以下代码以 CodeGuru 剖析配置了 lambda 函数 。 默认情况下, 这将创建一个新的代码Guru 剖析组 -

const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.PYTHON_3_9,
  handler: 'index.handler',
  code: lambda.Code.fromAsset('lambda-handler'),
  profiling: true,
});

这个 profilingGroup 属性可用于配置现有的 CodeGuru 剖析器组.

CodeGuru 剖析为所有Java运行时间和Python3.6+运行时间支持.

见 aWS 文档 了解更多关于AWS Lambda的剖析支持.

保留执行的Lambda

const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromInline('exports.handler = function(event, ctx, cb) { return cb(null, "hi"); }'),
  reservedConcurrentExecutions: 100,
});

见 aWS 文档 管理货币.

自动缩放

您可以使用应用程序自动缩放来自动配置为您函数提供的货币。 自动缩放可以设置用于跟踪利用率,也可以基于时间表. 以其它函数配置自动缩放 :

import * as autoscaling from '@aws-cdk/aws-autoscaling';

declare const fn: lambda.Function;
const alias = fn.addAlias('prod');

// Create AutoScaling target
const as = alias.addAutoScaling({ maxCapacity: 50 });

// Configure Target Tracking
as.scaleOnUtilization({
  utilizationTarget: 0.5,
});

// Configure Scheduled Scaling
as.scaleOnSchedule('ScaleUpInTheMorning', {
  schedule: autoscaling.Schedule.cron({ hour: '8', minute: '0'}),
  minCapacity: 20,
});

Lambda 自动缩放使用示例

见 aWS 文档 用于自动缩放羊肉达函数.

日志组

Lambda 函数自动创建带有名称的日志组 /aws/lambda/<function-name> 第一次执行时使用 日志数据集永不过期 .

这个 logRetention 属性可用于设定不同的终止期.

可以将函数的日志组作为 logs.ILogGroup 通过呼叫 logGroup 财产的财产 Function 构造.

默认情况下,CDK在创建日志组时使用AWS SDK重试选项. 这个 logRetentionRetryOptions 属性 允许您自定义重试次数和基准后退时间.

说明 如果有的话 logRetention 设置或 logGroup 属性称为, a 云阵自定义 资源 添加 到堆栈,如果该堆栈已经不存在,则作为堆栈部署的一部分预创建日志组,并设置 正确的日志保留期(默认情况下从未到期).

进一步说明 如果日志组已经存在,则 logRetention 未设置, 自定义资源将重设 日志保留即使配置了不同的值,也不会过期.

文件系统访问

您可以配置将 Amazon 弹性文件系统( Amazon EFS) 挂载到一个函数 运行时环境中的目录 filesystem 属性。 访问 Amazon EFS 从lambda函数中,需要亚马逊 EFS 访问点.

以下样本允许 Lambda 函数将 Amazon EFS 访问点挂载到 /mnt/msg 在运行时环境中使用 POSIX 身份访问文件系统 posixUser。 。 。 .

import * as ec2 from '@aws-cdk/aws-ec2';
import * as efs from '@aws-cdk/aws-efs';

// create a new VPC
const vpc = new ec2.Vpc(this, 'VPC');

// create a new Amazon EFS filesystem
const fileSystem = new efs.FileSystem(this, 'Efs', { vpc });

// create a new access point from the filesystem
const accessPoint = fileSystem.addAccessPoint('AccessPoint', {
  // set /export/lambda as the root of the access point
  path: '/export/lambda',
  // as /export/lambda does not exist in a new efs filesystem, the efs will create the directory with the following createAcl
  createAcl: {
    ownerUid: '1001',
    ownerGid: '1001',
    permissions: '750',
  },
  // enforce the POSIX identity so lambda function will access with this identity
  posixUser: {
    uid: '1001',
    gid: '1001',
  },
});

const fn = new lambda.Function(this, 'MyLambda', {
  // mount the access point to /mnt/msg in the lambda runtime environment
  filesystem: lambda.FileSystem.fromEfsAccessPoint(accessPoint, '/mnt/msg'),
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  vpc,
});

电子存储

您可以在函数上配置电子存储来控制其读取的存储量 或写入数据,允许您使用AWS Lambda进行ETL工作,ML推论,或其他数据密集的工作量. Ephemeral 存储器可以在函数中访问' /tmp 目录.

import { Size } from '@aws-cdk/core';

const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
  ephemeralStorageSize: Size.mebibytes(1024),
});

更多信息,请访问 此 AWS 博客文章。 。 。 .

Singleton 函数

这个 SingletonFunction 构造是一种保证羊肉活性能成为堆栈的一部分的方法, 一次,一次,不管建筑被宣布为堆栈的一部分有多少次。 这是保证的 只要我们.. uuid 属性和可选 lambdaPurpose 当他们被宣布进入 堆栈.

此函数的一个典型使用案例是,当更高层次的构造需要宣布一个Lambda函数为它的一部分时,但 需要保证该函数被宣布一次。 然而,使用此更高层次构造的用户可以声明它有任何 次数和属性不同。 使用 SingletonFunction 这里有一个固定 uuid 将保证这一点.

例如 LogRetention 构造对所有不同的日志组只需要一个单一的lambda函数 它试图管理.

捆绑资产代码

使用时 lambda.Code.fromAsset(path) 通过运行一个 命令在一个 Docker 容器中。 资产路径将挂起于 /asset-input编辑 Docker容器负责装入内容 /asset-output。内容在 /asset-output 将拉链并用作Lambda代码.

带 Python 的示例 :

new lambda.Function(this, 'Function', {
  code: lambda.Code.fromAsset(path.join(__dirname, 'my-python-handler'), {
    bundling: {
      image: lambda.Runtime.PYTHON_3_9.bundlingImage,
      command: [
        'bash', '-c',
        'pip install -r requirements.txt -t /asset-output && cp -au . /asset-output'
      ],
    },
  }),
  runtime: lambda.Runtime.PYTHON_3_9,
  handler: 'index.handler',
});

运行时间曝光 a bundlingImage 属性指向 AWS 萨姆 构建图像.

使用 cdk.DockerImage.fromRegistry(image) 要使用已有图像或 cdk.DockerImage.fromBuild(path) 用于构建特定图像 :

new lambda.Function(this, 'Function', {
  code: lambda.Code.fromAsset('/path/to/handler', {
    bundling: {
      image: DockerImage.fromBuild('/path/to/dir/with/DockerFile', {
        buildArgs: {
          ARG1: 'value1',
        },
      }),
      command: ['my', 'cool', 'command'],
    },
  }),
  runtime: lambda.Runtime.PYTHON_3_9,
  handler: 'index.handler',
});

语言专用 API

以不同的模块提供语言特定更高层次的构造:

代码签名

AWS Lambda 的代码签名有助于确保您的 Lambda 函数中只有信任的代码运行. 启用时,AWS Lambda检查每一个代码部署,并验证代码包是由一个可信任的来源签名的. 更多信息见 AWS Lambda 配置代码签名。 。 。 . 以下代码配置带有代码签名的函数.

import * as signer from '@aws-cdk/aws-signer';

const signingProfile = new signer.SigningProfile(this, 'SigningProfile', {
  platform: signer.Platform.AWS_LAMBDA_SHA384_ECDSA,
});

const codeSigningConfig = new lambda.CodeSigningConfig(this, 'CodeSigningConfig', {
  signingProfiles: [signingProfile],
});

new lambda.Function(this, 'Function', {
  codeSigningConfig,
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'index.handler',
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
});

版本与发布记录

@aws-cdk/aws-lambda 共发布 288 个版本,首次发布于 2018/07/31;过去 12 个月发布了 0 个版本。

版本发布日期距今
1.204.0latest2023/06/203 年前
1.203.02023/06/013 年前
1.202.02023/05/223 年前
1.201.02023/05/113 年前
1.200.02023/04/273 年前
1.199.02023/04/213 年前

关于 @aws-cdk/aws-lambda 的常见问题

@aws-cdk/aws-lambda 是什么?

AWS 的 CDK 构造库: Lambda注意:该包已被作者标记为弃用——AWS CDK v1 has reached End-of-Support on 2023-06-01. This package is no longer being updated, and users should migrate to AWS CDK v2. For more information on how to migrate, see https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html

如何安装 @aws-cdk/aws-lambda?

在项目目录运行 npm install @aws-cdk/aws-lambda,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@aws-cdk/aws-applicationautoscaling(1.204.0)、@aws-cdk/aws-cloudwatch(1.204.0)、@aws-cdk/aws-codeguruprofiler(1.204.0)、@aws-cdk/aws-ec2(1.204.0)、@aws-cdk/aws-ecr(1.204.0)、@aws-cdk/aws-ecr-assets(1.204.0)、@aws-cdk/aws-efs(1.204.0)、@aws-cdk/aws-events(1.204.0)、@aws-cdk/aws-iam(1.204.0)、@aws-cdk/aws-kms(1.204.0)、@aws-cdk/aws-logs(1.204.0)、@aws-cdk/aws-s3(1.204.0)、@aws-cdk/aws-s3-assets(1.204.0)、@aws-cdk/aws-signer(1.204.0)、@aws-cdk/aws-sns(1.204.0)、@aws-cdk/aws-sqs(1.204.0)、@aws-cdk/core(1.204.0)、@aws-cdk/cx-api(1.204.0)、@aws-cdk/region-info(1.204.0)、constructs(^3.3.69)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@aws-cdk/aws-lambda 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@aws-cdk/aws-lambda 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@aws-cdk/aws-lambda 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >= 14.15.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@aws-cdk/aws-lambda 可以商用吗?

@aws-cdk/aws-lambda 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@aws-cdk/aws-lambda 的下载量有多少?

根据 npm 官方下载统计,@aws-cdk/aws-lambda 在 2026/10/08 – 2026/11/06 这 30 天内被下载 356,925 次,日均约 11,898 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@aws-cdk/aws-lambda 还在维护吗?

最新版本 1.204.0 发布于 2023/06/20(3 年前);至今共发布 288 个版本,其中过去 12 个月发布了 0 个;首次发布于 2018/07/31。作者已将其标记为弃用,新项目建议寻找替代方案。