使用AWS Java SDK检查是否存在云形成堆栈的最佳方法?

时间:2017-08-21 22:05:01

标签: amazon-web-services amazon-cloudformation aws-java-sdk

在给定堆栈名称的情况下,使用AWS Java SDK检查堆栈是否存在的最佳方法是什么?

我已根据 - https://github.com/aws/aws-sdk-java/blob/master/src/samples/AwsCloudFormation/CloudFormationSample.java

尝试了以下代码
    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”的堆栈不存在。

提前致谢!

2 个答案:

答案 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)

找到了一种更好的方法,但有几点要点:

  • 此处使用{aws java sdk 2.0} https://github.com/aws/aws-sdk-java-v2
  • 在下面的示例中,您将看到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);
    }