首页 > 解决方案 > 如何使用 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());
        }

标签: amazon-web-servicesamazon-cloudwatch

解决方案


推荐阅读