# @aws-cdk/aws-lambda 中文文档

规范地址：https://npmcn.com/package/%40aws-cdk/aws-lambda/

版本：1\.204\.0
npm 元数据更新时间：2023-11-21T10:16:08.295Z
中文译文更新时间：2026-11-07T10:41:56.250Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40aws-cdk/aws-lambda
原文对照：https://npmcn.com/package/%40aws-cdk/aws-lambda/?lang=original
项目主页：https://github.com/aws/aws-cdk
源码仓库：https://github.com/aws/aws-cdk

弃用说明：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

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：3.3 MB，69 个文件
- 模块格式：CommonJS
- TypeScript 类型：包内自带
- Node.js 要求：\>= 14\.15\.0
- 运行依赖：20 个
- 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
- 首次发布：2018-07-31T13:37:39.150Z
- 最新版本发布：2023-06-19T21:07:11.665Z
- 近 30 天下载量：356925（2026-10-08 至 2026-11-06，npm 官方下载统计）
- 已发布版本数：288（近 12 个月 0 个）

## 中文简介

AWS 的 CDK 构造库: Lambda

## 安装

```sh
npm install @aws-cdk/aws-lambda
```

也可以使用：`pnpm add @aws-cdk/aws-lambda`、`yarn add @aws-cdk/aws-lambda`、`bun add @aws-cdk/aws-lambda`

## README

# AWS Lambda 构造库

* * *

