![](/img/trans.png)
[英]How to use chrome-aws-lambda on a AWS lambda function created with Amplify
[英]How to increase memory available for chromium in chrome-aws-lambda?
我使用 puppeteer 和 chrome-aws-lambda 收集数据。 我计划将其推送到 AWS Lambda 但在本地测试时出现错误:
Error: Protocol error (Runtime.callFunctionOn): Target closed.
当我调用waitForSelector
时。
我有一些帖子提到铬工艺有可能在 docker 中变得太少 memory。 问题是:如何获得更多的memory? 我还读到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
的内容。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 memory,它应该足以加载几页。 如果您仍然觉得这是问题,您可以将 memory 增加到 10240。我怀疑该错误可能与 memory 无关。
为了验证,您可以执行以下操作来查看 Lambda 是否真的得到了指定的 memory。
在 Eager 模式下运行 lambda(即使没有活动请求,这也会使 lambda 在本地运行)
sam local start-api --warm-containers EAGER
现在运行以下命令来跟踪 memory 的消耗
docker stats
您现在可以向您当地的 api 发送请求并跟踪 memory 的消耗。 If you see less than 4GB memory allocated to your lambda function, then update the Docker resources and ensure you allocate appropriate memory to 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
希望这可以帮助您进一步进行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.