Неожиданный статус ответа: 401 при доступе к X-Amz-Target: Logs_20181106.GetLogEvents в AWS - PullRequest
0 голосов
/ 08 ноября 2018

Я хотел бы запустить API GetLogEvents и получить логи, используя код Java.Ниже приведен пример кода ссылки, который я использовал Пример кода ссылки

Во время выполнения я получаю следующий код ошибки org.apache.http.client.ClientProtocolException: Unexpected response status: 401

Ниже приведена подробная ссылка на API AWS: URL-адрес поста API GetLogEvents

Это данные, передаваемые в запросе на публикацию ( деталь была замаскирована ):

Канонический запрос:

POST
Action=Logs_20140328.GetLogEvents

host:logs.ap-south-1.amazonaws.com/
x-amz-date:20181108T084728Z

host;x-amz-date
XXXXXea1ebe988765z8e1f41c2d9983d96784aXXXXX

Строка для подписи:

AWS4-HMAC-SHA256 20181108T084728Z 20181108 / ap-south-1 / logs / aws4_request XXX5ui890cXXX7d2f6944726317ea21ccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0x0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Также*

Заголовок:

x-amz-date = 20181108T084728Z Авторизация = AWS4-HMAC-SHA256 Credential = accessKey / 20181108 / ap-south-1 / logs / aws4_request, SignedHeaders = host; x-amz-дата, подпись = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Это код, который я обновил в соответствии с моими потребностями:

public static void main(String[] args) throws UnsupportedEncodingException {

            String url = "https://ap-south-1.console.aws.amazon.com/cloudwatch/home";

            /**
             * Add host without http or https protocol.
             * You can also add other parameters based on your amazon service requirement.
             */

            TreeMap<String, String> awsHeaders = new TreeMap<String, String>();
            awsHeaders.put("host", "logs.ap-south-1.amazonaws.com/");


            String jsonDocument = "{\"logGroupName\": \"/XXX-api-env\", \"logStreamName\": \"i-XXXX263XXX\"}";

            HttpPost httpPost = new HttpPost(url);

            AWSV4Auth aWSV4Auth = new AWSV4Auth.Builder("Key", "secret_key")
                                               .regionName("ap-south-1")
                                               .serviceName("logs") //  use your service name
                                               .httpMethodName("POST") //GET, PUT, POST, DELETE, etc...
                                               .canonicalURI("Action=Logs_20140328.GetLogEvents") //end point
                                               .queryParametes(null) //query parameters if any
                                               .awsHeaders(awsHeaders) //aws header parameters
                                               .payload(jsonDocument) // payload if any
                                               .debug() // turn on the debug mode
                                               .build();


            /* Get header calculated for request */
            Map<String, String> header = aWSV4Auth.getHeaders();
            for (Map.Entry<String, String> entrySet : header.entrySet()) {
                String key = entrySet.getKey();
                String value = entrySet.getValue();

                httpPost.addHeader(key,value);
            }

            httpPostRequest(httpPost);
    }

     public static void httpPostRequest(HttpPost httpPost) {
        /* Create object of CloseableHttpClient */
        CloseableHttpClient httpClient = HttpClients.createDefault();

        /* Response handler for after request execution */
        ResponseHandler<String> responseHandler = new ResponseHandler<String>() {

            @Override
            public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
                /* Get status code */
                int status = response.getStatusLine().getStatusCode();
                if (status >= 200 && status < 300) {
                    /* Convert response to String */
                    HttpEntity entity = response.getEntity();
                    return entity != null ? EntityUtils.toString(entity) : null;
                } else {
                    throw new ClientProtocolException("Unexpected response status: " + status);
                }
            }
        };

        try {
            /* Execute URL and attach after execution response handler */
            String strResponse = httpClient.execute(httpPost, responseHandler);
            /* Print the response */
            System.out.println("Response: " + strResponse);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Примечание: вход в приложение настраивается с использованием доступа многофакторной аутентификации cода (Authy)

...