【Lambda】压缩解压缩zip文件的示例【nodejs】
去做的事情
通过Lambda实现以下功能:
– 压缩:在S3存储桶中创建zip文件
– 解压:从存储桶中的zip文件中提取内容
步骤摘要
-
- node-zip が動くようにLayerファイル(zip)を作る
-
- LambdaにLayerファイルをアップロードする
- Layerを使って関数を作る
创建Layer文件
在客户端进行工作。
确保客户端上运行Node.js,并且将安装了外部模块的文件夹压缩为zip后,只需通过AWS管理控制台安装。
如果你在Amazon Linux 2上工作的话…
curl --silent --location https://rpm.nodesource.com/setup_12.x | sudo bash -
yum install -y nodejs
mkdir nodejs
cd nodejs
npm init -y
npm install -y node-zip
cd ..
zip -r layer.zip nodejs/.
将zip文件注册到Lambda中。

准备函数

创建函数
把下面的代码放在开头处,然后尝试运行。如果没有报错,说明层有效。
const node_zip = require('node-zip');
顺便提一下,如果去掉Layer,上面的代码将会出错。
解冻
我会解压存放在S3中的zip文件。
需要在IAM中拥有s3:GetObject权限。
const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });
const node_zip = require('node-zip');
s3.getObject({Bucket:s3bucket, Key:s3object},function(err,data) {
if (err) {
return;
} else {
var zip = new node_zip(data.Body, {base64: false, checkCRC32: true});
for (var fileinzip in zip.files) {
let pKey="";
let pBody="";
for (var para in zip.files[fileinzip]) {
if(para=="name") pKey = zip.files[fileinzip][para];
if(para=="_data") pBody = zip.files[fileinzip][para];
}
// pKey にファイル名、pBodyにファイル内容が入っている
// putObjectするとか。。
} // 次のファイル
});
压缩
只要有文件名和文件内容,无需事先准备要压缩的文件。
我需要在IAM中使用s3:PutObject权限。
const node_zip = require('node-zip');
const zip = new node_zip();
zip.file("ファイル名1", "内容文字列1");
zip.file("ファイル名2", "内容文字列2");
zip.file("ファイル名3", "内容文字列3");
let zipContent = zip.generate({base64: false,compression:'DEFLATE'});
var buf = Buffer.from(zipContent, 'binary');
let param ={ Bucket:bucket, Key : "hoge.zip", Body: buf, ContentType: 'application/zip'};
s3.putObjct(param);