當從使用AWS CLI命令行解密的密文,密文被解密沒有問題:試圖使用超時KMS結果lambda函數內解密的密文
$ aws kms decrypt --ciphertext-blob fileb://encrypted-secrets --output text --query Plaintext --region us-east-1 | base64 --decode > decryped-secrets
這解密操作也試圖在本地工作從JS腳本這樣做:
#!/usr/local/bin/node
const fs = require('fs');
const AWS = require('aws-sdk');
const kms = new AWS.KMS({region:'us-east-1'});
const secretPath = './encrypted-secrets';
const encryptedSecret = fs.readFileSync(secretPath);
const params = {
CiphertextBlob: encryptedSecret
};
kms.decrypt(params, function(err, data) {
if (err) {
console.log(err, err.stack);
} else {
const decryptedScret = data['Plaintext'].toString();
console.log('decrypted secret', decryptedScret);
}
});
但是,試圖與幾乎相同的確切的代碼如上述從AWS lambda函數,在超時的函數結果的調用的上下文內這樣做時:
'use strict';
const zlib = require('zlib');
const mysql = require('mysql');
const fs = require('fs');
const AWS = require('aws-sdk');
const kms = new AWS.KMS({region:'us-east-1'});
const secretPath = './encrypted-secrets';
const encryptedSecret = fs.readFileSync(secretPath);
const params = {
CiphertextBlob: encryptedSecret
};
exports.handler = (event, context, callback) => {
kms.decrypt(params, (err, data) => {
if (err) {
console.log(err, err.stack);
return callback(err);
} else {
const decryptedScret = data['Plaintext'].toString();
console.log('decrypted secret', decryptedScret);
return callback(null, `Successfully processed ${parsed.logEvents.length} log events.`);
}
});
};
超時日誌:
START RequestId: start-request-id-redacted Version: $LATEST
END RequestId: end-request-id-redacted
REPORT RequestId: report-requested-id-redacted Duration: 10002.43 ms Billed Duration: 10000 ms Memory Size: 128 MB Max Memory Used: 18 MB
2016-11-13T19:22:28.774Z task-id-redacted Task timed out after 10.00 seconds
注:
- 如果我註釋掉調用
kms.decrypt
,並試圖console.log
的params
或任何真正的價值輸出,而不的問題。kms.decrypt
調用似乎存在某種問題,並且不會返回超時超時的實際錯誤。 - 附着在其下lambda函數被調用的作用策略包含附加的政策
AWSLambdaVPCAccessExecutionRole
,也是下面連接的內聯政策:
policygen-lambda_basic_execution_and_kms_decrypt-201611131221
:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "sid-redacted",
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": [
"arn:aws:kms:us-east-1:account-redacted:key/key-id-redacted"
]
}
]
}
- 我已經編輯代碼中的任何標識信息。
我們遇到了同樣的問題,這真的很有幫助! AWS支持人員解釋了爲什麼公共VPC子網中的EC2實例能夠訪問KMS /其他服務,但Lambda函數不是? –
他們沒有具體解釋,但是基於我對Lambda函數如何實例化的理解,這是由於Lambda函數位於他們自己的VPC中的臨時容器中。 – zealoushacker
在圖中,互聯網網關被描繪爲在VPC子網中,這是非常的。 Internet網關與整個VPC相關聯,但不在任何給定的子網中。 –