1

从AWS SDK版本 1.11.700 切换到 1.11.908我们的库之一现在无法在受保护的环境中工作。更具体地说,新的 SDK 版本已更改ClientConfiguration,因此它现在通过检查环境变量来实例化 RetryPolicy。

不幸的是,我们将把这个库部署到一个禁止(SecurityManager in place)访问环境变量的环境中。这意味着我们所有依赖于AmazonHttpClient的代码不再可用,因为:

  • 为了实例化AmazonHttpClient你必须传入一个有效的ClientConfiguration(不接受空值)
  • 为了创建一个有效的ClientConfiguration,你需要能够读取 env vars

这是堆栈跟踪:

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getenv.AWS_RETRY_MODE")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.security.AccessController.checkPermission(AccessController.java:886)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at com.boomi.security.ExtendedSecurityManager.checkPermissionImpl(ExtendedSecurityManager.java:207)
    at com.boomi.security.ExtendedSecurityManager.checkPermission(ExtendedSecurityManager.java:114)
    at java.lang.System.getenv(System.java:894)
    at com.amazonaws.retry.internal.RetryModeResolver.envVar(RetryModeResolver.java:67)
    at com.amazonaws.retry.internal.RetryModeResolver.resolveRetryMode(RetryModeResolver.java:72)
    at com.amazonaws.retry.internal.RetryModeResolver.<init>(RetryModeResolver.java:46)
    at com.amazonaws.retry.RetryPolicy.<clinit>(RetryPolicy.java:35)
    at com.amazonaws.retry.PredefinedRetryPolicies.<clinit>(PredefinedRetryPolicies.java:30)
    at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:89)

我们提出的所有选项都不适用于这种情况:

  • 子类ClientConfiguration化以抑制异常:无法尝试捕获对 super() 构造函数的调用
  • ClientConfiguration是一个类,因此我们没有要实现的接口
  • java.policy无法修改以允许访问该属性:环境不在我们的控制范围内
  • 异常是从而不是从引发的,因此它甚至与单个对象无关......
4

1 回答 1

0

看起来 AmazonHttpClient 有一个 builder(),所以如果您在构建器上设置了 retryPolicy,ClientConfiguration 可能不会寻找 retryPolicy。

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/http/AmazonHttpClient.Builder.html

- - - - - - - - 另外的选择:

我们可以在官方 SDK 代码中看到 ClientConfiguration() 构造函数可以采用另一个 ClientConfiguration 因此使用扩展创建一个自定义的。

   public class ClientConfigurationByPassingSecurity extends ClientConfiguration{
    
        @Override
        public RetryPolicy getRetryPolicy(){
           return xx;
        }
    
   }

//创建您的 AmazonHttpClient 传递此自定义

ClientConfiguration customClientConfiguration = new ClientConfigurationByPassingSecurity ();

ClientConfiguration clientConfig = new ClientConfiguration(customClientConfiguration);


new AmazonHttpClient(clientConfig);

覆盖由于 getVars 而失败的任何方法。

于 2020-11-26T15:32:40.123 回答