使用AWS Java';s SDK,如何终止当前实例的CloudFormation堆栈?
使用在线解除我提出了以下代码来终止当前EC2实例:使用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
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
,标记列表应该列出云形成堆栈的名称