Search code examples
javaamazon-web-servicesamazon-ec2aws-java-sdk

Using AWS Java's SDKs, how can I terminate the CloudFormation stack of the current instance?


Uses on-line decomentation I come up with the following code to terminate the current EC2 Instance:

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");
    }
}

My issue is that my EC2 instance is under an AutoScalingGroup which is under a CloudFormationStack, that is because of my organisation deployment standards though this single EC2 is all there is there for this feature.

So, I want to terminate the entire CloudFormationStack from the JavaSDK, keep in mind, I don't have the CloudFormation Stack Name in advance as I didn't have the EC2 Instance Id so I will have to get it from the code using the API calls.
How can I do that, if I can do it?


Solution

  • At the end I've achieved the desired behaviour using the set of the following util functions I wrote:

    /**
     * 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