![End-of-Support](https://img.shields.io/badge/End--of--Support-critical.svg?style=for-the-badge)

> AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.
> 
> 关于如何移徙的更多信息,请参见: [_移动到 AWS CDK v2_ 指南](https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html)。 。 。 .

* * *

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

```ts
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。 另见 [捆绑资产代码](https://npmcn.com/package/%40aws-cdk/aws-lambda/#readme-bundling-asset-code)。 。 。 .
-   `lambda.Code.fromDockerBuild(path, options)` - 使用一个多克的结果 构建为代码。 运行时代码预计位于 `/asset` 输入 图像, 并将作为资产被拉链并上传到 S3 .

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

[本地资产的Lambda代码示例](https://npmcn.com/package/%40aws-cdk/aws-lambda/test/integ.assets.lit.ts)

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

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

## Docker 图像

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

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

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

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

```ts
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 的权限 函数。 引用自动生成的角色 :

```ts
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 函数的权限。 发挥作用和提供赠款 适当权限:

```ts
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 提醒以报告函数超时时 :

```ts
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( 代表资源的账户和标识符) 以访问函数或层.

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

fn.grantInvoke(principal);

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

更多信息见 [基于资源 政策](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html) 在 AWS Lambda 开发者指南中.

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

```ts
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,
});
```

## 版本数

你用得着 [版本](https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html) 管理您的 AWS Lambda 函数的部署。 比如说,你可以 为β测试发布新版本的功能,但不影响用户 稳定生产版本.

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

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

您可以使用 : `Version` 构造.

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

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

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

```ts
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 中已固定, 但是 _现有_ 用户需要通过 [特性旗](https://docs.aws.amazon.com/cdk/latest/guide/featureflags.html)。运行的用户 `cdk init` 由于这个固定将选择在, 默认.

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

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

当新逻辑生效时, 您可能很少遇到以下错误 : `The following properties are not recognized as version properties`. 这将 发生时间,通常为 [属性覆盖](https://docs.aws.amazon.com/cdk/latest/guide/cfn_layer.html#cfn_layer_raw) 当使用新属性时 引入于 `AWS::Lambda::Function` 用于 CDK 仍然不知道 .

要克服这个错误, 请使用 API `Function.classifyVersionProperty()` 改为 记录该属性更改时是否应当生成新版本. 这通常可以通过检查财产是否可以 使用 _[更新功能配置](https://docs.aws.amazon.com/lambda/latest/dg/API_UpdateFunctionConfiguration.html)_ API与否.

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

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

这在从2.27版本开始的AWS CDK中已被固定. 如果你跑了的话 `cdk init` 您需要通过一个 [特性旗](https://docs.aws.amazon.com/cdk/latest/guide/featureflags.html)。 。 。 . 如果你运行 `cdk init` 与 v2.27 或 以后, 默认情况下, 将选择此固定 .

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

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

## 别名

您可以定义一个或多个 [别名](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html) 为您的 AWS Lambda 函数。 一个Lambda的别名就像指向一个特定的 Lambda函数版本. 用户可以使用别名访问函数版本 ARN (英语).

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

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

```ts
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](https://docs.aws.amazon.com/lambda/latest/dg/urls-invocation.html) aWS Lambda 开发者指南的章节 以这种方式引用的函数的输入和输出有效载荷的更多信息.

### IAM 认证函数 URL

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

```ts
// 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()`数字 :

```ts
// 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 可以从浏览器中的网页中调出, 您 需要配置跨源资源共享以允许调用(如果有的话) 不这样做,你的浏览器会拒绝打电话:

```ts
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 层使用示例](https://npmcn.com/package/%40aws-cdk/aws-lambda/test/integ.layer-version.lit.ts)

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

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

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

## 建筑

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

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

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

```ts
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地层版本也可以被它兼容的架构所标记.

```ts
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 透视](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Lambda-Insights.html) 它为Lambda函数提供了低水平运行时间度量.

```ts
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-

```ts
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`。 。 。 .

```ts
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 函数作为亚马逊云表事件的目标 规则:

```ts
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 支持一个 [各种事件源](https://docs.aws.amazon.com/lambda/latest/dg/invoking-lambda-function.html)。 。 。 .

在多数情况下,由于发生下列事件而触发函数是可能的: 使用其中的 `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 队列作为函数的事件源 :

```ts
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 桶通知作为事件源 :

```ts
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()` 用于大多数情况:

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

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

```ts
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()` 相反:

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

## 带 DLQ 的 Lambda

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

```ts
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,
});
```

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

```ts
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` 作为死字母队列 :

```ts
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 文档](https://docs.aws.amazon.com/lambda/latest/dg/dlq.html) 了解更多关于AWS Lambdas和DLQs的信息.

## 有X光追踪的Lambda

```ts
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 文档](https://docs.aws.amazon.com/lambda/latest/dg/lambda-x-ray.html) 了解更多关于AWS Lambda的X射线支持.

## 使用剖面图的Lambda

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

```ts
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 文档](https://docs.aws.amazon.com/codeguru/latest/profiler-ug/setting-up-lambda.html) 了解更多关于AWS Lambda的剖析支持.

## 保留执行的Lambda

```ts
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 文档](https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html) 管理货币.

## 自动缩放

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

```ts
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 自动缩放使用示例](https://npmcn.com/package/%40aws-cdk/aws-lambda/test/integ.autoscaling.lit.ts)

见 [aWS 文档](https://docs.aws.amazon.com/lambda/latest/dg/invocation-scaling.html) 用于自动缩放羊肉达函数.

## 日志组

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

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

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

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

_说明_ 如果有的话 `logRetention` 设置或 `logGroup` 属性称为, a [云阵自定义 资源](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cfn-customresource.html) 添加 到堆栈,如果该堆栈已经不存在,则作为堆栈部署的一部分预创建日志组,并设置 正确的日志保留期(默认情况下从未到期).

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

## 文件系统访问

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

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

```ts
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` 目录.

```ts
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 博客文章](https://aws.amazon.com/blogs/aws/aws-lambda-now-supports-up-to-10-gb-ephemeral-storage/)。 。 。 .

## Singleton 函数

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

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

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

## 捆绑资产代码

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

带 Python 的示例 :

```ts
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 萨姆](https://github.com/awslabs/aws-sam-cli) 构建图像.

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

```ts
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-cdk/aws-lambda-nodejs`数字 : [吉图布](https://github.com/aws/aws-cdk/tree/master/packages/%40aws-cdk/aws-lambda-nodejs) 打开 [CDK 文档](https://docs.aws.amazon.com/cdk/api/latest/docs/aws-lambda-nodejs-readme.html)
-   `@aws-cdk/aws-lambda-python`数字 : [吉图布](https://github.com/aws/aws-cdk/tree/master/packages/%40aws-cdk/aws-lambda-python) 打开 [CDK 文档](https://docs.aws.amazon.com/cdk/api/latest/docs/aws-lambda-python-readme.html)

## 代码签名

AWS Lambda 的代码签名有助于确保您的 Lambda 函数中只有信任的代码运行. 启用时,AWS Lambda检查每一个代码部署,并验证代码包是由一个可信任的来源签名的. 更多信息见 [AWS Lambda 配置代码签名](https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html)。 。 。 . 以下代码配置带有代码签名的函数.

```ts
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 是什么？

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。作者已将其标记为弃用，新项目建议寻找替代方案。

