public AppCredentials getAppCredentials(String keyName, String secretName) throws IOException {
    String key;
    String secret;
    try {
      key = keys.get(keyName);
    } catch (ExecutionException e) {
      throw new IOException("Couldn't lookup key: " + keyName, e);
    }

    try {
      secret = secrets.get(secretName);
    } catch (ExecutionException e) {
      throw new IOException("Couldn't lookup secret: " + secretName, e);
    }

    return new AppCredentials(key, secret);
  }
Store keys and secrets in a cache so we can reduce load on cloud storage / KMS when reading
keys and reading/decrypting secrets several times on startup.

<p>Set the cache to reload keys/secrets periodically so that in the event of a key/secret being
compromised, we can update them without restarting our servers.
extensions/cloud/portability-cloud-google/src/main/java/org/datatransferproject/cloud/google/GoogleAppCredentialStore.java