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

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

AWS Elastic Beanstalk 환경을 종료하거나 재구축하려고 하면 다음 오류가 나타납니다. "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)를 사용하여 관리하는 것이 가장 좋습니다.

​해결 방법

이 오류를 해결하려면 다음 옵션 중 하나를 선택하십시오.

  • (옵션 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.    스택 이름 열에서 삭제하는 데 실패한 스택을 선택하십시오.

참고: 스택의 상태 열은 DELETE_FAILED로 나타납니다.

3.    작업 메뉴에서 스택 삭제를 선택하십시오.

4.    스택 삭제 팝업 창에서 AWSEBSecurityGroup을 선택한 다음 예, 삭제를 선택하십시오.

중요: 보안 그룹을 삭제해야 합니다. AWSEBSecurityGroup은 스택을 삭제할 때 자동으로 삭제되지 않습니다. 다른 종속 리소스로 인해 환경 종료에 실패할 경우 DELETE_FAILED 상태의 적절한 리소스를 스택 삭제 팝업 창에서 선택하십시오. 그런 다음 예, 삭제를 선택하십시오.

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.    작업을 선택한 다음 보안 그룹 삭제를 선택하여 AWSEBSecurityGroup에 대한 종속성을 찾으십시오.

5.    보안 그룹 삭제 팝업 창에서 관련 인스턴스 보기를 선택하십시오.
작업을 선택한 다음 네트워킹을 선택하십시오.
보안 그룹 변경을 선택하십시오.
AWSEBSecurityGroup ID보안 그룹 할당 확인란을 선택 취소하십시오.

6.    보안 그룹 삭제 팝업 창으로 돌아간 다음 참조하는 보안 그룹 보기를 선택하십시오.
AWSEBSecurityGroup ID의 연결을 제거하려면 작업을 선택한 다음 필요에 따라 인바운드 규칙 편집 또는 아웃바운드 규칙 편집을 선택하십시오.

7.    Elastic Beanstalk 환경을 종료하거나 재구축하십시오.

AWS CLI:

다음 단계를 완료하려면 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 유틸리티를 설치하십시오.

4.    탄력적 네트워크 인터페이스 ID나 보안 그룹 ID 또는 둘 모두를 가져오려면 다음 명령을 실행하십시오.

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

참고: sg-111aaa22를 사용자의 AWSEBSecurityGroup ID로 바꾸고 us-east-1을 사용자의 AWS 리전으로 바꾸십시오.

5.    4단계에서 확보한 탄력적 네트워크 인터페이스 ID에 연결된 보안 그룹을 찾으려면 describe-network-interface-attribute 명령을 실행하십시오.

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

6.    AWSEBSecurityGroup ID를 분리하려면 modify-network-interface-attribute 명령을 실행하십시오.

중요: 네트워크 인터페이스에 연결된 상태로 유지하려면 이 명령에서 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-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

이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?