AWS CloudWatch returns InvalidNextToken

AWS CloudWatch returns InvalidNextToken

我正在尝试使用 .NET SDK 获取一些 CloudWatch 指标。下面看到的代码 returns 一些数据点,但在返回大约 20 个数据点后,它引发了 InvalidNextToken 异常。

private static void Main(string[] args)
    {
        Console.Clear();

        var creds = new StoredProfileAWSCredentials();
        var c = new AmazonCloudWatchClient(creds, RegionEndpoint.EUCentral1);

        Task<GetMetricDataResponse> t = null;

        string nextToken = null;
        do
        {
            var req = new GetMetricDataRequest
            {
                EndTimeUtc = DateTime.UtcNow,
                MaxDatapoints = 10,
                StartTimeUtc = DateTime.UtcNow.AddHours(-1),
                ScanBy = new ScanBy("TimestampDescending"),
                NextToken = nextToken,
                MetricDataQueries = new List<MetricDataQuery>
                {
                    new MetricDataQuery
                    {
                        Id = "a" + Guid.NewGuid().ToString().Replace("-", ""),

                        MetricStat = new MetricStat
                        {
                            Stat = "Maximum",
                            Metric = new Metric
                            {
                                MetricName = "CPUUtilization",

                                Dimensions = new List<Dimension>
                                {
                                    new Dimension
                                    {
                                        Name = "InstanceId",
                                        Value = "i-04f27d16c91c70119"
                                    }
                                },
                                Namespace = "AWS/EC2"
                            },
                            Period = 60,

                            Unit = StandardUnit.Percent
                        }
                    }
                }
            };
            t = c.GetMetricDataAsync(req);

            t.Wait();
            var usage = t.Result;
            if (usage.MetricDataResults.Any())
                foreach (var r in usage.MetricDataResults)
                foreach (var rValue in r.Values)
                    Console.WriteLine(Math.Round(rValue * 100));


            nextToken = t.Result.NextToken;
        } while (!string.IsNullOrEmpty(nextToken));


        Console.ReadKey();
    } 

确切的异常信息是:

InvalidNextTokenException: The service returned an error with Error Code InvalidNextToken and HTTP Body: Sender InvalidNextToken 795050a1-3bcd-4a44-9794-5becd0c4f5cf

为了 nextToken 工作,您需要发送完全相同的请求,只是令牌在调用之间发生变化。

您有 idStartTimeUtcEndTimeUtc 请求之间的变化。 在循环之前初始化它们应该可以解决您的问题。

尝试这样的事情:

private static void Main(string[] args)
    {
        Console.Clear();

        var creds = new StoredProfileAWSCredentials();
        var c = new AmazonCloudWatchClient(creds, RegionEndpoint.EUCentral1);

        Task<GetMetricDataResponse> t = null;

        string nextToken = null;


        var endTime = DateTime.UtcNow;
        var startTime = endTime.AddHours(-1);
        var id = "a" + Guid.NewGuid().ToString().Replace("-", "");

        do
        {
            var req = new GetMetricDataRequest
            {
                EndTimeUtc = endTime,
                MaxDatapoints = 10,
                StartTimeUtc = startTime,
                ScanBy = new ScanBy("TimestampDescending"),
                NextToken = nextToken,
                MetricDataQueries = new List<MetricDataQuery>
                {
                    new MetricDataQuery
                    {
                        Id = id,

                        MetricStat = new MetricStat
                        {
                            Stat = "Maximum",
                            Metric = new Metric
                            {
                                MetricName = "CPUUtilization",

                                Dimensions = new List<Dimension>
                                {
                                    new Dimension
                                    {
                                        Name = "InstanceId",
                                        Value = "i-04f27d16c91c70119"
                                    }
                                },
                                Namespace = "AWS/EC2"
                            },
                            Period = 60,

                            Unit = StandardUnit.Percent
                        }
                    }
                }
            };
            t = c.GetMetricDataAsync(req);

            t.Wait();
            var usage = t.Result;
            if (usage.MetricDataResults.Any())
                foreach (var r in usage.MetricDataResults)
                foreach (var rValue in r.Values)
                    Console.WriteLine(Math.Round(rValue * 100));


            nextToken = t.Result.NextToken;
        } while (!string.IsNullOrEmpty(nextToken));


        Console.ReadKey();
    }