9

我正在尝试使用 Java SDK 设置一些自定义 AWS CloudWatch 指标。

我似乎在描述如何获取某些数据的文档中找不到任何内容,也找不到我需要包含哪些数据。

MetricDatum datum = new MetricDatum()
    .withDimensions(
        new Dimension()
            .withName("InstanceType").withValue(/* 1 */),
        new Dimension()
            .withName("InstanceId").withValue(/* 2 */)
        /* 3 */
    .withMetricName("My metric").withTimestamp(new Date())
    .withUnit("Percent").withValue(new Double(55.0));

所以,问题(对于上面代码中的每个注释数字):

  1. 使用 Java AWS 开发工具包,我从哪里获取要放在此处的数据?
  2. 使用 Java AWS 开发工具包,我从哪里获取要放在此处的数据?
  3. 为了确保我可以通过自动缩放组进行聚合,我还需要包含哪些其他数据?(按安全组聚合也可以)

对于#1,我已经看到我可以对http://169.254.169.254/latest/meta-data/instance-id进行常规 HTTP 调用以获取实例 ID,但我希望能做到这一切通过 AWS 开发工具包(如果有可用的方法)。

4

4 回答 4

9

我将问题发布给了亚马逊支持团队。

EC2 文档提供了一个 URL 列表,可以调用这些URL 来获取一堆元数据,包括 InstanceType(问题 1)、InstanceId(问题 2)和安全组(问题 3)。

可以使用AWS SDK for Java获取自动扩展组,方法是获取所有自动扩展组的列表,然后遍历该列表,直到找到具有您自己的 instanceId 的实例(使用列出的 URL 检索多于):

String instanceId = "Your-InstanceId";
AmazonAutoScalingClient amazonAutoScalingClient = new AmazonAutoScalingClient(new BasicAWSCredentials(accessKey, secretKey));
DescribeAutoScalingGroupsResult describeAutoScalingGroupsResult = amazonAutoScalingClient.describeAutoScalingGroups();
for(AutoScalingGroup autoScalingGroup : describeAutoScalingGroupsResult.getAutoScalingGroups()) {
    for(Instance instance : autoScalingGroup.getInstances()) {
        if(instance.getInstanceId().equals(instanceId)) {
            return autoScalingGroup.getAutoScalingGroupName();
        }
    }
}
于 2012-04-04T16:58:16.980 回答
2

它不在 javadocs 中,但有一个名为EC2MetadataUtils的方便实用程序类,它会为您提供元数据信息,例如 InstanceType (1) 和 InstanceId (2)。

就获得 ASG 名称而言,AWS记录

当您在 Auto Scaling 组中启动实例时,Auto Scaling 会向实例添加一个标签,其键为 aws:autoscaling:groupName,值为 Auto Scaling 组的名称

因此,您只需获取实例的标签即可节省一点循环

String instanceId = EC2MetadataUtils.getInstanceId();

String asgName = null;
List<TagDescription> tagDescriptions = new AmazonEC2Client().describeTags(
        new DescribeTagsRequest().withFilters(
            new Filter().withName("resource-id").withValues(instanceId)
        )
).getTags();
for (TagDescription tagDescription : tagDescriptions) {
    if ("aws:autoscaling:groupName".equals(tagDescription.getKey())) {
        asgName = tagDescription.getValue();
        break;
    }
}

您将用于确保可以按 Auto Scaling 组名称聚合的维度名称是AutoScalingGroupName(3)

new Dimension().withName("AutoScalingGroupName").withValue(asgName)
于 2015-04-21T17:50:08.743 回答
0

尝试使用 AWS Java 开发工具包 1.10.17 版实现同样的事情,@Tinclon 在接受的答案中提供的解决方案只为自动缩放组返回 null。但是,以下代码段确实为我正确返回了自动缩放组。

    String getAutoscalingGroup(final String instanceId) {
    final DescribeAutoScalingInstancesRequest describeRequest = new DescribeAutoScalingInstancesRequest().withInstanceIds(Collections.singleton(instanceId));
    final DescribeAutoScalingInstancesResult result = autoScalingClient.describeAutoScalingInstances(describeRequest);

    for (AutoScalingInstanceDetails details : result.getAutoScalingInstances()) {
        if (StringUtils.equals(instanceId, details.getInstanceId())) {
            return details.getAutoScalingGroupName();
        }
    }

    return null;
}

我没有尝试使用其他版本的 SDK,但该功能与(截至今天)最新版本的 AWS 命令​​行客户端中的功能等效

于 2015-09-14T10:59:58.440 回答
-1

您可以按图像 id 聚合:

curl http://169.254.169.254/latest/meta-data/ami-id

通常,自动缩放组在专用图像上运行,因此这种方法应该有效。

于 2014-02-27T08:59:09.553 回答