标签: aws-lambda-layers

在Lambda层中导入库

我想在我的AWS Lambda中导入jsonschema库,以执行请求验证。我希望通过Lambda Layers来实现,而不是将依赖项与我的应用程序捆绑在一起。我压缩了所有依赖项venv/lib/python3.6/site-packages/。我将其作为lambda层上传,publish-layer-versionaws lambda update-function-configuration分别使用和命令将其添加到aws lambda中。zip文件夹的名称为“ lambda-dep.zip”,所有文件都在其下面。但是,当我尝试在lambda_function中导入jsonschema时,看到以下错误-

from jsonschema import validate
Run Code Online (Sandbox Code Playgroud)
{
  "errorMessage": "Unable to import module 'lambda_api': No module named 'jsonschema'",
  "errorType": "Runtime.ImportModuleError"
}```

Am I missing any steps are is there a different mechanism to import anything within lambda layers?
Run Code Online (Sandbox Code Playgroud)

python amazon-web-services python-3.x aws-lambda aws-lambda-layers

4
推荐指数
3
解决办法
3448
查看次数

libtensorflow.so:无法打开共享对象文件:没有这样的文件或目录

我使用以下命令创建了一个 AWS Lambda 层:

aws lambda publish-layer-version --layer-name TensorflowLambdaLayer --compatible-runtimes go1.x --zip-file fileb://tensorflowLayer.zip
Run Code Online (Sandbox Code Playgroud)

这是生成的 ARN:`arn:aws:lambda:us-east-1:757767972066:layer:TensorflowLambdaLayer:1

当我尝试通过 AWS SAM运行使用Tesnroflow库的Lambda 函数时,它卡在“挂载”步骤中:

2019-07-18 15:51:29 Mounting /tmp/tmpgz8cb80s as /var/task:ro,delegated inside runtime container
Run Code Online (Sandbox Code Playgroud)

一旦我终止它,Ctrl + C我会收到以下消息:

^C/var/task/bin/inference: error while loading shared libraries: libtensorflow.so: cannot open shared object file: No such file or directory
Makefile:82: recipe for target 'run-inference' failed
Run Code Online (Sandbox Code Playgroud)

这是我的template.yml 的关键部分:

Parameters:
  LambdaTensorflowLayerArn:
    Type: String
    Default: 'arn:aws:lambda:us-east-1:757767972066:layer:TensorflowLambdaLayer:1'
  LambdaFFMPEGLayerArn:
    Type: String
    Default: 'arn:aws:lambda:us-east-1:757767972066:layer:ffmpeg:1'

Inference:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: bin/inference
      Runtime: …
Run Code Online (Sandbox Code Playgroud)

go amazon-web-services aws-lambda aws-lambda-layers

4
推荐指数
1
解决办法
3518
查看次数

使用 AWS Lambda 层时,我应该选择多层还是具有所有依赖项的单层?

我们在 Node.js (v10.x) 中有几个 AWS Lambdas,其中一些有一些“特定的大”依赖项,这些依赖项并未在所有这些依赖项之间共享。例如,我们有一个依赖firebase-adminNPM 包的“Authorizer”函数,这是唯一使用它的 Lambda。

为了简化维护,目前我们有一个包含所有依赖项的层。将依赖项拆分为多个层有什么好处吗?我的假设是更大的层会增加“冷启动”时间。但是,与层的大小相关的惩罚有多大?我在 AWS 文档中找不到关于此的任何参考。

类似的问题,但跨越不同的语言。如果我们的 Lambda 使用多种语言(例如 Node 和 Python),我是否可以有一个包含两种语言依赖项的 Lambda 层?我想这是一个更简单的选择,因为 Python 依赖项实际上永远不会被 Node.js 代码使用。但是,我想阅读一些 AWS 推荐的管理层的最佳实践。

aws-lambda aws-lambda-layers

4
推荐指数
1
解决办法
832
查看次数

pysftp 库在 AWS lambda 层中不起作用

我想使用pysftp库(Python 脚本)将文件上传到 EC2 实例。所以我创建了小的 Python 脚本,它使用下面的行来连接

