【问题标题】:How to increase memory available for chromium in chrome-aws-lambda?如何增加 chrome-aws-lambda 中铬的可用内存?
【发布时间】:2021-07-15 09:03:33
【问题描述】:

我使用 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

【问题讨论】:

  • 您能否提供更多有关您在本地运行情况的详细信息,例如您使用的是 SAM 还是其他框架?
  • @GSSwain,谢谢!我刚刚在帖子中添加了包含此信息的更新。
  • 从 StackOverflow 问题中的模板中删除 AWS 帐号。
  • 如果你的意思是:764866452798 ,它只是一个公开可用的 chrome-aws-lambda 的 id。在此处看不到任何其他帐号
  • 那么是内存问题还是其他问题?如果您可以添加对您有用的内容,那就太好了。

标签: amazon-web-services puppeteer chrome-aws-lambda


【解决方案1】:
  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(可能使用local layer with 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

希望这可以帮助您继续前进。

【讨论】:

  • 当我在本地运行它时它仍然失败,但当我将它部署到 AWS Lambda 时它工作正常。你能给我发信息到 chapkovski@gmail.com,如果你能帮我解决这个问题,我会很感兴趣(我肯定会补偿)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2014-11-19
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多