やること
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管理コンソールで作業します。
「レイヤーの作成」で、先ほど作ったLayer.zipファイルを入れれば終わりです。
関数の準備
Layersを選択して
「レイヤーの追加」押下で先ほど作ったレイヤーが出てきますので、選択。
関数の作成
下のコードを先頭あたりに入れて、実行してみます。エラーが出なければレイヤーが効いています。
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);