pysftp.Connection(
    host=Constants.MY_HOST_NAME,
    username=Constants.MY_EC2_INSTANCE_USERNAME,
    private_key="./mypemfilelocation.pem",
)
some code here .....
pysftp.put(file_to_be_upload, ec2_remote_file_path)
Run Code Online (Sandbox Code Playgroud)

此脚本将使用 .pem 文件将文件从我的本地 Windows 机器上传到 EC2 实例,并且它可以正常工作。

现在我想使用具有 API 网关功能的AWS lambda来执行此操作。

所以我已将 Python 脚本上传到 AWS lambda。现在我不确定如何在 AWS lambda 中使用 pysftp 库,所以我找到了在 AWS lambda 层中添加 pysftp 库层的解决方案。我做到了

pip3 安装 pysftp -t ./library_folder

我制作了上述文件夹的 zip 并添加到 AWS lambda 层中。

但是我仍然有很多错误,比如一个一个:-

没有名为“pysftp”的模块

没有名为“paramiko”的模块

未定义符号:PyInt_FromLong

无法从部分初始化的模块 'bcrypt' 导入名称 '_bcrypt'(很可能是由于循环导入)

找不到 cffi 模块

我只是淡出上述错误我没有找到合适的解决方案。如何在我的 AWS lambda 中无缝使用 pysftp 库?

python amazon-web-services pysftp aws-lambda aws-lambda-layers

4
推荐指数
1
解决办法
2028
查看次数

无法从 aws lambda 层导入模块

我有一个 pip 包的需求文件。我将其安装在目标文件夹中并压缩内容并将其上传到 AWS lambda 层。

要求.txt

asgiref==3.2.3
certifi==2019.11.28
chardet==3.0.4
cloudevents==0.2.4
decorator==4.4.1
Django==3.0
idna==2.8
jaeger-client==4.2.0
jsonpath-ng==1.4.3
pbr==5.4.4
ply==3.11
pytz==2019.3
requests==2.22.0
six==1.13.0
sqlparse==0.3.0
urllib3==1.25.7
aws-xray-sdk
mysql-connector-python
gunicorn
Run Code Online (Sandbox Code Playgroud)

我使用的命令pip3 install -r requirements.txt -t python/其中 python 是目标目录。该图显示了 python 目录的内容。 在此输入图像描述

之后,我压缩了该目录的内容并将其作为 aws lambda 上的层发布。我创建了一个虚拟 lambda 函数来检查该层是否正常工作。

import json
import django

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
Run Code Online (Sandbox Code Playgroud)

日志文件错误:

Response:
{
  "errorMessage": "Unable to import module 'lambda_function'"
}

Request ID:
"66ce85e0-59f0-4e5c-98f9-6fa3e3eb17d0"

Function Logs:
START RequestId: …
Run Code Online (Sandbox Code Playgroud)

python django amazon-web-services aws-lambda aws-lambda-layers

4
推荐指数
1
解决办法
1万
查看次数

如何在 AWS Lambda 函数中使用 ImageMagick

我正在尝试创建一个利用 ImageMagick 将 PDF 转换为图像的 lambda。

为此,我可以上传 ImageMagick 的二进制文件。

这种方法失败了,因为 IM 似乎依赖于一些共享库。

有没有办法将 ImageMagick 作为一个层安装或将其与其依赖项一起打包?
或者也许一种不同的解决方案才是正确的。

现在,我已经验证我可以上传二进制文件作为 Lambda 包的一部分并调用它们。

binary amazon-web-services aws-lambda aws-lambda-layers

4
推荐指数
1
解决办法
8819
查看次数

Python 层图像失败:“无法导入模块‘lambda_function’:无法从‘PIL’导入名称‘_imaging’”

我只是想在我的 Python 3.8 Lambda 中使用 PIL。

我正在尝试以下步骤:

  1. 基于此 repo:https : //github.com/hidekuma/lambda-layers-for-python-runtime
