我正在使用AWS Lambda,它涉及创建我的node.js脚本的存档,包括该node_modules文件夹并将其上传到他们的基础架构以运行.
这种方法很好,除了涉及具有本机绑定的节点模块(使用node-gyp).由于绑定已在我的本地计算机(OS X)上进行编译和项目存档,因此它与AWS(Amazon Linux)服务器不兼容.
如何交叉编译/安装节点模块(特别是node-sqlite3),这样当我将其上传到另一个服务器时,它会运行吗?
cross-compiling amazon-web-services node.js node-gyp aws-lambda
从zip文件上传代码时,我在aws-lambda控制台中不断收到此错误.我尝试上传其他zip文件,但它们正常工作..js文件在zip文件中名为"CreateThumbnail.js".我相信处理程序也正确命名为"CreateThumbnail.handler".node_modules子目录也已设置.任何人都有任何想法?
{
"errorMessage": "Cannot find module 'CreateThumbnail'",
"errorType": "Error",
"stackTrace": [
"Function.Module._resolveFilename (module.js:338:15)",
"Function.Module._load (module.js:280:25)",
"Module.require (module.js:364:17)",
"require (module.js:380:17)"
]
}
Run Code Online (Sandbox Code Playgroud) 有没有人想出一个很好的源代码控制解决方案并将代码部署到AWS Lambda?我真的很讨厌我必须一直压缩文件并上传它们.有没有更好的方法来做这个也许是一个根据Lambda的变化推送代码的服务?
我正在编写一个我希望作为AWS Lambda函数运行的应用程序,但也遵守Twelve-Factor应用程序指南.特别是第三部分.配置需要使用环境变量进行配置.
但是,我找不到为AWS Lambda实例设置环境变量的方法.谁能指出我正确的方向?
如果无法使用环境变量,请推荐一种方法来使用环境变量进行本地开发,并将它们转换为可以使用AWS中的应用程序代码访问的有效配置系统.
谢谢.
我有4个lambda函数,将同时调用(由SNS),SNS事件的频率为5分钟.每个函数处理大量数据和图像(~300MB),因此我将它们存储在/tmp文件夹中(500MB限制).
在函数开始时,我在清理/tmp文件夹中写了一些代码,以确保它不会内存不足(因为我已经知道AWS lambda有时会重用以前的容器来提高性能).
我手动检查它(创建消息并通过SNS发布到4个lambda函数),它工作正常.
但是当它自动运行(每5分钟调用一次)时,结果并不像我期望的那样.第一次执行很好,但接下来的时间,4个甚至4个lambda函数中的1个抛出与"内存不足"相关的错误:"设备上没有空间",无法加载lib,...
以前,我使用nodejs(4.3)它两种情况都很好.
但由于某种原因我必须更改为python,主流和创建数据的挂载是相同的.但它在自动运行时失败了.
我认为这个问题来自前一个容器(重用容器)的缓存,我检查了/tmpclean(ls -alh /tmp)之后没有文件但是当检查存储(df /tmp)时它显示使用的是77%.
任何关于制作干净/tmp文件夹或解决方案的建议都非常感谢.谢谢!
编辑:我用来清理/tmp文件夹的代码:
from subprocess import call
...
call('rm -rf /tmp/*', shell=True)
Run Code Online (Sandbox Code Playgroud) 我有一个带有 SQS 触发器的 Lambda。当它被击中时,来自 SQS 的一批记录进来(我认为通常一次大约 10 个)。如果我从处理程序返回失败的状态代码,将重试所有 10 条消息。如果我返回成功代码,它们都会从队列中删除。如果这 10 条消息中有 1 条失败,而我只想重试那一条怎么办?
exports.handler = async (event) => {
for(const e of event.Records){
try {
let body = JSON.parse(e.body);
// do things
}
catch(e){
// one message failed, i want it to be retried
}
}
// returning this causes ALL messages in
// this batch to be removed from the queue
return {
statusCode: 200,
body: 'Finished.'
};
};
Run Code Online (Sandbox Code Playgroud)
我是否必须手动将该消息重新添加回队列?或者我可以从我的处理程序返回一个状态,指示一条消息失败并应该重试?
我正在尝试创建一个以 Lambda 函数作为目标的 AWS Eventbridge 规则。我可以很好地添加规则和目标,但是当我尝试通过RoleArnCloudformation 堆栈部署设置 lambda 权限时失败,并显示:
RoleArn is not supported for target arn:aws:lambda:us-east-1:1234567890:function:contacts-lambda-consume-new-customer. (Service: AmazonCloudWatchEvents; Status Code: 400; Error Code: ValidationException; Request ID: xxxxx-ec5d-45e8-b45d-xxxxxx; Proxy: null)
这是我的 Cloudformation 堆栈代码:
EventRuleNewCustomer:
Type: AWS::Events::Rule
Properties:
Name: new-customer
EventBusName: myEventBus
# RoleArn: !Join ["", ["arn:aws:iam::",!Ref "AWS::AccountId", ":role/my-role"] ] #no error but doesn't add the permissions
Description: "New customer event rule"
EventPattern:
detail-type:
- "NewCustomer"
State: "ENABLED"
Targets:
-
Arn: !Join ["", ["arn:aws:lambda:" ,!Ref "AWS::Region", ":", !Ref "AWS::AccountId", ":function:contacts-lambda-consume-new-customer"] …Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-cloudformation amazon-iam aws-lambda aws-event-bridge
我正在使用基本示例在 Ubuntu 上构建 lambda。它构建时没有任何错误,但如果我在 aws 上上传并测试它,则会崩溃:
{
"errorMessage": "RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b Error: Runtime exited with error: exit status 1",
"errorType": "Runtime.ExitError"
}
Run Code Online (Sandbox Code Playgroud)
日志输出为:
START
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
Version: $LATEST.~.jwtauthorizeraws.jwtauthorizerawsapplication: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by ./~.jwtauthorizerawsapplication)
END
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
REPORT
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
Duration: 56.02 ms
Billed Duration: 57 ms
Memory Size: 128 MB
Max Memory Used: 7 MB
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
Error: Runtime exited with error: exit status 1
Runtime.ExitError
Run Code Online (Sandbox Code Playgroud) 我的情况是我在向我的无服务器框架项目添加外部NPM包时遇到了一些麻烦(特定包是geopoint).
我去了无服务器项目的根文件夹并运行npm install geopoint --save.package.json已更新,dependencies": { "geopoint": "^1.0.1" }并创建了node_modules文件夹.
我的文件夹结构是这样的:
根项目文件夹
-functions
--geospatial
--- handler.js
-node_modules
--geopoint
在我的函数/ geospatial/handler.js中,我将geopoint模块声明为:
var geopoint = require('geopoint');
var geopoint = require('../../geopoint');
var geopoint = require('../../../geopoint');
Run Code Online (Sandbox Code Playgroud)
lambda控制台返回错误:
{
"errorMessage": "Cannot find module '../../geopoint'",
"errorType": "Error",
"stackTrace": []
}
Run Code Online (Sandbox Code Playgroud)
如何正确地将外部NPM模块添加到无服务器框架项目?
Serverless-1.0.0-rc.1支持部署可通过AWS API Gateway访问的API.
问题:我需要通过带有SSL证书的自定义域而不是随机分配的(URL https://qwertylgbtqert.execute-api....)来公开部署的API 吗?
可以从内部serverless.yml或无服务器框架完成吗?
这是我简单的服务serverless.yml定义:
service: my-service
provider:
name: aws
runtime: nodejs4.3
functions:
generate:
handler: handler.generate
events:
- http:
method: get
path: url
cors: true
Run Code Online (Sandbox Code Playgroud)
有一个问题与此有关:答案在这里,但没有提供适用的答案.特别是如何从serverless.yml自身内部分配自定义域.
它认为是否有可能创建AWS :: Route53资源并利用它,但我不知道如何在无服务器中执行此操作.
amazon-web-services aws-lambda aws-api-gateway serverless-framework
aws-lambda ×10
node.js ×5
amazon-iam ×1
amazon-sqs ×1
aws-sdk ×1
javascript ×1
node-gyp ×1
python ×1