繁体   English   中英

如何在 chrome-aws-lambda 中增加可用于铬的 memory?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM