如何在 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 创建的资源。

解决方法

注意:如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本

要解决此错误,请选择以下任意一种方法:

  • (选项 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.    从 Stack Name(堆栈名称)列中选择无法删除的堆栈。

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

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

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

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

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.    选择 Actions(操作),然后选择 Delete Security Group(删除安全组),找到 AWSEBSecurityGroup 的依赖项。

5.    在删除安全组弹出窗口中,选择查看关联的实例
选择 Actions(操作),然后选择 Networking(联网)
选择 Change Security Group(更改安全组)
清除 AWSEBSecurityGroup IDAssign Security Groups(分配安全组)复选框。

6.    返回 Delete Security Groups(删除安全组)弹出窗口,然后选择 View your referencing security groups(查看引用的安全组)
要删除 AWSEBSecurityGroup ID 的关联,请选择 Actions(操作),然后根据您的要求选择 Edit inbound rules(编辑入站规则)Edit outbound rules(编辑出站规则)

7.    终止重建 Elastic Beanstalk 环境。

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 网站安装 jq 实用程序

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

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

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

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

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

6.    要分离 AWSEbSecurityGroup ID,请运行以下命令。

重要提示:请务必在此命令中排除 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

这篇文章对您有帮助吗?


您是否需要账单或技术支持?