Я хотел бы запустить 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)