如何在 AWSEBSecurityGroup 删除失败时,终止或重建 Elastic Beanstalk 环境?
在终止或重建 AWS Elastic Beanstalk 环境时,我收到以下错误: "Stack deletion failed: The following resource(s) failed to delete: [AWSEBSecurityGroup]."
简短描述
AWSEBSecurityGroup 是一个 Amazon Elastic Compute Cloud(Amazon EC2)安全组,由底层 AWS CloudFormation 堆栈通过 Elastic Beanstalk 创建。在 Elastic Beanstalk 环境之外创建的弹性网络接口或安全组使用 AWSEBSecurityGroup 时,环境会在您终止或重建时失败。
**注意:**若要管理 Elastic Beanstalk 创建的资源,最佳实践是使用以下之一:Elastic Beanstalk 控制台、Elastic Beanstalk 命令行界面(EB CLI)或 AWS 命令行界面(AWS CLI)。如果在运行 AWS CLI 命令时收到错误,请参阅排查 AWS CLI 错误。此外,确保您使用的是最新版本的 AWS CLI。
解决方法
若要解决此问题,请完成以下任务之一:
- 使用 AWS CloudFormation 控制台或 AWS CLI 删除 Elastic Beanstalk 环境创建的 CloudFormation 堆栈。然后,终止或重建 Elastic Beanstalk 环境。
- 从 Elastic Beanstalk 安全组中移除依赖对象。然后,终止或重建 Elastic Beanstalk 环境。
**注意:**在以下 AWS CLI 命令中,输入堆栈名称、环境名称、AWS 区域和其他特定于环境的变量的数值。
从 CloudFormation 控制台中删除堆栈
**重要事项:**如果 Elastic Beanstalk 环境中存在一个集成的 Amazon Relational Database Service(Amazon RDS)数据库,请先解耦 Amazon RDS 数据库实例。
可以使用 CloudFormation 控制台或 AWS CLI 来删除堆栈。
CloudFormation 控制台
- 打开 CloudFormation 控制台。
- 在堆栈页面上,选择删除失败的堆栈。
注意:堆栈的状态列会显示 DELETE_FAILED。 - 选择删除。
- 在删除堆栈弹窗中,选择 AWSEBSecurityGroup,然后选择删除。
重要事项:请务必删除安全组。删除堆栈时,不会自动删除 AWSEBSecurityGroup。如果由于其他依赖资源而导致环境终止失败,请先从删除堆栈弹窗中选择处于 DELETE\ _FAILED 状态的相应资源。然后,选择删除。 - 终止或重建 Elastic Beanstalk 环境。
AWS CLI
-
若要删除 CloudFormation 堆栈,请运行 describe-network-interface-attribute 命令:
aws cloudformation delete-stack --stack-name awseb-e-ztrauxujck-stack --retain-resources "AWSEBSecurityGroup" --region us-east-1
-
若要终止 Elastic Beanstalk 环境,请运行 terminate-environment 命令:
aws elasticbeanstalk terminate-environment --environment-name my-env --region us-east-1
-
若要重建 Elastic Beanstalk 环境,请运行 rebuild-environment 命令:
aws elasticbeanstalk rebuild-environment --environment-name my-env --region us-east-1
查找并移除 Elastic Beanstalk 安全组的依赖对象
要查找阻止删除 AWSEBSecurityGroup 的依赖网络接口或依赖安全组,请完成以下步骤。可以使用 Amazon EC2 控制台或 AWS CLI。
Amazon EC2 控制台
- 从 Elastic Beanstalk 事件流中的错误消息中获取 AWSEBSecurityGroup 的安全组 ID。
- 打开 Amazon EC2 控制台。
- 在导航窗格中,选择安全组。然后,选择 AWSEBSecurityGroup ID。
- 选择操作,然后选择删除安全组以查找 AWSEBSecurityGroup 上的依赖关系。
- 在删除安全组弹窗中,完成以下步骤:
选择查看关联实例。
选择操作,然后选择网络。
选择更改安全组。
清除 AWSEBSecurityGroup ID 和分配安全组复选框。 - 在删除安全组弹窗中,选择查看引用的安全组。
- 若要移除 AWSEBSecurityGroup ID 的关联,请选择操作,然后选择编辑入站规则或编辑出站规则。
- 终止或重建 Elastic Beanstalk 环境。
AWS CLI
-
从 Elastic Beanstalk 事件流中的错误消息中获取 AWSEBSecurityGroup 的安全组 ID。
-
在 .ebextensions 文件夹中,根据以下示例创建一个配置文件:
#!/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"
-
将 bash 脚本另存为 sg\ _dependency.sh。
-
从 jq 网站安装 jq 实用程序。
-
要获取您的网络接口 ID 和安全组 ID,请运行以下命令:
./sg_dependency.sh sg-111aaa22 us-east-1
**注意:**将 sg-111aaa22 替换为您的 AWSEBSecurityGroup ID。将 us-east-1 替换为您的AWS 区域。
-
若要查找连接到网络接口 ID 的安全组,请运行 describe-network-interface-attribe 命令:
aws ec2 describe-network-interface-attribute --network-interface-id eni-1099d901 --attribute groupSet
-
若要分离 AWSEBSecurityGroup ID,请运行 modify-network-interface-attribute 命令:
aws ec2 modify-network-interface-attribute --network-interface-id eni-1099d901 --groups sg-030644d6c95b6470a sg-d34a33a8 sg-059c081ab30c3e38e sg-0e4eabc747368e6c9
**重要事项:**在前面的命令中,排除 AWSEBSecurityGroup ID。加入其他安全组 ID 以保持与网络接口的连接。如果您在创建网络接口的 AWS 服务中加入 AWSEBSecurityGroup ID,则命令输出会返回以下错误: "An error occurred (AuthFailure) when calling the ModifyNetworkInterfaceAttribute operation: You don't have permission to access the specified resource".
-
运行 describe-security-groups 命令,列出依赖安全组的所有入口和出口规则。
-
根据步骤 7 的输出,运行 revoke-security-group-ingress 或 revoke-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。
-
若要终止 Elastic Beanstalk 环境,请运行 terminate-environment 命令:
aws elasticbeanstalk terminate-environment --environment-name my-env --region us-east-1
- 若要重建 Elastic Beanstalk 环境,请运行 rebuild-environment 命令:
aws elasticbeanstalk rebuild-environment --environment-name my-env --region us-east-1
相关信息
相关内容
- AWS 官方已更新 6 个月前
- AWS 官方已更新 5 个月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前