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 SDK を使用して、ここに配置するデータをどこで取得できますか?
  2. Java AWS SDK を使用して、ここに配置するデータをどこで取得できますか?
  3. Auto Scaling グループごとに確実に集計できるようにするには、他にどのようなデータを含める必要がありますか? (セキュリティグループごとに集計しても問題ありません)

#1 については、 http: //169.254.169.254/latest/meta-data/instance-idに対して通常の HTTP 呼び出しを行ってインスタンス ID を取得できることを確認しましたが、これをすべて実行したいと考えています。そのための方法があれば、AWS SDK を介して。

4

4 に答える 4

9

Amazonサポートチームに質問を投稿しました。

EC2のドキュメントには、InstanceType (質問 1)、InstanceId (質問 2)、セキュリティ グループ (質問 3) など、一連のメタデータを取得するために呼び出すことができる URL のリストが記載されています。

自動スケーリング グループは、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

javadoc にはありませんが、InstanceType (1) や InstanceId (2) などのメタデータ情報を提供するEC2MetadataUtilsという便利なユーティリティ クラスがあります。

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 SDK のバージョン 1.10.17 でこれと同じことを実装しようとすると、受け入れられた回答で @Tinclon によって提供されるソリューションは、自動スケーリング グループに対して null のみを返します。ただし、次のスニペットは、Auto Scaling グループを正しく返しました。

    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 に答える