【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中。

スクリーンショット 2019-09-29 21.43.44.png

准备函数

スクリーンショット 2019-09-29 21.48.30.png

创建函数

把下面的代码放在开头处,然后尝试运行。如果没有报错,说明层有效。

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);

bannerAds