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