amazon-web-services - 如何使用 JSON 有效负载正确发出和签署 http 请求以查询 AWS cloudwatch 指标
问题描述
我正在尝试发出自己的 HTTP 请求以从 AWS API 查询 cloudwatch 指标。原因是因为我需要以 JSON 格式定义我的查询(类似于aws cloudwatch get-metric-data --cli-input-json <json_file_name>
工作方式)。根据这个链接,这应该是可能的。但是,我在正确制作和签署我的 HTTP 请求时遇到了一些麻烦。使用以下代码,我收到{"__type":"com.amazon.coral.service#UnknownOperationException"}
错误。响应中几乎没有信息可以帮助我进行故障排除。我签署我的请求错了吗?还是我缺少一些参数/标题?
String query = "{\n" +
" \"StartTime\": 1628589600,\n" +
" \"EndTime\": 1628590200,\n" +
" \"MetricDataQueries\": [\n" +
" {\n" +
" \"Id\": \"mymetric1\",\n" +
" \"Label\": \"counter\",\n" +
" \"MetricStat\": {\n" +
" \"Metric\": {\n" +
" \"Namespace\": \"AWS/EC2\",\n" +
" \"MetricName\": \"CPUUtilization\",\n" +
" \"Dimensions\": [\n" +
" {\n" +
" \"Name\": \"InstanceId\",\n" +
" \"Value\": \"my_instance_id\"\n" +
" }\n" +
" ]\n" +
" },\n" +
" \"Period\": 60,\n" +
" \"Stat\": \"Average\",\n" +
" \"Unit\": \"Percent\"\n" +
" }\n" +
" }\n" +
" ]\n" +
"}";
ProfileCredentialsProvider credProvider = ProfileCredentialsProvider.builder()
.profileName("my_profile").build();
Aws4PresignerParams params = Aws4PresignerParams.builder()
.doubleUrlEncode(true)
.awsCredentials(credProvider.resolveCredentials())
.signingName("monitoring")
.signingRegion(Region.US_EAST_1)
.timeOffset(0)
.build();
SdkHttpFullRequest requestToSign = SdkHttpFullRequest.builder()
.method(SdkHttpMethod.POST)
.protocol("https")
.host("monitoring.us-east-1.amazonaws.com")
.appendRawQueryParameter("Action", "GetMetricData")
.appendRawQueryParameter("Version", "2010-08-01")
.appendRawQueryParameter("StartTime", "1628589600")
.appendRawQueryParameter("EndTime", "1628590200")
.appendRawQueryParameter("MetricDataQueries.member.N", "1")
.contentStreamProvider(() -> new ByteArrayInputStream(query.getBytes(StandardCharsets.UTF_8)))
.build();
SdkHttpFullRequest signedRequest = AwsS3V4Signer.create().presign(requestToSign, params);
URL url = signedRequest.getUri().toURL();
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(query.getBytes(StandardCharsets.UTF_8), MediaType.parse("application/x-amz-json-1.0"));
Request r = new Request.Builder()
.url(url)
.post(requestBody)
.build();
try (Response response = client.newCall(r).execute()) {
System.out.println(response.body().string());
}
解决方案
推荐阅读
- laravel - 为什么我使用 Laravel 和 Docker 得到“在您的集群中找不到活动节点”?
- javascript - 程序在 jumpsearch 中无限运行
- reactjs - 路由在除 / 之外的所有路由上的 apache 服务器上返回 404
- php - 显示类别编号(或列号)
- bash - 如何在菜单中选择多个文件并使用 ksh/bash 将其传递给子菜单
- selenium - Selenium 无法通过 docker-compose run 访问 docker 容器
- ios - 消息线程`MessageKit`swift的左对齐
- bash - 通过 ssh 从 bash 文件将文本输入到 docker 容器中
- hibernate - JPA / Hibernate 实体响应缺少一列
- flutter - 如何在颤动中多次推送和弹出单个页面?