Amazon web services 上传前如何计算aws lambda部署包的代码SHA256

Amazon web services 上传前如何计算aws lambda部署包的代码SHA256,amazon-web-services,aws-lambda,Amazon Web Services,Aws Lambda,调用aws lambda get function--function name function name时,您将看到一个CodeSha256键。不过,我不知道这是怎么回事。它与shasum-a 256 FunctionName.zip不匹配,其中FunctionName.zip是我上传的包 对于现有的lambda,我希望能够从我要上传的代码中生成sha256,该代码将与amazon在get function中返回的sha256匹配。非常感谢您的帮助,因为我在任何地方都找不到任何关于此的信息,

调用
aws lambda get function--function name function name
时,您将看到一个
CodeSha256
键。不过,我不知道这是怎么回事。它与
shasum-a 256 FunctionName.zip不匹配,其中
FunctionName.zip
是我上传的包


对于现有的lambda,我希望能够从我要上传的代码中生成sha256,该代码将与amazon在
get function
中返回的sha256匹配。非常感谢您的帮助,因为我在任何地方都找不到任何关于此的信息,除了Amazon说这是“部署包的SHA256哈希”

好的,我找到了。生成SHA256哈希的所有方法都以十六进制输出,但amazon以base64返回

所以,为了完全回答我自己的问题,下面是如何(使用node)检查是否要上载相同的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();
    });
});

如上所述,需要在base64中编码。这里有一个简单的句子:

openssl dgst-sha256-binary _您的文件_路径| openssl enc-base64

由于以下原因,这将永远无法工作:


我在尝试使用zip中的SHA时遇到了同样的问题。您将始终获得不同的SHA。

在python中,来自aws lambda的相同shasum

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)
ldata=''
将open(localfilepath,'rb')作为f:
ldata=f.read()
#使用的openssl等效命令
#$openssl dgst-sha256-binary | openssl enc-base64
如果是ldata:
m=hashlib.sha256()
m、 更新(ldata)
s3_digest=m.digest()
本地代码SHA256=B64编码(s3\U摘要)
为了验证,在aws env设置正确的情况下(假设aws令牌和CRED设置正确,此cli才能工作),比较代码SHA256。(使用python boto3客户端获取lambda详细信息。)

$aws lambda get函数--函数名
{
“配置”:{
“函数名”:“------------”,
“FunctionArn”:“arn:aws:lambda:us--1:-----:function:------”,
“运行时”:“nodejs10.x”,
“角色”:“arn:aws:iam::-------:Role/-----------”,
“处理程序”:“------------”,
“代码大小”:10042831,
“说明”:“,
“超时”:300,
“记忆化”:3008,
“LastModified”:“2019-10-09T23:44:08.222+0000”,
“代码SHA256”:“aAMvEdR/MSq0x89LzD0L37+AZceFzhtrb9eymqczAh8=”,
“版本”:“$LATEST”,
“环境”:{
“变量”:{
...
}
}
..}
.}
aws lambda列表

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
response=None
resp_函数=[]
lc=boto3.客户机('lambda',
aws\u访问\u密钥\u id=,
aws_secret_access_key=,
aws_会话_令牌=,
地区名称=)
尝试:
响应=lc.list_函数()
尽管如此:
resp_functions.extend(响应['functions'][:])
#复制函数并使用下一个标记进行迭代
如果响应为“NextMarker”:
response=lc.list_函数(Marker=response['NextMarker'])
其他:
打破
例外情况除外,例如:
加薪

以下是在GNU/Linux上使用基本实用程序的方法:

cat function.zip |sha256sum |cut -d' ' -f1 |xxd -r -p |base64
这些组件可能很熟悉:

  • cut
    隔离校验和值
  • xxd
    将base16转换为二进制(反向十六进制转储)
  • base64
    将二进制文件转换为base64

现在使用python,请:)非常感谢!我已经找了很久了。
cat function.zip |sha256sum |cut -d' ' -f1 |xxd -r -p |base64