LoginSignup
13
9

More than 3 years have passed since last update.

【Lambda】zipファイルの圧縮解凍サンプル【nodejs】

Last updated at Posted at 2019-09-29

やること

Lambdaで
・圧縮:S3バケットにzipファイルを作成する
・解凍:S3バケットに格納されている、zipファイルから中身を取り出す

手順概要

  • node-zip が動くようにLayerファイル(zip)を作る
  • LambdaにLayerファイルをアップロードする
  • Layerを使って関数を作る

Layerファイルを作ります

クライアントで作業します。
クライアントnodejsが動くようにして、外部モジュールを入れたものをzipしてaws管理コンソールから入れるだけ

例えば、amazon linux2で作業する場合は…

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に登録します

AWS管理コンソールで作業します。
スクリーンショット 2019-09-29 21.43.44.png
「レイヤーの作成」で、先ほど作ったLayer.zipファイルを入れれば終わりです。

関数の準備

Layersを選択して
スクリーンショット 2019-09-29 21.48.17.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);

13
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
9