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

3 分钟阅读
0

在终止或重建 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 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 DB 实例

您可以使用 CloudFormation 控制台或 AWS CLI 来删除堆栈。

CloudFormation 控制台

1.    打开 CloudFormation 控制台

  1. 堆栈页面上,选择未删除的堆栈。
    注意:堆栈的状态列显示 DELETE_FAILED

  2. 选择删除

  3. 删除堆栈 弹出窗口中,选择 AWSEBSecurityGroup,然后选择**删除 **。
    重要事项:请务必删除安全组。删除堆栈时,不会自动删除 AWSebSecurityGroup 。如果由于其他依赖资源而导致环境终止失败,请从删除堆栈弹出窗口中选择处于 DELETE\ _FAILED 状态的相应资源。 然后,选择删除

  4. 终止重建 Elastic Beanstalk 环境。

Amazon CLI

  1. 若要删除 CloudFormation 堆栈,请运行 describe-network-interface-attribute 命令:
aws cloudformation delete-stack --stack-name awseb-e-ztrauxujck-stack --retain-resources "AWSEBSecurityGroup" --region us-east-1
  1. 若要终止 Elastic Beanstalk 环境,请运行 terminate-environment 命令:
aws elasticbeanstalk terminate-environment --environment-name my-env --region us-east-1
  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 控制台

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

2.    打开 Amazon EC2 控制台

3.    在导航窗格中,选择安全组。然后,选择 AWSEBSecurityGroup ID。

  1. 选择操作,然后选择删除安全组以查找** AWSEBSecurityGroup** 上的依赖关系。

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

  3. 删除安全组 弹出窗口中,选择查看引用的安全组
    若要移除 AWSEBSecurityGroup ID 的关联,请选择操作,然后选择编辑入站规则编辑出站规则

  4. 终止重建 Elastic Beanstalk 环境。

Amazon CLI

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

  2. 将以下 bash 脚本保存为 sg\ _dependency.sh

#!/bin/bashSecurityGroupID=$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 实用程序

  1. 要获取您的网络接口 ID 和/或安全组 ID,请运行以下命令:
./sg\_dependency.sh sg-111aaa22 us-east-1

**注意:**将 sg-111aaa22 替换为您的 AWSEBSecurityGroup ID。将 us-east-1 替换为您的AWS 区域。

  1. 若要查找连接到网络接口 ID 的安全组,请运行 describe-network-interface-attribe 命令:
aws ec2 describe-network-interface-attribute --network-interface-id eni-1099d901 --attribute groupSet
  1. 若要分离 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 以保持与网络接口的连接。如果命令输出返回 “An error occurred (AuthFailure) when calling the ModifyNetworkInterfaceAttribute operation: You don't have permission to access the specified resource” 错误,则从创建该网络接口的 AWS 服务中删除 AWSEBSecurityGroup

  1. 运行 describe-security-groups 命令,列出依赖安全组的所有入口和出口规则。

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。

  1. 若要终止 Elastic Beanstalk 环境,请运行 terminate-environment 命令:
aws elasticbeanstalk terminate-environment --environment-name my-env --region us-east-1
  1. 若要重建 Elastic Beanstalk 环境,请运行 rebuild-environment 命令:
aws elasticbeanstalk rebuild-environment --environment-name my-env --region us-east-1

相关信息

故障排除

AWS 官方
AWS 官方已更新 9 个月前