amazon-web-services - 如何增加 chrome-aws-lambda 中铬的可用内存?
问题描述
我使用 puppeteer 和 chrome-aws-lambda 收集数据。我计划将其推送到 AWS Lambda,但在本地测试时出现错误:
Error: Protocol error (Runtime.callFunctionOn): Target closed.
当我要求waitForSelector
。
我有一些帖子提到 chrome 进程在 docker 中获得的内存可能太少。问题是:如何获得更多内存?我也读过这disable-dev-shm-usage
可能会有所帮助,但它没有。这就是我现在的做法(最后一行是发生错误的地方):
const chromium = require('chrome-aws-lambda');
browser = await chromium.puppeteer.launch({
args: [...chromium.args, `--proxy-server=${proxyUrl}`, '--disable-dev-shm-usage'],
defaultViewport: chromium.defaultViewport,
executablePath: await chromium.executablePath,
headless: chromium.headless,
ignoreHTTPSErrors: true,
});
const page = await browser.newPage();
await page.authenticate({ username, password });
await page.goto(MY_URL, { waitUntil: 'domcontentloaded' })
await page.click(SUBMIT_SELECTOR);
await page.waitForSelector('#myDiv')
.then(() => console.log('got it')).
catch((e)=>console.log('Error happens: '+ e));
更新:有关本地设置的更多信息:
我在本地使用sam local start-api
. 这是我的内容template.yaml
(只是一个稍微更新的hello-world
模板:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
samnode
Sample SAM Template for samnode
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 60
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello-world/
Handler: app.lambdaHandler
Runtime: nodejs14.x
MemorySize: 4096
Layers:
- !Sub 'arn:aws:lambda:${AWS::Region}:764866452798:layer:chrome-aws-lambda:22'
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /hello
Method: get
Outputs:
# ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
# Find out more about other implicit resources you can reference within SAM
# https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
HelloWorldApi:
Description: "API Gateway endpoint URL for Prod stage for Hello World function"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
HelloWorldFunction:
Description: "Hello World Lambda Function ARN"
Value: !GetAtt HelloWorldFunction.Arn
HelloWorldFunctionIamRole:
Description: "Implicit IAM Role created for Hello World function"
Value: !GetAtt HelloWorldFunctionRole.Arn
解决方案
MemorySize: 4096
您已经为 Lambda 配置了 4GB 内存,它应该足以加载几个页面。如果您仍然觉得这是问题,您可以将内存增加到 10240。我怀疑该错误可能与内存无关。
要验证,您可以执行以下操作以查看 Lambda 是否实际获取了指定的内存。
在 Eager 模式下运行 lambda(即使没有活动请求,这也会使 lambda 在本地运行)
sam local start-api --warm-containers EAGER
现在运行以下命令来跟踪内存消耗
docker stats
您现在可以向本地 api 发送请求并跟踪内存消耗。如果您看到分配给 lambda 函数的内存少于 4GB,则更新 Docker 资源并确保为 Docker 分配适当的内存。
更新 Docker 资源(增加内存)
尝试不同版本的chrome-aws-lambda
(可能使用带有 SAM 的本地层)。我还将Puppeteer
通过禁用无头模式在本地运行相同的代码块并验证代码正在等待的选择器实际上是否可用。
- 安装
puppeteer
依赖。 - 更新要使用的代码,
puppeteer
而不是chrome-aws-lambda
const puppeteer = require('puppeteer');
- 禁用无头模式
browser = await puppeteer.launch({headless: false});
- 现在运行文件,
node <replace-with-your-file-name.js>
例如,如果文件名是 somejsfile.js 那么命令将是node somefile.js
希望这可以帮助您进一步进行。
推荐阅读
- android - 谷歌驱动器中 App Data 文件夹的未来是什么?
- mongodb - 如何使用 Mongodb 动态查询创建 BIRT 报告
- hibernate - Kotlin:休眠模型中的属性声明
- xml - 如何将 XmlNodeList 转换为 xml 文件?
- java - 在实体中使用嵌入的 id 类型两次
- python - Tensorflow GPU错误CUDA_ERROR_OUT_OF_MEMORY:内存不足
- picocli - Picocli:类属性填充和应用程序执行的单独职责
- python - Python/Pandas - 替换特定列中值的最有效方法是什么
- mqtt - mqtt 代理桥(在 windows 机器中)
- python - 迭代for循环?