Статьи

Spring Cloud AWS с настройками прокси

В моей предыдущей статье Spring и Amazon Web Services я кратко представил модуль Spring Cloud AWS и то, что вы, как разработчик, можете ожидать от него в данный момент. Одна вещь, которая не очевидна из официальной документации, — это как использовать этот модуль, когда ваше интернет-соединение ограничено прокси-сервером. В этой статье я расскажу, как подходить к передаче конфигурации прокси для конфигурации на основе Java и XML. Этот аспект конфигурации, вероятно, будет рассмотрен в будущих выпусках, однако он может помочь вам сейчас, если вы работаете с этим модулем и вам нужно, чтобы ваше приложение работало с прокси-сервером компании.

Настройка прокси Spring Cloud AWS

Конфигурация Java

Давайте начнем с еще более популярного способа настройки приложений Spring — настройки Java. В этом случае все относительно просто, поскольку вы можете сами указать необходимую конфигурацию прокси в коде. Рассмотрим следующий класс конфигурации, объявляющий две компоненты — конфигурацию клиента и прокси-сервера S3 (если эти параметры не разрешены в файлах свойств / свойствах, по умолчанию будет использоваться соединение без прокси-сервера).

Пример конфигурации клиента S3 из класса ApplicationConfiguration

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Configuration
@EnableContextInstanceData
public final class ApplicationConfiguration {
  
    @Value("${proxy.host}")
    private String proxyHost;
  
    @Value("${proxy.port}")
    private int proxyPort;
  
    @Value("${proxy.username}")
    private String proxyUsername;
  
    @Value("${proxy.password}")
    private String proxyPassword;
  
    @Bean
    public AmazonS3Client amazonS3Client() {
        return new AmazonS3Client(clientConfiguration());
    }
  
    @Bean
    public ClientConfiguration clientConfiguration() {
        final ClientConfiguration clientConfiguration = new ClientConfiguration();
  
        clientConfiguration.setProxyHost(proxyHost);
        clientConfiguration.setProxyPort(proxyPort);
        clientConfiguration.setProxyUsername(proxyUsername);
        clientConfiguration.setProxyPassword(proxyPassword);
  
        return clientConfiguration;
    }
}

Учитывая значение кода, подобного этому, рассмотрите возможность маркировки этого класса профилем, который используется для запуска приложения на компьютере разработчика, например, @Profile("local") .

Конфигурация XML

Когда речь идет о настройке прокси с использованием конфигурации XML, требуется определенная степень знаний о конфигурации Spring. Чтобы эта простая конфигурация работала, нам нужно создать экземпляр AmazonS3Client с настройками прокси, сохраненными в bean-компоненте конфигурации клиента. Следующий XML-файл показывает всю конфигурацию, поэтому давайте разберем ее на несколько разделов.

beans.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?xml version="1.0" encoding="UTF-8"?>
       xmlns:context="http://www.springframework.org/schema/context"
  
    <context:component-scan base-package="com.jakubstas.s3downloader"/>
  
    <!-- Bunch of simple configuration switches allowing access to instance metadata, integration of S3
         into ResourceLoader and region auto detection. Some of these are not essential for the example
         however it is always nice to have the information they provide at hand when needed. -->
    <aws-context:context-instance-data/>
    <aws-context:context-resource-loader/>
    <aws-context:context-region auto-detect="true"/>
  
    <!-- Configuration of Amazons credentials provider chain to allow execution on developers machine
         as well as in the Beanstalk environment. -->
    <aws-context:context-credentials>
        <aws-context:instance-profile-credentials/>
        <aws-context:simple-credentials access-key="#{systemProperties['AWS_ACCESS_KEY_ID']}" key="#{systemProperties['AWS_SECRET_KEY']}"/>
    </aws-context:context-credentials>
  
    <!-- Bean with client configuration with passed proxy settings (if these settings are not resolved
         from property files / properties default no-proxy connection will be used) -->
  
    <!-- The client instance created by hand with proxy configuration -->
    <bean id="amazonS3" class="com.amazonaws.services.s3.AmazonS3Client" autowire-candidate="true" autowire="constructor"/>
  
    <!-- Proxy configuration for any AWS related client code - currently used for S3 (but might as well be used for DynamoDB access, ...) -->
    <bean id="clientConfiguration" class="com.amazonaws.ClientConfiguration">
        <property name="proxyHost" value="${proxy.host}"/>
        <property name="proxyPort" value="${proxy.port}"/>
        <property name="proxyUsername" value="${proxy.username}"/>
        <property name="proxyPassword" value="${proxy.password}"/>
    </bean>
</beans>

Учитывая значение кода, подобного этому, рассмотрите возможность маркировки этих компонентов с помощью профиля, используемого для запуска приложения на компьютере разработчика, например profile="local" .

Выходя за пределы S3

Пример до сих пор был в значительной степени ограничен S3. Однако эту конфигурацию можно использовать, когда это применимо, в соответствии с тем, как был разработан Amazon SDK. Давайте посмотрим на пример клиента DynomoDB . Существует несколько клиентов для различных сервисов Amazon AWS, которые могут использовать подход, описанный выше.

Пример конфигурации клиента DynamoDB из класса ApplicationConfiguration

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@Configuration
@EnableContextInstanceData
public final class ApplicationConfiguration {
  
    @Value("${proxy.host}")
    private String proxyHost;
  
    @Value("${proxy.port}")
    private int proxyPort;
  
    @Value("${proxy.username}")
    private String proxyUsername;
  
    @Value("${proxy.password}")
    private String proxyPassword;
  
    @Bean
    public AmazonS3 amazonS3Client() {
        return new AmazonS3Client(clientConfiguration());
    }
  
    @Bean
    public AmazonDynamoDBClient amazonDynamoDBClient() {
        return new AmazonDynamoDBClient(clientConfiguration());
    }
  
    @Bean
    public ClientConfiguration clientConfiguration() {
        final ClientConfiguration clientConfiguration = new ClientConfiguration();
  
        clientConfiguration.setProxyHost(proxyHost);
        clientConfiguration.setProxyPort(proxyPort);
        clientConfiguration.setProxyUsername(proxyUsername);
        clientConfiguration.setProxyPassword(proxyPassword);
  
        return clientConfiguration;
    }
}

Вывод

Передача конфигурации приложения вашим компонентам является довольно стандартной задачей, которая не должна доставлять много хлопот опытному разработчику Spring. Однако, учитывая разный уровень опыта и трудности повседневной жизни разработчика, это может вызвать проблемы. Вот почему я рекомендую всем попробовать эти примеры самостоятельно, поскольку смоделированная здесь ситуация использует один из фундаментальных подходов к проектированию конфигурации Spring. Продолжайте практиковать и держите корпоративный прокси на расстоянии. 🙂

Ссылка: Spring Cloud AWS с настройками прокси от нашего партнера JCG Якуба Стаса в блоге