java.lang.IllegalArgumentException: имя хоста не может быть пустым при попытке получить токен аутентификации AWS ECR - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь получить токен авторизации ECR от AWS, используя aws-java-sdk версии 1.11.339.Для этого я создал класс, как показано ниже:

public class ECRTokenGetter {
    private static final Logger LOGGER = LoggerFactory.getLogger(ECRTokenGetter.class);
    private static final int SINGLE_ELEMENT_INDEX = 0;


    public static String getEcrAuthorisationToken(Credentials creds, String awsRegion, String registryId) {
        LOGGER.debug("Obtaining temporary authorisation credentials from AWS ECR");

        AmazonECR ecrClient = AmazonECRClientBuilder.standard()
                .withRegion(awsRegion)
                .withCredentials(new AWSStaticCredentialsProvider(new BasicSessionCredentials(
                        creds.getAccessKeyId(),
                        creds.getSecretAccessKey(),
                        creds.getSessionToken())))
                .build();
        return ecrClient.getAuthorizationToken(new GetAuthorizationTokenRequest()
                        .withRegistryIds(registryId))
                .getAuthorizationData().get(SINGLE_ELEMENT_INDEX)
                .getAuthorizationToken();
    }
}

К сожалению, при выполнении кода я получаю следующее исключение:

Exception in thread "main" java.lang.IllegalArgumentException: hostname cannot be null
    at com.amazonaws.util.AwsHostNameUtils.parseRegion(AwsHostNameUtils.java:79)
    at com.amazonaws.util.AwsHostNameUtils.parseRegionName(AwsHostNameUtils.java:59)
    at com.amazonaws.auth.internal.AWS4SignerRequestParams.resolveRegion(AWS4SignerRequestParams.java:121)
    at com.amazonaws.auth.internal.AWS4SignerRequestParams.<init>(AWS4SignerRequestParams.java:103)
    at com.amazonaws.auth.AWS4Signer.sign(AWS4Signer.java:225)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1212)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1058)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513)
    at com.amazonaws.services.ecr.AmazonECRClient.doInvoke(AmazonECRClient.java:1742)
    at com.amazonaws.services.ecr.AmazonECRClient.invoke(AmazonECRClient.java:1718)
    at com.amazonaws.services.ecr.AmazonECRClient.executeGetAuthorizationToken(AmazonECRClient.java:992)
    at com.amazonaws.services.ecr.AmazonECRClient.getAuthorizationToken(AmazonECRClient.java:966)
    at com.mycode.utils.ecr.aws.ECRTokenGetter.getEcrAuthorisationToken(ECRTokenGetter.java:27)
    at com.mycode.utils.ecr.AWSAuthTester.main(AWSAuthTester.java:32)

Я также могу наблюдать за созданным объектом запросаby AWS SDK имеет узел входа NULL в точке входа, как видно на рисунке ниже.

Объект DefaultRequest

enter image description here

Какя могу преодолеть эту проблему?

Ответы [ 3 ]

0 голосов
/ 12 апреля 2019

Я только что столкнулся с той же проблемой.

Проблема в том, что в URL есть подчеркивание (_).

В классе AmazonWebServiceClient есть метод с именем computeSignerByURI, который в используемой мной версии является кодом:

private Signer computeSignerByURI(URI uri, String signerRegionOverride, boolean isRegionIdAsSignerParam) {
    if (uri == null) {
        throw new IllegalArgumentException("Endpoint is not set. Use setEndpoint to set an endpoint before performing any request.");
    }
    String service = getServiceNameIntern();
    String region = AwsHostNameUtils.parseRegionName(uri.getHost(), getEndpointPrefix());
    return computeSignerByServiceRegion(service, region, signerRegionOverride, isRegionIdAsSignerParam);
}

Как видите, естьвызов метода .getHost() в URI, который при вычислении не принимает подчеркивания, поэтому возвращает null. Здесь Вы можете проверить это.

0 голосов
/ 19 мая 2019

Значения перечисления Регионы должны быть преобразованы в строки с помощью метода getName () .В противном случае метод enum name () или toString () возвращает значение в виде текста (с заглавными буквами и подчеркиванием):

//Wrong conversion to a String
System.out.println(Regions.US_EAST_1);                     // result: US_EAST_1
System.out.println(String.format("%s",Regions.US_EAST_1)); // result: US_EAST_1
System.out.println(Regions.US_EAST_1.toString());          // result: US_EAST_1
System.out.println(Regions.US_EAST_1.name());              // result: US_EAST_1

//Correct conversion to a String
System.out.println(Regions.US_EAST_1.getName());           // result: us-east-1

enter image description here

В результате - URL, определенный для запроса, недействителен:

enter image description here

0 голосов
/ 06 июня 2018

Похоже, что проблема заключена в строке, переданной параметру awsRegion .В следующем коде

AmazonECR ecrClient = AmazonECRClientBuilder.standard()
            .withRegion(awsRegion)
            ...

, если awsRegion является строкой, он должен использовать тире в качестве разделителей, например, "us-west-2", в противном случае он должен использовать перечисление Regions, например Regions.US_WEST_2.

Альтернативное решение предполагает использование сEndpointConfiguration вместо сRegion , например

String ecrEndpoint = "ecr.%s.amazonaws.com";
AmazonECR ecrClient = AmazonECRClientBuilder.standard()
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(String.format(ecrEndpoint, awsRegion), awsRegion))
            ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...