0

我有一个 JAVA 8 AWS lambda 函数,它在容器第一次启动时有一些非常昂贵的设置。它必须调用以提取各种凭据/证书。我想缓存这个设置(其输出是一个 SSLContext 对象,用于调用另一个 api)。

我以前不必这样做,而我似乎找不到答案的问题是:

在 Lambda 容器处于活动状态时一遍又一遍地重用 SSLContext 对象是否存在任何问题?这可能是 15 分钟或 5 小时,或 2 天等。只要有流量通过它,它就会活着。

所有凭据都不会更改,并且 SSLContext 对象在所有调用之间都是相同的。

SSLContext 对象是否有 TTL?创建 SSLConext 的代码是相当样板的。在我完成昂贵的 pull 以获取 certs/cred 并且我想缓存此 SSLContext 对象后调用此方法:

public SSLContext getContext(){
        KeyStore clientStore = KeyStore.getInstance(KEY_INSTANCE);
        keyStoreInputstream = //GET STREAM
        clientStore.load(keyStoreInputstream, caCertCred.toCharArray());

        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(clientStore, KEY.toCharArray());
        KeyManager[] kms = kmf.getKeyManagers();

        trustStoreInputStream =  //GET STREAM
        KeyStore trustStore = KeyStore.getInstance(TRUST_INSTANCE);
        trustStore.load(trustStoreInputStream, caCertCred.toCharArray());

        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(trustStore);
        TrustManager[] tms = tmf.getTrustManagers();

        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(kms, tms, new SecureRandom());
        return sslContext;

}

4

1 回答 1

0

简短的回答:使用类级变量。

在 AWS Lambda 中,类级变量是“全局”变量。因此,如果您在handleRequest(...)方法之外声明一个变量,Lambda 容器将使用相同的值初始化该变量。当 lambda 函数再次执行时,您只需按原样重用变量即可。

这是它如何工作的示例:

public class LambdaExample implements RequestStreamHandler {

    private LambdaLogger logger;
    private SSLContext sslContext;

    @Override
    public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
        logger = context.getLogger();

        // do some work


        if(sslContext == null) {
            // this means SSLContext needs to be initialized - probably a new container
            initSslContext();
        } else {
            // this means SSLContext is already initialized - just use it as it is
        }

        // use SSLContext
    }

    private void initSslContext() {
        // note: you need to create the KeyStore, KeyManagerFactory
        //  and re-initialize the SSLContext here because it's null
    }
}

注意:
通常,全局变量有一些缺点,但我认为在你的情况下,它不会产生任何问题。您可以观看以下视频,以真正了解全局变量在 AWS Lambda 中的工作原理。
https://www.youtube.com/watch?v=-P7oB8NQpiI

于 2020-09-22T13:53:37.233 回答