Как вычислить CodeSha256 пакета развертывания aws лямбда перед загрузкой

Когда вы вызываете aws lambda get-function --function-name FunctionName, вы увидите клавишу CodeSha256. Тем не менее, я не знаю, что это за Sha256. Он не соответствует shasum -a 256 FunctionName.zip, где FunctionName.zip - это пакет, который я загрузил.

То, что я хотел бы сделать, для существующей лямбды, генерирует sha256 из кода, который я собираюсь загрузить, который будет соответствовать амазонке sha256, возвращается в get-function. Любая помощь приветствуется, так как я не мог найти никакой информации об этом в любом месте, кроме Amazon, говорящего "хэш SHA256 пакета развертывания"

Ответ 1

Как указано выше, необходимо закодировать в base64. Вот bash однострочный:
openssl dgst -sha256 -binary_your_file_path_ | openssl enc -base64

Ответ 2

Хорошо, я понял это. Все методы для генерации sha 256 хэш выводят его в шестнадцатеричном виде, но amazon возвращает его в base64.

Итак, чтобы полностью ответить на мой собственный вопрос, вот как (с node), проверьте, не собираетесь ли вы загрузить тот же почтовый индекс.

#!/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();
    });
});

Ответ 4

В питоне тот же самый шасум от aws лямбда

ldata = ''
with open(localfilepath,'rb') as f:
    ldata = f.read()

    # openssl equivalent command used
    # $openssl dgst -sha256 -binary <binary_file> | openssl enc -base64

    if ldata:
        m = hashlib.sha256()
        m.update(ldata)
        s3_digest = m.digest()
        local_codesha256 = b64encode(s3_digest)

Чтобы убедиться в правильности установки aws env (при условии, что токен aws и creds установлены правильно, чтобы эта cli работала), сравните CodeSha256. (используя Python Boto3 клиент для получения лямбда-данных.)

 $ aws lambda get-function --function-name <functionname>
{
    "Configuration": {
        "FunctionName": "-----------",
        "FunctionArn": "arn:aws:lambda:us--1:----:function:-----",
        "Runtime": "nodejs10.x",
        "Role": "arn:aws:iam::-------:role/-------------",
        "Handler": "--------- ",
        "CodeSize": 10042831,
        "Description": "",
        "Timeout": 300,
        "MemorySize": 3008,
        "LastModified": "2019-10-09T23:44:08.222+0000",
        "CodeSha256": "aAMvEdR/MSq0x89LzD0L37+AZceFzhtrb9eymqczAh8=",
        "Version": "$LATEST",
        "Environment": {
            "Variables": {
            ...
             }
         }
    ..}
    .}

Лямбда-лист aws

response = None
resp_functions = []
lc = boto3.client('lambda',
                  aws_access_key_id=<-----> ,
                  aws_secret_access_key=<--->,
                  aws_session_token=<--->,
                  region_name=<--->)
try:
    response = lc.list_functions()
    while True:
        resp_functions.extend(response['Functions'][:])
        # copy the function and iterate with next marker
        if 'NextMarker' in response:
            response = lc.list_functions(Marker=response['NextMarker'])
        else:
            break

except Exception as ex:
    raise ex