当使用 AWS 提供的 lambda 层通过扩展在本地主机上缓存机密时,在高吞吐量下,我注意到从本地主机获取缓存机密的请求偶尔会挂起,因此 lambda 间歇性超时(99.5% 成功,0.5% 错误)我)
获取秘密的非常标准的代码(在nodeJs中):
const getAWSCachedSecretsMgrSecret = async secretName => {
try {
const { AWS_SESSION_TOKEN } = process.env;
const headers = { 'X-Aws-Parameters-Secrets-Token': AWS_SESSION_TOKEN };
const SECRETS_EXTENSION_HTTP_PORT = 2773;
const secretsExtensionEndpoint = `http://localhost:${SECRETS_EXTENSION_HTTP_PORT}/secretsmanager/get?secretId=${secretName}`;
const response = await fetch(secretsExtensionEndpoint, {
method: 'GET',
headers
});
if (!response.ok) throw new Error(`Error in getAWSCachedSecretsMgrSecret! status: ${response?.status}. Text: ${JSON.stringify(response?.text())}`);
const data = await response.json();
const parsed = JSON.parse(data.SecretString);
return parsed;
} catch (error) {
console.log(`error in getAWSCachedSecretsMgrSecret => ${error}`);
throw error;
}
};
module.exports = getAWSCachedSecretsMgrSecret;
在高吞吐量时,我注意到从本地主机获取缓存秘密的请求只是挂起,因此 lambda 偶尔会超时(99.5% 成功,对我来说 0.5% 错误)
这花了一些时间来理解(答案似乎不在我可以看到的堆栈溢出上)我的工作解决方案如下..
我的快速解决方案是在 lambda 上设置一个环境变量:
PARAMETERS_SECRETS_EXTENSION_MAX_CONNECTIONS: 200 # or whatever you need, maybe 20 is fine for you
默认值(如果你不设置它,我相信最多 3 个到本地主机的连接)。
有更优雅的解决方案来手动管理连接并发性(即强制重复使用连接并确保最多 3 个),但是将 PARAMETERS_SECRETS_EXTENSION_MAX_CONNECTIONS 设置为更高的值将显示这是否是您的问题,如果您也遇到间歇性挂起/层超时.
好机会!