2015-11-20 3 views
9

Quando si chiama aws lambda get-function --function-name FunctionName, verrà visualizzata una chiave CodeSha256. Non so cosa sia Sha256ing, però. Non corrisponde a shasum -a 256 FunctionName.zip, dove FunctionName.zip è il pacchetto che ho caricato.Come calcolare il CodeSha256 del pacchetto di distribuzione aws lambda prima di caricare

Quello che mi piacerebbe essere in grado di fare, per un lambda esistente, è generare lo sha256 dal codice che sto per caricare che corrisponderebbe allo sha256 amazon restituisce in get-function. Qualsiasi aiuto è apprezzato, in quanto non sono stato in grado di trovare alcuna informazione su questo ovunque, tranne che per Amazon dicendo che è "l'hash SHA256 del pacchetto di distribuzione"

risposta

12

Ok, l'ho capito. Tutti i metodi per generare un hash 256 sha lo stampano in esadecimale, ma Amazon lo sta restituendo in base64.

Quindi, per rispondere completamente alla mia domanda, ecco come (con nodo), controllare se stai per caricare lo stesso zip.

#!/usr/bin/env node 
var crypto = require('crypto'); 
var fs = require('fs'); 
var path = require('path'); 
var AWS = require('aws-sdk'); 
var lambda = new AWS.Lambda({ 
    region: 'us-west-2' 
}); 

var lambdaName = 'CreatePost'; 
var filePath = path.resolve(__dirname, 'tmp/create-post.zip'); 

lambda.getFunction({ 
    FunctionName: lambdaName 
}, function (error, data) { 
    if (error) { 
     console.error(error); 
     return process.exit(1); 
    } 
    var lambdaSha256 = data.Configuration.CodeSha256; 

    var shasum = crypto.createHash('sha256'); 
    fs.createReadStream(filePath) 
    .on("data", function (chunk) { 
     shasum.update(chunk); 
    }) 
    .on("end", function() { 
     var sha256 = shasum.digest('base64'); 
     if (sha256 === lambdaSha256) { 
      console.log("No need to upload, sha hashes are the same"); 
     } else { 
      console.log("That needs to be uploaded again son.") 
     } 
     process.exit(); 
    }); 
}); 
5

Come indicato sopra, è necessario codificare in base64. Ecco un one-liner bash:
openssl dgst -sha256 -binary _your_file_path_ | openssl enc -base64