All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.polyglotted.common.es.discovery.Ec2ServiceImpl Maven / Gradle / Ivy

package io.polyglotted.common.es.discovery;

import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.*;
import com.amazonaws.regions.Regions;
import com.amazonaws.retry.RetryPolicy;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2Client;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.common.Randomness;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.settings.SecureString;
import org.elasticsearch.common.settings.Settings;

import java.util.Random;

import static java.util.Objects.requireNonNull;

@Slf4j
final class Ec2ServiceImpl implements Ec2Service {

    static AmazonEC2 client(Settings settings) {
        Regions region = Regions.EU_WEST_1;
        if (REGION_SETTING.exists(settings) || CLOUD_EC2.REGION_SETTING.exists(settings)) {
            region = Regions.fromName(CLOUD_EC2.REGION_SETTING.get(settings));
        }
        return AmazonEC2Client.builder().withCredentials(buildCredentials(settings))
            .withClientConfiguration(buildConfiguration(settings)).withRegion(region).build();
    }

    private static AWSCredentialsProvider buildCredentials(Settings settings) {
        AWSCredentialsProvider credentials;
        try (SecureString key = DISCOVERY_EC2.ACCESS_KEY_SETTING.get(settings);
             SecureString secret = DISCOVERY_EC2.SECRET_KEY_SETTING.get(settings)) {
            if (key.length() == 0 && secret.length() == 0) {
                log.debug("Using either environment variables, system properties or instance profile credentials");
                credentials = new DefaultAWSCredentialsProviderChain();
            }
            else {
                log.debug("Using basic key/secret credentials");
                credentials = new AWSStaticCredentialsProvider(new BasicAWSCredentials(key.toString(), secret.toString()));
            }
        }
        return credentials;
    }

    private static ClientConfiguration buildConfiguration(Settings settings) {
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setResponseMetadataCacheSize(0);
        clientConfiguration.setProtocol(DISCOVERY_EC2.PROTOCOL_SETTING.get(settings));
        if (PROXY_HOST_SETTING.exists(settings) || DISCOVERY_EC2.PROXY_HOST_SETTING.exists(settings)) {
            String proxyHost = DISCOVERY_EC2.PROXY_HOST_SETTING.get(settings);
            Integer proxyPort = DISCOVERY_EC2.PROXY_PORT_SETTING.get(settings);
            try (SecureString proxyUsername = DISCOVERY_EC2.PROXY_USERNAME_SETTING.get(settings);
                 SecureString proxyPassword = DISCOVERY_EC2.PROXY_PASSWORD_SETTING.get(settings)) {
                clientConfiguration.withProxyHost(proxyHost).withProxyPort(proxyPort)
                    .withProxyUsername(proxyUsername.toString()).withProxyPassword(proxyPassword.toString());
            }
        }

        String awsSigner = CLOUD_EC2.SIGNER_SETTING.get(settings);
        if (Strings.hasText(awsSigner)) {
            log.debug("using AWS API signer [{}]", awsSigner);
            configureSigner(awsSigner, clientConfiguration);
        }

        final Random rand = Randomness.get();
        RetryPolicy retryPolicy = new RetryPolicy(RetryPolicy.RetryCondition.NO_RETRY_CONDITION,
            (originalRequest, exception, retriesAttempted) -> {
                log.warn("EC2 API request failed, retry again. Reason was:", exception);
                return 1000L * (long) (10d * Math.pow(2, retriesAttempted / 2.0d) * (1.0d + rand.nextDouble()));
            },
            10, false);
        clientConfiguration.setRetryPolicy(retryPolicy);
        clientConfiguration.setSocketTimeout((int) DISCOVERY_EC2.READ_TIMEOUT_SETTING.get(settings).millis());
        return clientConfiguration;
    }

    private static void configureSigner(String signer, ClientConfiguration configuration) {
        try {
            SignerFactory.getSignerByTypeAndService(requireNonNull(signer, "[null] signer set"), null);
        } catch (IllegalArgumentException e) {
            log.warn("wrong signer set {} {}", signer, e.getMessage());
        }
        configuration.setSignerOverride(signer);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy