我创建了一个在AWS Lambda上运行Puppeteer的模板

你想做什么?

    • PuppeteerをAWS Lambdaで動かしたい

 

    • Lambda Layerを使ったり、

 

    • Cloudformationを使って

 

    • 再現性のある状態にしたい、かつ変更時は最小限に抑えたい

 

    というのを今後も使い回せるようにテンプレート用意したい

以下是通过以下方式完成的结果↓
https://github.com/nsk917/aws-lambda-puppeteer-template

确认操作环境

$ node -v
v8.10.0

$ aws --version
aws-cli/1.16.106 Python/3.6.7 Linux/4.4.0-17134-Microsoft botocore/1.12.96

在Windows Subsystem on Linux上执行

暂时先想要运行

应该能够通过复制粘贴来运行

git clone https://github.com/nsk917/aws-lambda-puppeteer-template.git
cd aws-lambda-puppeteer-template

RAND=$(openssl rand -hex 10)
aws s3 mb s3://aws-lambda-layer-$RAND --region ap-northeast-1

npm run zip-layer

aws cloudformation package \
 --template-file template.yaml \
 --s3-bucket aws-lambda-layer-$RAND \
 --output-template-file deploy.yaml

aws cloudformation deploy \
 --stack-name aws-lambda-puppeteer \
 --template-file deploy.yaml \
 --capabilities CAPABILITY_IAM \
 --no-fail-on-empty-changeset

在之后,您可以通过管理控制台创建一个相应的Lambda函数测试事件,并进行测试。这样,您应该能够获得以下类似成功的结果:
“GitHub – nsk917/aws-lambda-puppeteer-template:用于在AWS Lambda上运行puppeteer的模板”

关于Puppeteer和chrome-aws-lambda,暂时不予详述。

重点

RAND=$(openssl rand -hex 10)を使う必要はまったくなくて、コピペで動かすために用意しただけ

Lambda Layerで使用するモジュールはpackage.jsonのdependenciesのみ使うようにする

Lambda Layer用に別のディレクトリ用意したりするのは面倒なので、シェルスクリプトにした
他にいい方法あれば知りたい

IAM RoleをCloudformationで作成するので、deployするときに–capabilities CAPABILITY_IAMをつける

–no-fail-on-empty-changesetについてはこちらの記事を参考に
S3へファイルアップロードをするということを手動で行わなくても良い

稍微解释一下

多余之感

index.js 文件

几乎是chrome-aws-lambda样例的原样。只需要更改URL即可。

模板.yaml

在chrome-aws-lambda的文件中提到,建议将MemorySize设置为512,推荐值为1600MB。

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31

Resources:
  LambdaLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: aws-lambda-puppeteer
      CompatibleRuntimes:
        - nodejs8.10
      ContentUri: lambda-layer.zip

  LambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      Runtime: nodejs8.10
      CodeUri: ./src/
      Handler: index.handler
      Layers:
        - !Ref LambdaLayer
      MemorySize: 512 # 1600 is recommended.
      Timeout: 120
      Role: !GetAtt LambdaExecutionRole.Arn

  #以下略

zip.sh 压缩脚本

在执行npm run zip-layer命令时,会运行以下脚本:
不直接使用开发所使用的node_modules,而是先在另一个目录中通过npm install来安装,并将其压缩为ZIP文件。
在此过程中,如果指定了–production参数,将只会安装dependencies的模块。

#!/bin/bash -x

DIR=$(cd $(dirname $0); pwd)
mkdir -p $DIR/nodejs
rm -rf $DIR/lambda-layer.zip $DIR/nodejs/node_modules
cp $DIR/package*.json $DIR/nodejs/

npm isntall --production --prefix nodejs
rm -rf $DIR/nodejs/package*.json

zip -9 -r lambda-layer.zip nodejs

在本地进行测试

使用 docker-lambda 进行测试
但我从未尝试过在 Linux 上运行

# WSL (Windows Subsystem for Linux)
docker run --rm --mount type=bind,src=C:/<path>/aws-lambda-puppeteer-template,dst=/var/task lambci/lambda:nodejs8.10 index.handler

# Linux
docker run --rm --mount type=bind,src=$(pwd),dst=/var/task lambci/lambda:nodejs8.10 index.handler

请参考以下网址

AWS Serverless Application Model (SAM)是一个开源项目,它提供了一种简化、标准化的方式来构建和部署无服务器应用程序。您可以在GitHub上找到SAM的源码和详细文档。

chrome-aws-lambda 是一个开源项目,可提供使用Chrome在AWS Lambda上的支持。你可以在 https://github.com/alixaxel/chrome-aws-lambda 找到更多相关信息。

使用 chrome-aws-lambda 的原因
https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md#running-puppeteer-on-aws-lambda

AWS Lambda(Typescript)的Lambda Layers的使用,开发和部署考察。

广告
将在 10 秒后关闭
bannerAds