AWSEBSecurityGroup을 삭제하는 데 실패할 경우 AWS Elastic Beanstalk 환경을 종료하거나 재구축하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2019년 6월 7일

AWS Elastic Beanstalk 환경을 종료하거나 재구축하려고 하면 다음 오류가 나타납니다. "스택 삭제 실패: 다음 리소스를 삭제하지 못했습니다. [AWSEBSecurityGroup](Stack deletion failed: The following resource(s) failed to delete: [AWSEBSecurityGroup].)"

간략한 설명

AWSEBSecurityGroup은 Elastic Beanstalk을 통해 기본 AWS CloudFormation 스택에 의해 생성된 Amazon Elastic Compute Cloud(Amazon EC2) 보안 그룹입니다. AWSEBSecurityGroup탄력적 네트워크 인터페이스(ENI) 또는 Elastic Beanstalk 환경 외부에서 생성된 보안 그룹에서 사용할 경우 환경을 종료하거나 재구축하면 실패하고 오류가 반환될 수 있습니다.

참고: Elastic Beanstalk에 의해 생성된 리소스는 Elastic Beanstalk 콘솔, Elastic Beanstalk 명령줄 인터페이스(EB CLI) 또는 AWS 명령줄 인터페이스(AWS CLI)를 사용하여 관리하는 것이 가장 좋습니다.

해결 방법

참고: 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 상태의 적절한 리소스를 [스택 삭제(Delete Stack)] 팝업 창에서 선택합니다. 그런 다음 [예, 삭제(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 ID] 및 [보안 그룹 할당(Assign 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

참고: sg-111aaa22 사용자의 AWSEBSecurityGroup ID로 바꾸고 us-east-1을 사용자의 AWS 리전으로 바꿉니다.

5.    4단계에서 확보한 탄력적 네트워크 인터페이스 ID에 연결된 보안 그룹을 찾으려면 다음 명령을 실행합니다.

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

6.    AWseb보안 그룹 ID를 분리하려면 다음 명령을 실행합니다.

중요: 네트워크 인터페이스에 연결된 상태로 유지하려면 이 명령에서 AWSEBSecurityGroup ID를 제외하고 다른 보안 그룹 ID를 포함해야 합니다.

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

중요: 명령 출력에서 "ModifyNetworkInterfaceAttribute 작업을 호출할 때 오류가 발생했습니다(AuthFailure). 지정된 리소스에 액세스할 수 있는 권한이 없습니다(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-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입니다.

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

이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요합니까?