我创建了一个在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的使用,开发和部署考察。