START RequestId:3d5691d9-ad79-4eed-a26c-5bc3f1a23a99版本:$ LATEST无法导入模块“ lambda_function”:没有名为“ pandas”的模块
END RequestId:3d5691d9-ad79-4eed-a26c-5bc3f1a23a99
我正在使用Windows 7 64位作为主机OS。
我只想在AWS-Lambda环境中使用熊猫。就像在Windows环境中使用它一样,我正在寻找Lambda的简单解决方案。
myvenv在virtual-box上的Xubuntu中创建一个虚拟环境。myvenv。myvenv,在位置'/usr/local/lib/python3.6/site-packages/'我的主机操作系统。packs,粘贴了的内容myvenv。lambda_function.py脚本packspacks使用7zip的软件并上传它zip在Lambdalambda_handler()。该代码段如下所示:将熊猫作为pd导入
Run Code Online (Sandbox Code Playgroud)def lambda_handler(event, context): dates = pd.date_range('2019001', periods=6) df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD')) print(df)
lambda_function.lambda_handler。我已授予lambda-role AWSLambdaFullAccess许可。测试事件看起来像
{“ key1”:“如果一切正常,将打印此内容”}
我尝试了以下解决方案:
Handler info到python_filename.function_name。对于我来说,这是lambda_function.lambda_handler - …我正在处理创建两个 lambda 函数的示例 AWS 项目。这些函数共享node_modules已放置在单独层中的公共代码(特别是AWS::Lambda::LayerVersion,而不是AWS::Serverless::LayerVersion)。我可以部署此代码,并且在测试部署版本时它可以正常工作。
但是,当我尝试使用 本地测试代码时sam invoke local,找不到公共代码。我收到此错误(我正在尝试使用 npm 包“axios”):
{"errorType":"Runtime.ImportModuleError","errorMessage":"Error: Cannot find module 'axios'\nRequire stack:\n- /var/task/get-timezone.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js"}
这是我的template.yaml:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS Sample
Globals:
Function:
Timeout: 30
Resources:
SampleCommonLayer:
Type: AWS::Lambda::LayerVersion
Properties:
CompatibleRuntimes:
- nodejs12.x
Content: nodejs.zip
Description: Sample Common LayerVersion
LayerName: SampleCommonLayer
GetTimezoneFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: dist/get-timezone
Handler: get-timezone.getTimezone
Runtime: nodejs12.x
Layers:
- !Ref SampleCommonLayer
Events:
GetTimezone:
Type: Api
Properties:
Path: /get-timezone
Method: …Run Code Online (Sandbox Code Playgroud) 我正在使用 aws cli 部署 AWS Lambda 层:
aws lambda publish-layer-version --layer-name my_layer --zip-file fileb://my_layer.zip
Run Code Online (Sandbox Code Playgroud)
我删除它使用
VERSION=$(aws lambda list-layer-versions --layer-name my_layer | jq '.LayerVersions[0].Version'
aws lambda delete-layer-version --layer-name my_layer --version-number $VERSION
Run Code Online (Sandbox Code Playgroud)
删除成功,确保不存在其他版本的图层。
aws lambda list-layer-versions --layer-name my_layer
>
{
"LayerVersions": []
}
Run Code Online (Sandbox Code Playgroud)
在下一次发布图层时,它仍然保留以前版本的历史记录。从我读到的如果不存在图层版本并且不存在参考,版本历史应该消失,但我没有看到。有人有解决方案来硬删除图层及其版本吗?
当我创建 AWS Lambda 层时,我的 zip 文件的所有内容/模块都会/opt/在 AWS Lambda 执行时转到。这很容易变得麻烦和令人沮丧,因为我必须对我所有的 lambda 使用绝对导入。例子:
import json
import os
import importlib.util
spec = importlib.util.spec_from_file_location("dynamodb_layer.customer", "/opt/dynamodb_layer/customer.py")
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
def fetch(event, context):
CustomerManager = module.CustomerManager
customer_manager = CustomerManager()
body = customer_manager.list_customers(event["queryStringParameters"]["acquirer"])
response = {
"statusCode": 200,
"headers": {
"Access-Control-Allow-Origin": "*"
},
"body": json.dumps(body)
}
return response
Run Code Online (Sandbox Code Playgroud)
所以我想知道,是否可以通过 serverless.yml 预先将这些 /opt/paths 添加到 PATH 环境变量中?那样的话,我就可以from dynamodb_layer.customer import CustomerManager,而不是那种怪异的丑陋。
我有一个不断更新的 lambda 层。这个 lambda 层有多个版本。如何使用 aws cli 找到最新版本的 lambda 层 ARN?
我为包含 bin 可执行文件(texlive)的 Python 运行时(3.6 和 3.7 兼容)创建了一个 lambda lambda
但是当我尝试通过subprocess.run它执行它时,它说它没有执行权限!
我如何才能使该层具有执行权限?我在 Windows 10 上压缩了层文件,所以我不确定如何添加 Linux 执行权限。
此外,据我所知,当您解压缩文件时,它会“重置”权限,因此如果 AWS 在解压缩我的图层时没有设置执行权限,我该怎么办?
顺便说一句,我正在通过 aws 控制台上传我的层
我尝试使用无服务器 Lambda 层,我看过有关它的教程,但结果出现错误“找不到模块......”
service: aws-nodejs
package:
exclude:
- .gitignore
- package.json
- .git/**
provider:
name: aws
profile: sandbox
runtime: nodejs12.x
layers:
testLayer:
path: testLayer
compatibleRuntimes:
- nodejs12.x
allowedAccounts:
- '*'
functions:
hello:
handler: handler.hello
layers:
- arn:aws:lambda:us-east-1:*:layer:testLayer:15
events:
- http:
path: test
method: get
cors: true
Run Code Online (Sandbox Code Playgroud)
当我部署它时,我的终端中没有任何错误,在 AWS 上,我看到了我的层,当我下载它时,我有我的 package.json 和 moment 依赖项,以及带有 moment 的 node_modules 文件夹
我的 handler.js 看起来像这样:
'use strict';
module.exports.hello = async (event, context) => {
const moment = require('moment')
const a = moment('2016-01-01')
return {
statusCode: …Run Code Online (Sandbox Code Playgroud) 我有一个可用的 docker 容器,想在 Firefox 上迁移到 selenium 3.141 的 lambda 层。工作容器的 Dockerfile 是:
FROM python:3.7-slim
RUN /usr/local/bin/python -m pip install --upgrade pip
RUN pip install selenium==3.141.0
RUN apt-get update
RUN apt-get -y install wget bzip2 firefox-esr #68.12.0esr
WORKDIR /tmp
RUN wget https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-linux64.tar.gz
RUN tar -zxf geckodriver-v0.26.0-linux64.tar.gz -C /usr/local/bin/
Run Code Online (Sandbox Code Playgroud)
当我在此容器中执行以下操作时,Firefox会创建一个对象。
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options
opts = Options()
opts.headless = True
Firefox(options=opts, service_log_path='/home/geckodriver.log')
Run Code Online (Sandbox Code Playgroud)
对于 lambda 层,我使用amazonlinux图像进行本地测试。在 aws 上,我提供的一个 zip 文件将被提取到/opt,所以我想把所有东西都放进去/opt,看看它是否工作。
我的 …
python firefox selenium selenium-webdriver aws-lambda-layers
我已经安装了所有这些库:
google-api-core 1.22.1
google-api-python-client 1.10.0
google-auth 1.20.1
google-auth-httplib2 0.0.4
google-auth-oauthlib 0.4.1
google-cloud 0.34.0
google-cloud-core 1.4.1
google-cloud-storage 1.31.0
google-crc32c 1.0.0
google-resumable-media 1.0.0
googleapis-common-protos 1.52.0
httplib2 0.18.1
Run Code Online (Sandbox Code Playgroud)
到一个文件夹 --> 压缩它 --> 上传到 AWS lambda 的层。然而,当我[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'httplib2'在本地运行我的 pyhon 文件且此类库位于环境中时,我不断地思考,在调用import httplib2. 注意:所有其他库都适用于 lambda,因此我的上传过程应该是正确的。
python google-api amazon-web-services aws-lambda aws-lambda-layers
我正在研究 AWS Lambda Layers 的功能,并尝试确认该层是否可以在 Lambda 函数与该层没有任何知识/交互的情况下添加行为。
我从文档中了解到,层实际上是一个解压到 Lambda 实例的 .zip 文件,主要用于交付资源,而不需要将这些资源直接与 Lambda 函数/处理程序打包。例如,使用层部署运行时(可执行文件)或共享资源(例如二进制依赖项)已有详细记录 - 在这两种情况下,函数本身都会调用或引用层内容。
我的问题是,一个层是否可以完全独立地向 Lambda 函数添加行为或围绕 Lambda 函数添加行为。例如,假设我想要一个简单地回显“Hello World”的新层 - 是否可以部署一个对现有函数执行此操作的层,而不需要该函数对该层有任何引用?
aws-lambda ×9
python ×3
aws-cli ×2
amazon-s3 ×1
firefox ×1
google-api ×1
javascript ×1
node.js ×1
python-3.x ×1
selenium ×1
typescript ×1