

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用带有 Lambda 层的 Lambda 层来提高效率 AWS SAM
<a name="serverless-sam-cli-layers"></a>

使用 AWS SAM，您可以在无服务器应用程序中包含图层。 AWS Lambda 层允许您将代码从 Lambda 函数提取到 Lambda 层中，然后可以在多个 Lambda 函数中使用该层。这样做可以让您缩小部署包的大小，将核心函数逻辑与依赖项分开，并在多个函数之间共享依赖项。有关层的更多信息，请参阅《AWS Lambda 开发人员指南》**中的 [Lambda 层](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html)。

本主题提供有关以下内容的信息：
+ 在应用程序中包含层
+ 如何在本地缓存层

有关构建自定义层的更多信息，请参阅 [在中构建 Lambda 图层 AWS SAM](building-layers.md)。

## 在应用程序中包含层
<a name="including-layers"></a>

要在应用程序中包含层，请使用 [AWS::Serverless::Function](sam-resource-function.md) 资源类型的 `Layers` 属性。

以下是带有包含层的 Lambda 函数的示例 AWS SAM 模板：

```
ServerlessFunction:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: .
    Handler: my_handler
    Runtime: Python3.7
    Layers:
        - <LayerVersion ARN>
```

## 如何在本地缓存层
<a name="local-testing-with-layers"></a>

当您使用其中一个 `sam local` 命令调用函数时，函数的层包会被下载并缓存在本地主机上。

下表显示不同操作系统的默认缓存目录位置。


****  

| OS | 位置 | 
| --- | --- | 
| Windows 7 | C:\$1Users\$1<user>\$1AppData\$1Roaming\$1AWS SAM | 
| Windows 8 | C:\$1Users\$1<user>\$1AppData\$1Roaming\$1AWS SAM | 
| Windows 10 | C:\$1Users\$1<user>\$1AppData\$1Roaming\$1AWS SAM | 
| macOS | \$1/.aws-sam/layers-pkg | 
| Unix | \$1/.aws-sam/layers-pkg | 

缓存软件包后， AWS SAM CLI 会将层叠加到用于调用函数的 Docker 映像上。 AWS SAMCLI生成其构建的图像以及缓存中保存 LayerVersions 的图像的名称。您可以在以下部分找到有关架构的更多详细信息。

要检查叠加层，请执行以下命令在要检查的映像中启动 bash 会话：

```
docker run -it --entrypoint=/bin/bash samcli/lambda:<Tag following the schema outlined in Docker Image Tag Schema> -i
```

**层缓存目录名称架构**

给 LayerVersionArn 定模板中定义的，会从 ARN 中 AWS SAMCLI提取 LayerName 和版本。它会创建一个目录，用于存放名为 `LayerName-Version-<first 10 characters of sha256 of ARN>` 的层内容。

示例：

```
ARN = arn:aws:lambda:us-west-2:111111111111:layer:myLayer:1
Directory name = myLayer-1-926eeb5ff1
```

**Docker 映像标签架构**

要计算唯一图层哈希，请将所有唯一的图层名称与分隔符 “-” 合并，取 SHA256 哈希，然后取前 10 个字符。

示例：

```
ServerlessFunction:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: .
    Handler: my_handler
    Runtime: Python3.7
    Layers:
        - arn:aws:lambda:us-west-2:111111111111:layer:myLayer:1
        - arn:aws:lambda:us-west-2:111111111111:layer:mySecondLayer:1
```

唯一名称的计算方法与层缓存目录名称架构相同：

```
arn:aws:lambda:us-west-2:111111111111:layer:myLayer:1 = myLayer-1-926eeb5ff1
arn:aws:lambda:us-west-2:111111111111:layer:mySecondLayer:1 = mySecondLayer-1-6bc1022bdf
```

要计算唯一层哈希，请将所有唯一的层名称合并，分隔符为 '-'，取 sha256 哈希，然后取前 25 个字符：

```
myLayer-1-926eeb5ff1-mySecondLayer-1-6bc1022bdf = 2dd7ac5ffb30d515926aef
```

然后将此值与函数的运行时和架构合并，分隔符为 '-'：

```
python3.7-x86_64-2dd7ac5ffb30d515926aefffd
```