Ответ 1
Как указано выше, необходимо закодировать в base64. Вот bash однострочный:
openssl dgst -sha256 -binary_your_file_path_ | openssl enc -base64
Когда вы вызываете aws lambda get-function --function-name FunctionName
, вы увидите клавишу CodeSha256
. Тем не менее, я не знаю, что это за Sha256. Он не соответствует shasum -a 256 FunctionName.zip
, где FunctionName.zip
- это пакет, который я загрузил.
То, что я хотел бы сделать, для существующей лямбды, генерирует sha256 из кода, который я собираюсь загрузить, который будет соответствовать амазонке sha256, возвращается в get-function
. Любая помощь приветствуется, так как я не мог найти никакой информации об этом в любом месте, кроме Amazon, говорящего "хэш SHA256 пакета развертывания"
Как указано выше, необходимо закодировать в base64. Вот bash однострочный:
openssl dgst -sha256 -binary_your_file_path_ | openssl enc -base64
Хорошо, я понял это. Все методы для генерации 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();
});
});
Это никогда не будет работать из-за этого: Почему при двойном архивировании одного и того же контента получается два файла с разными SHA1?
Я столкнулся с той же проблемой, пытаясь использовать SHA из почтового индекса. Вы всегда получите другой SHA.
В питоне тот же самый шасум от 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