cd /mydir 
git clone https://github.com/hidekuma/lambda-layers-for-python-runtime.git 
cd lambda-layers-for-python-runtime 
mkdir dist 
docker-compose up --build
Run Code Online (Sandbox Code Playgroud)
  1. 基于此指南:https : //www.splunk.com/en_us/blog/cloud/sharing-code-dependencies-with-aws-lambda-layers.html
aws lambda publish-layer-version --layer-name ImageStorageDependencies
    --description "A Python 3.8 runtime with PIL and boto3 installed." --license-info "MIT" --zip-file fileb://output.zip --compatible-runtimes python3.7 python3.8 --region us-east-2
Run Code Online (Sandbox Code Playgroud)

然后我在 Lamda 配置中选择我的层,但是当我运行此代码时:

import json
import boto3
import io
from PIL import Image


def lambda_handler(event, context): 
    #etc
Run Code Online (Sandbox Code Playgroud)

...我收到错误:

[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': cannot import name …
Run Code Online (Sandbox Code Playgroud)

python aws-lambda aws-lambda-layers

4
推荐指数
1
解决办法
1540
查看次数

如何在子目录中包含nodejs模块

我的 AWS Lambda 层有一个类似这样的目录结构。

main > nodejs > node_modules
Run Code Online (Sandbox Code Playgroud)

我有一个test.js文件要在上传到 AWS 之前测试功能。是否可以将我的test.js文件放在Main文件夹而不是nodejs文件夹中,并且仍然让它拾取nodejs文件夹中的模块?

我这么问是因为您压缩了nodejs要上传到 AWS Lambda 层的文件夹,但我不想将我的test.js文件包含在存档中。

更新:下面的答案帮助我找到了解决方案。您只需在 require 中输入模块的完整路径即可。

require('./nodejs/node_modules/my_module');
Run Code Online (Sandbox Code Playgroud)

javascript node.js aws-lambda-layers

3
推荐指数
1
解决办法
567
查看次数

lambda 层是否包含 aws-sdk

我正在使用无服务器框架以及 lambda 层和几个 lambdas 函数。我必须包含 aws-sdk 才能支持某些功能。

aws-sdk 的 lambda 层大小为 80MB,而 aws-sdk 单独占用 40MB。

我所知道的是 Lambda 函数默认包含 aws-sdk。但这是否也意味着 lambda 层?

笔记

  • 我尝试删除 aws-sdk 并部署,并且 lambda 函数显示错误“找不到模块 aws-sdk”
  • NODE_PATH: "./:/opt/node_modules" 包含在 serverless.yml 中(这是否会导致默认情况下不包含 aws-sdk)?
  • 运行时是 nodejs10.x

amazon-web-services aws-lambda serverless-framework aws-lambda-layers

3
推荐指数
1
解决办法
1023
查看次数

为 pymysql 导入 AWS lambda 层

我需要部署一个 lambda 函数,使用 python 包 pymysql 执行一个过程,我的 python 版本是 3.6,为此,我将使用 lambda 层来避免带来我的整个代码。为了实现这一目标,我遵循以下步骤:

  • 在我的本地计算机中创建一个 python virtualenv
  • 安装 pymysql 包
  • 创建一个单独的文件夹,将安装在虚拟环境中的 pymysql 包移动到其中cp -r /myvirtualenv/lib/python3.6/site-packages/pymysql ~/home/user/packagelambda/

  • 在路径中~/home/user/packagelambda/将此包压缩为 zip 文件以作为 AWS lambda 层上传zip -r rdsconnection.zip *

  • 将此 zip 文件作为新层上传到 aws lambda 仪表板

完成上述过程后,我进入代码并创建两个脚本来模块化我的执行,第一个脚本名为md_conenction.py,如下所示:

import json
import boto3
import pymysql 
import csv
from datetime import datetime


def json_param():
    s3 = boto3.resource('s3')
    bucketname= "bucket"
    file= "file.json"
    object= s3.Object(bucketname,file)
    body = object.get()['Body'].read().decode('utf8')

    param= json.loads(body)

    return param["host"], param["user"], param["password"], param["database"]

def …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services python-3.x pymysql aws-lambda aws-lambda-layers

2
推荐指数
1
解决办法
6225
查看次数