Articles of amazon web services

无服务器框架Facebook Bot慢(AWS Lambda)

我正在开发一个Facebook聊天机器人,我正在使用无服务器框架(Node.js)开发它并将其部署到aws lambda。 在开始的几个星期里,我使用无服务器的离线插件运行了一个本地无服务器的lambda模拟器,一切都很好。 昨天,我终于决定将其部署到AWS lambda,现在我看到性能和一致性的显着下降。 有时机器人需要10秒才能做出回应,有时甚至是瞬间的。 奇怪的是,在lambda云日志中,它总是说这个函数在150毫秒左右完成,这似乎超快,但脸谱机器人根本不反映速度。 我正在打一个数据库,但查询绝对不会花费近10秒的时间来运行。 更新: 我决定尝试使用邮差(这基本上是curl的)手动发送请求到API端点来testingbot。 每当api即时回复,即使我发送了与Messenger一样的请求主体。 所以看起来这个请求只是需要很长时间才能达到lambda api,但是当它到达那里时,它就像应该运行一样。 任何想法如何解决这个问题?

通过aws codebuild为nodejs lambda创buildzip文件

我想通过aws codebuild过程为我的nodejs lambda创build一个zip工件 – 这样lambda函数可以在S3中使用这个zip文件作为源代码,并且我们有一个部署“certificate”,用于在codebuild中使用git commit id进行pipe理 我在github-repo中的文件结构是 folder1 – myfile.js – otherfile.js folder2 – otherfiles.js package.json 现在为nodejs lambda项目我想zip文件没有zip文件夹(我们需要的lambda nodejs项目),所以zip应该直接包含以下文件 – myfile.js – node_module ==> folder from codebuild via npm install command 问题: 1)在S3输出zip包含在文件夹即.zip-> rootfolder-> myfile.js,而不是我们要求的.zip-> myfiles.js这是不可用的lambda作为nodejs它应该有文件在根zip和不在里面他们(文件夹内没有相对path) 2)path – 你可以看到myfile.js是在一个文件夹我想相对path被省略 – 我试图放弃path,但问题是所有的node_module文件也在文件夹而不是在文件夹作为丢弃path适用于他们两个 – 我可以设置丢弃path只为myfile.js而不是为node_module文件夹? 我目前的yaml文件: artifacts: files: – folder/myfile.js – node_modules/**/* discard-paths: yes 如果有人可以提供解决scheme,这将是很好的? 如果解决scheme中不包含更改的github-repo文件夹结构,我想在其他文件中也重复这个用于创build其他lambda函数的repo。 […]

从node.js中的JSON将s3桶策略转换为base64

我正在尝试在node.js中的base64中对Amazon s3存储桶策略进行编码(更具体地说是StringToSign),但似乎无法获得正确的代码。 我使用由amazon提供的默认策略进行testing,因为它们提供了正确的base64编码。 ( 亚马逊给出的例子 ) 他们的输出是eyAiZXhwaXJhdGlvbiI6ICIyMDE1…….. (保持它很短,因为它很长) 我不断收到eyJleHBpcmF0aW9uIjoiMjAxNS0xMi0zMFQx….. 我的代码来生成这个是: var policyString = JSON.stringify(policy) var policyBytes = utf8.encode(policyString) var stringToSign = base64.encode(policyBytes) 其中policy是以JSON格式保存亚马逊策略的variables,而utf8和base64是节点模块。 这可能听起来像一个新手的问​​题,但我一直盯着它一段时间,任何hlep将不胜感激!

删除dynamodb中的嵌套属性

