如何在 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 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 控制台

  1. 打开 CloudFormation 控制台
  2. 堆栈页面上,选择删除失败的堆栈。
    注意:堆栈的状态列会显示 DELETE_FAILED
  3. 选择删除
  4. 删除堆栈弹窗中,选择 AWSEBSecurityGroup,然后选择删除
    重要事项:请务必删除安全组。删除堆栈时,不会自动删除 AWSEBSecurityGroup。如果由于其他依赖资源而导致环境终止失败,请先从删除堆栈弹窗中选择处于 DELETE\ _FAILED 状态的相应资源。然后,选择删除
  5. 终止重建 Elastic Beanstalk 环境。

AWS CLI

  1. 若要删除 CloudFormation 堆栈,请运行 describe-network-interface-attribute 命令:

    aws cloudformation delete-stack --stack-name awseb-e-ztrauxujck-stack --retain-resources "AWSEBSecurityGroup" --region us-east-1
  2. 若要终止 Elastic Beanstalk 环境,请运行 terminate-environment 命令:

    aws elasticbeanstalk terminate-environment --environment-name my-env --region us-east-1
  3. 若要重建 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。
  4. 选择操作,然后选择删除安全组以查找 AWSEBSecurityGroup 上的依赖关系。
  5. 删除安全组弹窗中,完成以下步骤:
    选择查看关联实例
    选择操作,然后选择网络
    选择更改安全组
    清除 AWSEBSecurityGroup ID分配安全组复选框。
  6. 删除安全组弹窗中,选择查看引用的安全组
  7. 若要移除 AWSEBSecurityGroup ID 的关联,请选择操作,然后选择编辑入站规则编辑出站规则
  8. 终止重建 Elastic Beanstalk 环境。

AWS CLI

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

  2. 在 .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"
  3. 将 bash 脚本另存为 sg\ _dependency.sh

  4. 从 jq 网站安装 jq 实用程序

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

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

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

  6. 若要查找连接到网络接口 ID 的安全组,请运行 describe-network-interface-attribe 命令:

    aws ec2 describe-network-interface-attribute --network-interface-id eni-1099d901 --attribute groupSet
  7. 若要分离 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".

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

  9. 根据步骤 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。

  10. 若要终止 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 官方已更新 1 年前