Я пытаюсь подключиться к Amazon Kendra для запроса уже созданного источника данных, я получаю некоторую unmarshall ошибку из SDK - PullRequest
0 голосов
/ 10 июля 2020

Вот фрагмент кода:

String strIndexRole = "arn:aws:iam::<my acct no>:role/Kendra-CloudwatchRole";
AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard()
        .withCredentials(new DefaultAWSCredentialsProviderChain())
        .withEndpointConfiguration(new EndpointConfiguration("console.aws.amazon.com/kendra/home?region=us-east-1", "us-east-1"))
        .build();
AssumeRoleRequest roleRequest = new AssumeRoleRequest()
        .withRoleArn(strIndexRole).withDurationSeconds(7200);
AssumeRoleResult roleResponse = stsClient.assumeRole(roleRequest);

Это исключение:

15: 38: 30.301 [основная] DEBUG org. apache .http.impl.conn. PoolingHttpClientConnectionManager - Соединение выпущено: [id: 0] [маршрут: {s} -> https://console.aws.amazon.com: 443] [всего доступно: 1; выделено маршрутов: 1 из 50; всего выделено: 1 из 50] Исключение в потоке «main» com.amazon aws .SdkClientException: невозможно демаршалировать ответ (ParseError в [row, col]: [19,24] Сообщение: ссылка на «состояние» объекта должна заканчиваются разделителем ';'.). Код ответа: 200, текст ответа: OK at com.amazon aws .http.AmazonHttpClient $ RequestExecutor.handleResponse (AmazonHttpClient. java: 1750) at com.amazon aws .http.AmazonHttpClient $ RequestClecutor.eshandle . java: 1446) в com.amazon aws .http.AmazonHttpClient $ RequestExecutor.executeOneRequest (AmazonHttpClient. java: 1368) в com.amazon aws .http.AmazonHttpClient $ RequestExeClpercutor.exec 1017 *: 1145) на com.amazon aws .http.AmazonHttpClient $ RequestExecutor.doExecute (AmazonHttpClient. java: 802) на com.amazon aws .http.AmazonHttpClient $ RequestExecutor.executeWithTimer. : 770) на com.amazon aws .http.AmazonHttpClient $ RequestExecutor.execute (AmazonHttpClient. java: 744) на com.amazon aws .http.AmazonHttpClient $ RequestExecutor.access $ 500 (AmazonHttpClient. * AmazonHttpClient. * 704) на com.amazon aws .http.AmazonHttpClient $ RequestExecutionBuilderImpl.execute (AmazonHttpClient. java: 686) на com.amazon aws .http.AmazonHttpClien t.execute (AmazonHttpClient. java: 550) на com.amazon aws .http.AmazonHttpClient.execute (AmazonHttpClient. java: 530) в com.amazon aws .services.securitytoken.AWSSecurityTokenInServiceClient.do AWSSecurityTokenServiceClient. java: 1719) на com.amazon aws .services.securitytoken.AWSSecurityTokenServiceClient.invoke (AWSSecurityTokenServiceClient. java: 1686) в com.amazonTokenServiceClient. *1035*: 1686) в com.amazon aws. java: 1675) в com.amazon aws .services.securitytoken.AWSSecurityTokenServiceClient.executeAssumeRole (AWSSecurityTokenServiceClient. java: 589) в com.amazon aws .services.securitytoken.AWSSeviceToken (AWSSeviceToken *: 561) в com. aws .kendra.trial.SampleKendraTrial.main (SampleKendraTrial. java: 73) Вызвано: javax. xml .stream.XMLStreamException: ParseError в [row, col]: [19 , 24] Сообщение: Ссылка на объект "состояние" должна заканчиваться на ';' разделитель. в com.sun.org. apache .xerces.internal.impl.XMLStreamReaderImpl.next (XMLStreamReaderImpl. java: 604) в com.sun. xml .internal.stream.XMLEventReaderImpl.peek (XMLEventReaderImpl. java: 276) в com.amazon aws .transform.StaxUnmarshallerContext.nextEvent (StaxUnmarshallerContext. java: 220) в com.amazon aws .services.securitytoken.model.transform.AssumeRoleResultStaxunumellnmarshaller. *: 40) в com.amazon aws .services.securitytoken.model.transform.AssumeRoleResultStaxUnmarshaller.unmarshall (AssumeRoleResultStaxUnmarshaller. java: 28) в com.amazon aws .http.Stax.Response56. *: 106) в com.amazon aws .http.StaxResponseHandler.handle (StaxResponseHandler. java: 42) в com.amazon aws .http.response.AwsResponseHandlerAdapter.handle (AwsResponseHandlerAdapter.handle (AwsResponseHandler). at com.amazon aws .http.AmazonHttpClient $ RequestExecutor.handleResponse (AmazonHttpClient. java: 1726) ... еще 16

1 Ответ

0 голосов
/ 14 июля 2020

Я думаю, что отчасти ваша проблема заключается в том, как вы настраиваете AWSSecurityTokenService. На эту проблему также указывает следующая строка в трассировке стека исключений, которую вы опубликовали выше.

at com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient.assumeRole(AWSSecurityTokenServiceClient.java:561)

Пожалуйста, обратитесь к this о том, как принять на себя роль IAM, получить временные учетные данные и вызвать Служба AWS (здесь S3 - служба AWS, вызываемая с использованием временных учетных данных) в Java. Вы можете использовать ту же концепцию для вызова API Kendra. Из приведенного выше примера вы можете понять, как создать BasicSessionCredentials и использовать его для создания KendraClient (аналогично тому, как клиент AmazonS3 был построен с использованием AmazonS3ClientBuilder в приведенном выше примере). После того, как вы создали KendraClient, вы можете обратиться к этому примеру , чтобы узнать, как запросить свой индекс Kendra.

...