EC2インスタンス自身に設定されたタグを取得する

EC2インスタンスから「http://169.254.169.254/latest/meta-data/」にアクセスすることで
呼び出し元インスタンスのメタ情報が取得出来ますが(参考)

aws-java-sdkに見当たらなかったので自分で作ってみた。

package jp.yustam.aws.ec2.util;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.io.IOUtils;

import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.DescribeTagsRequest;
import com.amazonaws.services.ec2.model.DescribeTagsResult;
import com.amazonaws.services.ec2.model.Filter;
import com.amazonaws.services.ec2.model.TagDescription;

public class EC2Metadata {

    private static final String METADATA_URL = "http://169.254.169.254/latest/meta-data/";

    public List<TagDescription> getTags(AmazonEC2Client client) throws IOException {
        List<Filter> filters = new ArrayList<Filter>();
        String instanceId = readResource("instance-id");
        filters.add(new Filter("resource-id", Arrays.asList(instanceId)));
        DescribeTagsResult tags = client.describeTags(new DescribeTagsRequest(filters));
        return tags.getTags();
    }

    private String readResource(String resourcePath) throws IOException {
        URL url = new URL(METADATA_URL + resourcePath);

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setConnectTimeout(1000 * 2);
        connection.setRequestMethod("GET");
        connection.setDoOutput(true);
        connection.connect();

        InputStream response = connection.getInputStream();
        String resource = IOUtils.toString(response);
        IOUtils.closeQuietly(response);
        return resource;
    }
}

実行してみる

List<TagDescription> tags = new EC2Metadata().getTags(ec2client);
for (TagDescription tag : tags) {
    System.out.println("[TAG]\t" + tag.getKey() + "\t" + tag.getValue());
}

結果

[TAG]   Name    WebServer001
[TAG]   Config  CustomTagTest
[TAG]   aws:autoscaling:groupName       as-group-001

これを使えばEC2タグの設定によって動作を変えることができる。