Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用AWS Java';s SDK,如何终止当前实例的CloudFormation堆栈?_Java_Amazon Web Services_Amazon Ec2_Aws Java Sdk - Fatal编程技术网

使用AWS Java';s SDK,如何终止当前实例的CloudFormation堆栈?

使用AWS Java';s SDK,如何终止当前实例的CloudFormation堆栈?,java,amazon-web-services,amazon-ec2,aws-java-sdk,Java,Amazon Web Services,Amazon Ec2,Aws Java Sdk,使用在线解除我提出了以下代码来终止当前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

使用在线解除我提出了以下代码来终止当前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实例位于一个AutoScalingGroup之下,该组位于CloudFormationStack之下,这是因为我的组织部署标准,尽管这个EC2就是这个特性的全部

因此,我想从JavaSDK中终止整个CloudFormationStack,请记住,我事先没有CloudFormation堆栈名称,因为我没有EC2实例Id,所以我必须使用API调用从代码中获取它。

如果我能做到,我该怎么做?

您应该能够使用cloud formation sdk中的方法

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

AmazonCloudFormationClient client = new AmazonCloudFormationClient (<credentials>);
client.deleteStack(request);
DeleteStackRequest=new DeleteStackRequest();
request.setStackName();
AmazonCloudFormationClient=新的AmazonCloudFormationClient();
client.deleteStack(请求);
如果没有堆栈名称,则应该能够从实例的标记中检索

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
            }
        }
DescribeInstancesRequest请求=新的DescribeInstancesRequest();
request.setInstanceId(InstanceList);
descripbeinstancesresult disresult=ec2.descripbeinstances(请求);
List=disresult.getReservations();
用于(预订资源:列表){
List instancelist=res.getInstances();
例如(实例:instancelist){
List tags=instance.getTags();
用于(标记:标记){
if(tag.getKey().equals(“aws:cloudformation:stack name”)){
tag.getValue();//堆栈的名称
}
}

最后,我使用我编写的以下一组util函数实现了所需的行为:

/**
 * 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
/**
*删除具有给定名称的CloudFormationStack。
* 
*@param stackName
*@抛出异常
*/
静态公共void deleteCloudFormationStack(字符串stackName)引发异常{
AmazonCloudFormationClient=新的AmazonCloudFormationClient();
DeleteStackRequest DeleteStackRequest=新的DeleteStackRequest()。带StackName(“”);
client.deleteStack(deleteStackRequest);
}
静态公共字符串GetCloudFormationsStackName()引发异常{
AmazonEC2 ec2=新的AmazonEC2Client();
字符串instanceId=getInstanceId();
列表标记=getEc2Tags(ec2,instanceId);
用于(标记t:标记){
if(t.getKey().equalsIgnoreCase(标记\键\堆栈\名称)){
返回t.getValue();
}
}
抛出新异常(“找不到instanceId的堆栈名称:“+instanceId”);
}
静态私有列表getEc2Tags(amazonec2ec2,字符串instanceId)引发异常{
DescribeInstanceRequest DescribeInstancesRequest=新的DescribeInstancesRequest(),带有instanceId(instanceId);
DescribeInstancesResult describeInstances=ec2.describeInstances(describeInstancesRequest);
List reservations=descripbeinstances.getReservations();
if(reservations.isEmpty()){
抛出新异常(“DescribeInstances未返回instanceId的保留:“+instanceId”);
}
List instances=reservations.get(0.getInstances();
if(instances.isEmpty()){
抛出新异常(“DescribeInstances没有返回instanceId的实例:“+instanceId”);
}
返回instances.get(0.getTags();
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//代码中的用法示例:
deleteCloudFormationStack(getCloudFormationStackName());
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我想我的问题不清楚(我会马上编辑)。我事先没有StackName。为了删除EC2,我可以从代码中获取实例id。是否有方法从代码中获取相关StackName?通常,如果在EC2实例上运行
describeInstances
,标记列表应该列出云形成堆栈的名称