2016-07-18 17 views
-1

Verwendet on-line decomentation ich mit dem folgenden Code kommen die aktuelle EC2 Instanz zu beenden:Wie kann ich mit den SDKs von AWS Java den CloudFormation-Stack der aktuellen Instanz beenden?

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

Mein Problem, dass meine EC2-Instanz eine AutoScalingGroup ist, unter denen ein CloudFormationStack ist unter, wegen meines also ist Organisationsbereitstellungsstandards, obwohl diese einzige EC2 alles ist, was es für diese Funktion gibt.

Also, ich möchte den gesamten CloudFormationStack von der JavaSDK beenden, bedenken Sie, ich habe nicht den CloudFormation Stack Name im Voraus, da ich nicht die EC2 Instance Id hatte, so dass ich es bekommen muss der Code, der die API-Aufrufe verwendet.
Wie kann ich das tun, wenn ich es kann?

Antwort

0

Am Ende habe ich das gewünschte Verhalten unter Verwendung des Satzes der folgenden util Funktionen erreicht schrieb ich:

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

Sie sollten die deleteStack Methode von Wolkenbildung sdk

DeleteStackRequest request = new DeleteStackRequest(); 
request.setStackName(<stack_name_to_be_deleted>); 

AmazonCloudFormationClient client = new AmazonCloudFormationClient (<credentials>); 
client.deleteStack(request); 

verwenden, wenn Sie den Stapel Namen nicht haben, sollten Sie in der Lage sein, vom Tag Ihrer Instanz abzurufen

DescribeInstancesRequest request =new DescribeInstancesRequest(); 
request.setInstanceIds(instancesList); 
DescribeInstancesResult disresult = ec2.describeInstances(request); 
List <Reservation> list = disresult.getReservations(); 

for (Reservation res:list){ 
    List <Instance> instancelist = res.getInstances(); 

    for (Instance instance:instancelist){ 

     List <Tag> tags = instance.getTags(); 
     for (Tag tag:tags){ 
      if (tag.getKey().equals("aws:cloudformation:stack-name")) { 
       tag.getValue(); // name of the stack 
      } 
     } 
+0

Ich denke, ich war nicht klar in der Frage (ich werde es in einer Sekunde bearbeiten). Ich habe den StackName nicht im Voraus. Um den EC2 zu löschen, könnte ich die Instanz-ID aus dem Code erhalten. Gibt es eine Möglichkeit, den entsprechenden StackName-Code zu erhalten? –

+1

Wenn Sie 'describeInstances' auf Ihrer ec2-Instanz ausführen, sollte die Tag-Liste normalerweise den Namen des Wolkenbildungsstapels enthalten –