如何在 AWSEBSecurityGroup 删除失败时,终止或重建 AWS Elastic Beanstalk 环境?

上次更新时间:2019 年 6 月 7 日

当我尝试终止或重建我的 AWS Elastic Beanstalk 环境时,收到以下错误:“Stack deletion failed: The following resource(s) failed to delete: [AWSEBSecurityGroup].”

如何修复此错误?

简短描述

AWSEBSecurityGroup 是底层 AWS CloudFormation 堆栈通过 Elastic Beanstalk 创建的 Amazon Elastic Compute Cloud (Amazon EC2) 安全组。如果 AWSEBSecurityGroup 用于弹性网络接口 (ENI) 或者在 Elastic Beanstalk 环境之外创建的安全组,则终止或重建环境会失败,并会返回错误。

注意:最好使用 Elastic Beanstalk 控制台Elastic Beanstalk 命令行界面 (EB CLI)AWS 命令行界面 (AWS CLI) 来管理 Elastic Beanstalk 创建的资源。

解决方法

要解决此错误,请选择以下其中一个选项:

  • (选项 A)在 AWS CloudFormation 控制台或 AWS CLI 中删除在 Elastic Beanstalk 环境中创建的 AWS CloudFormation 堆栈,然后再终止 Elastic Beanstalk。
  • (选项 B)删除 Elastic Beanstalk 安全组中的依赖对象,然后再终止 Elastic Beanstalk 环境。

重要提示:请务必在 AWS CLI 中为堆栈名称、环境名称、AWS 区域和其他特定于环境的变量输入正确的值。

(选项 A)从 AWS CloudFormation 控制台中删除堆栈

您可以通过 AWS CloudFormation 控制台或 AWS CLI 删除堆栈。

AWS CloudFormation 控制台:

1.    打开 AWS CloudFormation 控制台

2.    从堆栈名称列中选择无法删除的堆栈。

注意:堆栈的状态列会显示 DELETE_FAILED

3.    从操作菜单中选择删除堆栈

4.    在删除堆栈弹出窗口中,选择 AWSEBSecurityGroup,然后选择是,删除

重要提示:请务必删除此安全组。删除堆栈时不会自动删除 AWSEBSecurityGroup。如果环境终止失败是由其他依赖资源引起的,则从删除堆栈弹出窗口中选择处于 DELETE_FAILED 状态的相应资源。然后,选择是,删除

5.    终止重建 Elastic Beanstalk 环境。

AWS CLI:

1.    要删除 AWS CloudFormation 堆栈,请运行以下命令:

aws cloudformation delete-stack --stack-name awseb-e-ztrauxujck-stack --retain-resources "AWSEBSecurityGroup" --region us-east-1

2.    要终止 Elastic Beanstalk 环境,请运行以下命令:

aws elasticbeanstalk terminate-environment --environment-name my-env --region us-east-1

3.    要重建 Elastic Beanstalk 环境,请运行以下命令:

aws elasticbeanstalk rebuild-environment --environment-name my-env --region us-east-1

(选项 B)查找并删除 Elastic Beanstalk 安全组的依赖对象

要查找阻止删除 AWSEBSecurityGroup 的依赖性弹性网络接口或依赖性安全组,请通过 Amazon EC2 控制台或 AWS CLI 完成以下步骤。

Amazon EC2 控制台:

1.    从 Elastic Beanstalk 事件流的错误消息中获取 AWSEBSecurityGroup 的安全组 ID。

2.    打开 Amazon EC2 控制台

3.    在导航窗格中,选择安全组,然后选择在第 1 步中获取的 AWSEBSecurityGroup ID。

4.    选择操作,然后选择删除安全组,找到 AWSEBSecurityGroup 的依赖对象。

5.    在删除安全组弹出窗口中,选择查看关联的实例
选择操作,然后选择联网
选择更改安全组
清除 AWSEBSecurityGroup ID分配安全组复选框。

