在给定堆栈名称的情况下,使用AWS Java SDK检查堆栈是否存在的最佳方法是什么?
尝试了以下代码 DescribeStacksRequest wait = new DescribeStacksRequest();
wait.setStackName(stackName);
List<Stack> stacks = awsCFTClient.describeStacks(wait).getStacks();
if (stacks.isEmpty()) {
logger.log("NO_SUCH_STACK");
return true;
}
然而,我得到了:
AmazonServiceException:com.amazonaws.services.cloudformation.model.AmazonCloudFormationException:ID为“stackName”的堆栈不存在。
提前致谢!
答案 0 :(得分:2)
如果其他人正在寻找一个快速而肮脏的解决方案,这可行,
//returns true if stack exists
public boolean stackExists(AmazonCloudFormation awsCFTClient, String stackName) throws Exception{
DescribeStacksRequest describe = new DescribeStacksRequest();
describe.setStackName(stackName);
//If stack does not exist we will get an exception with describe stack
try {
awsCFTClient.describeStacks(describe).getStacks();
} catch (Exception e) {
logger.log("Error Message: " + e.getMessage());
if (e.getMessage().matches("(.*)" + stackName + "(.*)does not exist(.*)")) {
return false;
} else {
throw e;
}
}
return true;
}
如果有更好的方法,请告诉我。
答案 1 :(得分:0)
找到了一种更好的方法,但有几点要点:
在下面的示例中,您将看到kotlin语法
client.listStacks().stackSummaries().any{ it.stackName() == stackName }
在Java中,您可以简单地替换any
方法anyMatch
。
根据对以前的aws java sdk 1.0的简要检查,AmazonCLoudFormationClient类中也有listStacks()
方法,该方法也是如此。
但是在我的情况下,我需要根据状态过滤那些堆栈(因为如果堆栈的状态为DELETED ...,它仍然会出现在上面的列表中)。因此,可能重载的方法会更有用:
@Override
public ListStacksResult listStacks(ListStacksRequest request) {
request = beforeClientExecution(request);
return executeListStacks(request);
}