假设我在dynamodb中获得了这个项目: { "customerId": "customer_001", "customerName: "itsme", "address": { "city": "Frankfurt", "country": "Germany", "street1": "c/o Company xxx", "street2": "Europe", "street3": "PO Box 406", "zip": "12345" } } 我需要从项目中删除嵌套的属性address.street3。 我怎么能做到这一点? 这是我的代码,它完美地删除非嵌套的属性(例如:customerName),但如果我尝试使用嵌套属性(例如:address.street3)不起作用(没有错误及没有发生) const params = { TableName: customerTable, Key: { customerId: customerId, }, AttributeUpdates: { 'address.street3': { Action: 'DELETE' } } }; dynamoDb.update(params, function (err, data) { if […]

使用AWS Lambda在NodeJS中找不到MySQL

我有下面的代码,我想要执行。 我试过要求mysql和node-mysql,它们都给我同样的错误: 码: var AWS = require("aws-sdk"); var mysql = require("mysql"); exports.handler = (event, context, callback) => { try { console.log("GOOD"); } catch (error) { context.fail(`Exception: ${error}`) } }; 错误: { "errorMessage": "Cannot find module 'mysql'", "errorType": "Error", "stackTrace": [ "Function.Module._load (module.js:417:25)", "Module.require (module.js:497:17)", "require (internal/module.js:20:19)", "Object.<anonymous> (/var/task/index.js:2:13)", "Module._compile (module.js:570:32)", "Object.Module._extensions..js (module.js:579:10)", "Module.load (module.js:487:32)", "tryModuleLoad […]

在aws上的ETagcaching

我需要将由node restify支持的API Server迁移到使用AWS提供的API Gateway + lambda函数的东西。 API服务器(GET / POST简单的东西,不涉及数据库)作为代理服务器与CMS系统交谈,为客户端提取数据。 目前, etagcaching是通过调整中间件完成的。 我想知道我需要做什么才能在新的解决scheme(API网关+ lambda)中实现同样的目标? 一个侧面说明,我想到的是 – 保存从CMS的响应到S3 / CloudFront与启用ETagcaching机制,让他们确定是否可以使用浏览器上的caching响应。 我想知道这是否是一个好的做法? 谢谢

NodeJS / Express + HTTPS:如何将密钥和证书部署到AWS EC2节点?

Node.js&Express.js是我用来编写Web API服务的新手。 要启用HTTPS,服务使用以下代码: const server = https .createServer({ key: fs.readFileSync('./cert/myservice.key'), cert: fs.readFileSync('./cert/myservice.crt') }) .listen(serverConfig.server.port, () => logger.info(`MyService is up and running`)); 很容易看出,这段代码假设.key和.crt文件在服务应用程序位置本地可用。 如果我想将服务部署到单个AWS EC2主机(为了简单起见),这些文件将不得不在那里,这似乎不是一个安全的解决scheme。 我正在考虑使用AWS IAM来保护这些秘密。 问题在于无法直接从IAM“部署”/将密码提供给EC2节点。 我不得不使用IAM的API来获取秘密,但问题是如何使EC2上的AWS凭证可用。 问题:是否有build议的安全方式将密钥(包括证书和密钥)部署到AWS EC2节点?

在AWS Lambda中实例化AWS Helper类时是否需要指定区域?

如果我想从AWS Lambda调用AWS SES,那么在实例化AWS Helper类时通常会写下列内容: var ses = new aws.SES({apiVersion: '2010-12-01', region: 'eu-west-1'}); 我想知道,我是否真的需要指定AWS区域? 或者AWS SES帮助程序类将在运行AWS Lambda函数的区域中运行。 这里最好的做法是什么? 如果我忽略这个,可能会遇到问题吗?

Lambda函数失败无法导入模块“索引”

错误: Unable to import module 'index': Error at Function.Module._load (module.js:417:25) at Module.require (module.js:497:17) at require (internal/module.js:20:19) at Object.<anonymous> (/var/task/node_modules/slack-incoming-webhook/lib/index.js:3:19) at Module._compile (module.js:570:32) at Object.Module._extensions..js (module.js:579:10) at Module.load (module.js:487:32) at tryModuleLoad (module.js:446:12) at Function.Module._load (module.js:438:3) 通过看起来这个我的代码是不是问题这是一个问题,松散的传入webhook节点模块,但是一块有问题的代码是这条线,看起来完全正常。 var SlackClient = require('./client'); 我已经尝试了4个不同的包(request,http,node-webhooks和slack-incoming-webhooks),并且它们都在节点模块中都失败了。 我非常困惑,因为我可以让代码在我自己的计算机上和Amazon Linux AMI EC2实例上运行(运行相同的节点版本) 所有的代码被压缩并使用aws-cli发送到lambda,并且我已经在lambda上部署了node.js代码,没有任何问题(alexa技能)。 我已经试过在ec2实例npm安装,我已经尝试了几个不同的包,我已经得出结论必须有某种configuration错误的lambda,但我找不到什么。 有人能指点我吗? 这里是我的代码,如果有人也好奇拉姆达触发器是aws iotbutton。 const slack = require('slack-incoming-webhook'); const send […]

将AWSconfiguration传递给导入的模块

我正在尝试通过在本地运行JS单元来testingJS AWS Lambda。 为了模拟Lambda环境,我假定Lambda与AWS.config.credentials具有相同的angular色,然后简单地调用我导入的Lambda函数。 这工作如果我复制和粘贴到testing文件的Lambda函数,但如果我导入它然后似乎函数运行一个干净的AWS.config没有我的configuration。 我可以更改Lambda模块导入AWS的方式(使其成为全局或执行其他操作),以便从testing中获取configuration,但是我更愿意将文件保存为应该上传到Lambda的文件。 在AWS Lambda中,AWS凭证以某种方式预先configuration,而模块不必执行任何操作,我想模拟该function。 这怎么能在Node中完成? 编辑:您可以在AWS Lambda中运行任何示例函数。 例如,只需在适当的AWS Lambda中运行下面的代码即可。 var AWS = require("aws-sdk"); var dynamo = new AWS.DynamoDB.DocumentClient(); dynamo.query(…) 要在本地运行,必须在此代码之前加上以下内容: AWS.config.update({region: 'us-east-1'}); AWS.config.credentials = new AWS.SharedIniFileCredentials(); AWS.config.credentials = new AWS.TemporaryCredentials({ RoleArn: 'arn:aws:iam::1234567890:role/TemporaryCredentials', }); 问题是,在unit testing文件中运行此configuration步骤不会使configuration可用于导入的lambda函数,因此不能正确模拟环境。