【问题标题】:Best way to check whether a cloud formation stack exists using AWS Java SDK?使用 AWS Java SDK 检查是否存在云形成堆栈的最佳方法?
【发布时间】:2017-08-21 22:05:00
【问题描述】:

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

我已经根据 - 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”的堆栈不存在。

提前致谢!

【问题讨论】:

  • 如果堆栈不存在,您将无法描述它以检查它是否存在。所以你可以通过一个简单的 try-catch 来解决这个问题。捕获 AmazonCloudFormationException。希望这有效

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


【解决方案1】:

如果其他人正在寻找一个快速而肮脏的解决方案,这很有效,

//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;
}

如果有更好的方法,请告诉我。

【讨论】:

【解决方案2】:

找到了一个稍微好一点的方法,但有几点说明:

  • 这里使用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() 方法,其作用相同。

但就我而言,我需要根据状态过滤这些堆栈(因为如果堆栈的状态为已删除......它仍将出现在上面的列表中)。所以可能重载的方法会更有用:

@Override
    public ListStacksResult listStacks(ListStacksRequest request) {
        request = beforeClientExecution(request);
        return executeListStacks(request);
    }

【讨论】:

    猜你喜欢
    • 2014-05-25
    • 2021-08-18
    • 2017-12-04
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多