-1

現在の EC2 インスタンスを終了するために、次のコードを考え出しました。

public class Ec2Utility {

    static private final String LOCAL_META_DATA_ENDPOINT = "http://169.254.169.254/latest/meta-data/";
    static private final String LOCAL_INSTANCE_ID_SERVICE = "instance-id";

    static public void terminateMe() throws Exception {
        TerminateInstancesRequest terminateRequest = new TerminateInstancesRequest().withInstanceIds(getInstanceId());
        AmazonEC2 ec2 = new AmazonEC2Client();
        ec2.terminateInstances(terminateRequest);
    }

    static public String getInstanceId() throws Exception {
        //SimpleRestClient, is an internal wrapper on http client.
        SimpleRestClient client = new SimpleRestClient(LOCAL_META_DATA_ENDPOINT);
        HttpResponse response = client.makeRequest(METHOD.GET, LOCAL_INSTANCE_ID_SERVICE);
        return IOUtils.toString(response.getEntity().getContent(), "UTF-8");
    }
}

私の問題は、EC2 インスタンスが CloudFormationStack の下にある AutoScalingGroup の下にあることです。これは、この単一の EC2 がこの機能のために存在するすべてですが、私の組織の展開基準のためです。

したがって、JavaSDK から CloudFormationStack 全体を終了したいのですが、EC2 インスタンス ID を持っていなかったため、事前に CloudFormation スタック名を持っていないことに注意してください。 API 呼び出し。
できるとしたら、どうすればいいですか?

4

2 に答える 2

0

最後に、私が書いた次のユーティリティ関数のセットを使用して、目的の動作を実現しました。

/**
 * Delete the CloudFormationStack with the given name.
 * 
 * @param stackName
 * @throws Exception
 */
static public void deleteCloudFormationStack(String stackName) throws Exception {
    AmazonCloudFormationClient client = new AmazonCloudFormationClient();
    DeleteStackRequest deleteStackRequest = new DeleteStackRequest().withStackName("");
    client.deleteStack(deleteStackRequest);
}

static public String getCloudFormationStackName() throws Exception {
    AmazonEC2 ec2 = new AmazonEC2Client();
    String instanceId = getInstanceId();
    List<Tag> tags = getEc2Tags(ec2, instanceId);
    for (Tag t : tags) {
        if (t.getKey().equalsIgnoreCase(TAG_KEY_STACK_NAME)) {
            return t.getValue();
        }
    }
    throw new Exception("Couldn't find stack name for instanceId:" + instanceId);
}

static private List<Tag> getEc2Tags(AmazonEC2 ec2, String instanceId) throws Exception {
    DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest().withInstanceIds(instanceId);
    DescribeInstancesResult describeInstances = ec2.describeInstances(describeInstancesRequest);
    List<Reservation> reservations = describeInstances.getReservations();
    if (reservations.isEmpty()) {
        throw new Exception("DescribeInstances didn't returned reservation for instanceId:" + instanceId);
    }
    List<Instance> instances = reservations.get(0).getInstances();
    if (instances.isEmpty()) {
        throw new Exception("DescribeInstances didn't returned instance for instanceId:" + instanceId);
    }
    return instances.get(0).getTags();
}

// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Example of usage from the code:
deleteCloudFormationStack(getCloudFormationStackName());
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
于 2016-07-19T12:36:13.170 に答える