使用 aws-sdk 终止实例后删除子网时发生 DependencyViolation

Posted

技术标签:

【中文标题】使用 aws-sdk 终止实例后删除子网时发生 DependencyViolation【英文标题】:DependencyViolation occurred when I delete subnet after terminate instance using aws-sdk 【发布时间】:2019-12-14 21:29:42 【问题描述】:

我使用 AWS-SDK php 控制 AWS 环境。 当我删除所有测试环境时,问题就出现了。

我阅读了document,并且我已经知道如果我在目标子网中有正在运行的实例,就会发生DependencyViolation

所以我先终止了正在运行的实例,然后我尝试删除子网,但出现DependencyViolation错误。

我使用这段代码尝试了这些序列。

<?php
$options = [
    /**
     * information about region, version ..
     */
];
$client = new Ec2Client($options);

$promise = $client->terminateInstancesAsync([
    'InstanceIds' => ['instance-id'],
])->then(function ($result) use ($client) 
    return $client->deleteSubnetAsync([
        'SubnetId' => 'subnet-id',
    ]);
);

我猜错误的原因是“实例没有完全终止,但删除子网操作正在运行”。

但我不知道在没有DependencyViolation 的情况下删除子网该怎么办。

【问题讨论】:

【参考方案1】:

我可以在使用terminateInstnaces 方法之后使用deleteSubnet 方法,而使用Waiters 没有任何错误。

我使用了这些代码。

$promise = $client->terminateInstancesAsync([
    'InstanceIds' => ['instance-id'],
])->then(function ($result) use ($client) 
    $client->waitUntil('InstanceTerminated', [
        'InstanceIds' => ['instance-id'],
    ]);
    return $client->deleteSubnetAsync([
        'SubnetId' => 'subnet-id',
    ]);
);

【讨论】:

以上是关于使用 aws-sdk 终止实例后删除子网时发生 DependencyViolation的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Platform抢占实例:磁盘发生了什么?

让 EMR 集群在终止时终止其 EC2 实例

Elastic Beanstalk 终止我的 EC2 实例

AWS 在我终止后自动生成新实例。

使用 aws-sdk ruby​​ gem 知道自己的实例 ID

使用 PHP 中的 system() 执行程序时出错:在抛出“std::logic_error”实例后调用终止