Amazon Web ServicesCloud

Lambda Python 创建和使用 Layer

目标


由于 Python 代码中需要用到第三方的库, 在 Lambda 中可以通过创建自定义层(Layer)的方式来将这些依赖提供给 Lambda 运行环境.
下面演示创建一个包含第三方库 requests 的层, 以及如何在 Lambda 中调用

准备 zip 文件


首先在本地电脑上将相关依赖下载到名为 python 的文件夹中:

mkdir python
cd python
pip install requests -t .

项目的文件夹名为 lambda_layer_demo, 下载完成后的文件夹内容如下

╭─lpwm@pengweil /home/lpwm/lambda_layer_demo  ‹system›
╰─$ tree -L 2
.
└── python
    ├── bin
    ├── certifi
    ├── certifi-2022.12.7.dist-info
    ├── charset_normalizer
    ├── charset_normalizer-2.1.1.dist-info
    ├── idna
    ├── idna-3.4.dist-info
    ├── requests
    ├── requests-2.28.1.dist-info
    ├── urllib3
    └── urllib3-1.26.13.dist-info

12 directories, 0 files

接下来将 python 文件夹打包成 zip 文件, 注意执行 zip 命令时应当在 python 文件夹的父文件夹 (即项目文件夹) 位置

╭─lpwm@pengweil /home/lpwm/lambda_layer_demo  ‹system›
╰─$ zip -r requests_layer.zip .

打包后的 zip 文件中会包含一个 python 文件夹:

创建 Lambda Layer


浏览器访问 Lambda 控制台 – Layers – Create layer, 上传准备好的 zip 文件, 选择匹配的 runtime, 完成创建

调用 Layer 作为依赖


一切准备就绪后, 下面我们创建一个测试用的 Lambda Function, 来调用 Layer 中的 pythonping 依赖.

点击 Lambda 函数编辑界面底部的 Add a layer

选择 Custom layers, 找到我们刚创建好的 pythonping_layer 完成添加

编写 Python 代码


import json
import os
import requests

def lambda_handler(event, context):
    os.system('df')
    result = requests.get('https://checkip.amazonaws.com').text.strip()

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
}

Deploy 后 Test, 工作正常!

并且我们看到 Linux shell 执行 df 的结果, Lambda 环境多了一个 /opt 目录,这个就是保存依赖包的目录。