6.    返回删除安全组弹出窗口,然后选择查看引用的安全组
要删除 AWSEBSecurityGroup ID 的关联,请选择操作,然后根据您的要求选择编辑入站规则编辑出站规则

7.    终止重建 Elastic Beanstalk 环境。

AWS CLI:

必须使用 AWS CLI 来完成以下步骤。

1.    从 Elastic Beanstalk 事件流的错误消息中获取 AWSEBSecurityGroup 的安全组 ID。

2.    将下面的 bash 脚本另存为 sg_dependency.sh

#!/bin/bash
SecurityGroupID=$1
Region=$2
DependentENI=$(aws ec2 describe-network-interfaces --filters Name=group-id,Values=[$SecurityGroupID] --region $Region | jq '.NetworkInterfaces[].NetworkInterfaceId')
DependentSGingress=$(aws ec2 describe-security-groups --filters Name=ip-permission.group-id,Values=[$SecurityGroupID] --region $Region | jq '.SecurityGroups[] .GroupId')
DependentSGegress=$(aws ec2 describe-security-groups --filters Name=egress.ip-permission.group-id,Values=[$SecurityGroupID] --region $Region | jq '.SecurityGroups[] .GroupId')
echo "The dependent ENI is $DependentENI"
echo "The security group id with a dependency in ingress rule : $DependentSGingress"
echo "The security group id with a dependency in egress rule :  $DependentSGegress"

3.    安装 jq 实用工具

4.    要获取您的弹性网络接口 ID 和/或安全组 ID,请运行以下命令:

./sg_dependency.sh sg-111aaa22 us-east-1

注意:请使用您的 AWSEBSecurityGroup ID 替换 sg-111aaa22。使用您的 AWS 区域替换 us-east-1

5.    要查找连接到您在第 4 步中获取的弹性网络接口 ID 的安全组,请运行 describe-network-interface-attribute 命令:

aws ec2 describe-network-interface-attribute --network-interface-id eni-1099d901 --attribute groupSet

6.    要断开到 AWSEBSecurityGroup ID 的连接,请运行 modify-network-interface-attribute 命令。

重要提示:请务必在此命令中排除 AWSEBSecurityGroup ID,并包含其他安全组 ID,以便保持到网络接口的连接。

aws ec2 modify-network-interface-attribute --network-interface-id eni-1099d901 --groups sg-030644d6c95b6470a sg-d34a33a8 sg-059c081ab30c3e38e sg-0e4eabc747368e6c9

重要提示:如果命令输出返回“An error occurred (AuthFailure) when calling the ModifyNetworkInterfaceAttribute operation: You don't have permission to access the specified resource”错误,请从创建弹性网络接口的 AWS 服务中删除 AWSEBSecurityGroup

7.    运行 describe-security-groups 命令,列出您从第 4 步中获取的依赖性安全组的所有入口和出口规则。

8.    根据第 7 步的输出结果运行 revoke-security-group-ingressrevoke-security-group-egress 命令。

例如,如果 AWSEBSecurityGroup ID 为 sg-111aaa22,并且第 8 步的输出结果在入口规则中具有该安全组 ID,则运行以下命令:

aws ec2 revoke-security-group-ingress --group-id sg-0018a2fbdcd5797ea --ip-permissions '[{"PrefixListIds":[],"FromPort":0,"IpRanges":[],"ToPort":65535,"IpProtocol":"tcp","UserIdGroupPairs":[{"UserId":"123456789102","GroupId":"sg-111aaa22"}],"Ipv6Ranges":[]}]'

注意UserId 是 AWS 账户 ID。

9.    要终止 Elastic Beanstalk 环境,请运行以下命令:

aws elasticbeanstalk terminate-environment --environment-name my-env --region us-east-1

10.    要重建 Elastic Beanstalk 环境,请运行以下命令:

aws elasticbeanstalk rebuild-environment --environment-name my-env --region us-east-1

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助吗?