사용되지 않는 AWS 보안 그룹을 세척

6839 단어 aws-cliAWS

노라 보안 그룹이 없습니까?



조직에서 공유하고 있는 AWS의 개발 환경·테스트 환경에서는, 사용되지 않게 된 채 방치되고 있는 리소스가 나오는 것으로, 관리자의 여러분은 정기적으로 재고를 하고 있다고 생각합니다.

그러나 보안 그룹이 재고되지 않은 환경은 적지 않다고 생각합니다.

그렇다고 하는 것도 , 시큐리티 그룹측으로부터는 붙어 있는 인스턴스·네트워크 인터페이스를 추적할 수 없기 때문에 , 꽤 힘든 일이 걸립니다. 게다가 인스턴스를 만들 때 생겼다 launch-wizard-xxx 가 산 정도 있어, 일람을 보는 것만으로 마음이 부러질 것 같아집니다.
마지막으로, 어차피 보안 그룹은 있어도 과금되지 않기 때문에, 라고 하는 이유로 전망 재고의 대상외로 된다, 라고.

하지만 정리할 수 있는 것이라면 정리하고 싶네요.
그래서 여기는 하나의 도구를 사용하여 정리해 봅시다.

먼저 나열



1. 모든 보안 그룹



AWS CLI를 사용하여 모든 보안 그룹을 all.txt에 저장합니다.
aws ec2 describe-security-groups --query 'SecurityGroups[].[GroupId, GroupName]' --output text > all.txt

2. 사용되는 보안 그룹



모든 네트워크 인터페이스(ENI)에서 사용하는 보안 그룹을 using.txt에 저장합니다.
aws ec2 describe-network-interfaces --query 'NetworkInterfaces[].[Groups]' --output text > using.txt

세탁



그리고는 필터를 조금 걸립니다.
sort all.txt using.txt | uniq -u
default 를 사용하지 않는 사람(환경)도 많다고 생각하므로, 그것을 깎아 버리는 것도 좋을지도 모릅니다.
sort all.txt using.txt | grep -v default | uniq -u

이상입니다. 간단하네요.

1과 2의 출력이 같은 형식인 것이 된장입니다. 이 결과를 동시에 출력하면 사용되는 보안 그룹이 중복됩니다. 여기서 uniq -u 하고 중복하지 않은 행만 표시하면 사용되지 않은 것만 씻을 수 있다는 것입니다.

(덤)



우리의 환경에서 시험해 보았습니다.
$ cat all.txt | wc -l
176
$ sort all.txt using.txt | grep -v default | uniq -u | wc -l
117
$ perl -le 'print 117/174'
0.672413793103448
default 를 제외하면, 사용되지 않는 보안 그룹이 67%……( ^o^)ノ

(덧붙여서 VPC가 37 개있었습니다. 이것도 재고가 갈 것 같습니다)

그럼 지울까요?



그리고는 지우는 것만입니다만, 손으로 지우는 것은 귀찮고, 라고 해 스크립트로 일괄 삭제하는 것은 용기가 있습니다. 여기에서는 보안 그룹을 삭제하기위한 쉘 스크립트를 작성하기로 결정했습니다.

먼저 사용되지 않는 보안 그룹 목록을 저장합니다.
이 단계에서 정말 지워도 괜찮은 것을 육안으로 확인하면 좋다고 생각합니다.
sort all.txt using.txt | grep -v default | uniq -u > targets.txt

쉘 스크립트는 Perl의 원라이너로 만듭니다.

주의를 기울여 먼저 dry-run 1 을 위한 것을 만듭니다.
dryrun="--dry-run" perl -lane 'print "# $F[1]\naws $ENV{dryrun} ec2 delete-security-group --group-id $F[0]\n"' targets.txt > delete_sgs.sh

내용은,
$ head delete_sgs.sh
# adtest-site02
aws --dry-run ec2 delete-security-group --group-id sg-0011eb5bcXXXXXXXX

# launch-wizard-35
aws --dry-run ec2 delete-security-group --group-id sg-004c8e17bXXXXXXXX

# AD-DCsg-hoge
aws --dry-run ec2 delete-security-group --group-id sg-0078856e3XXXXXXXX

# test-hoge-auth-sg

좋아 보인다.
dry-run이므로 삼가 bash -x delete_sgs.sh 로 실행해 봅시다.
$ bash -x delete_sgs.sh
+ aws --dry-run ec2 delete-security-group --group-id sg-0011eb5bcXXXXXXXX

An error occurred (DryRunOperation) when calling the DeleteSecurityGroup operation: Request would have succeeded, but DryRun flag is set.
+ aws --dry-run ec2 delete-security-group --group-id sg-004c8e17bXXXXXXXX

An error occurred (DryRunOperation) when calling the DeleteSecurityGroup operation: Request would have succeeded, but DryRun flag is set.
+ aws --dry-run ec2 delete-security-group --group-id sg-0078856e3XXXXXXXX

An error occurred (DryRunOperation) when calling the DeleteSecurityGroup operation: Request would have succeeded, but DryRun flag is set.
:
:

이것으로 문제가 없다면 dry-run가 아닌 것을 만드십시오.
방금 시작하는 dryrun="--dry-run"를 제거하고 실행하십시오.
perl -lane 'print "# $F[1]\naws $ENV{dryrun} ec2 delete-security-group --group-id $F[0]\n"' targets.txt > delete_sgs.sh

내부를 확인합니다.
$ head delete_sgs.sh
# adtest-site02
aws  ec2 delete-security-group --group-id sg-0011eb5bcXXXXXXXX

# launch-wizard-35
aws  ec2 delete-security-group --group-id sg-004c8e17bXXXXXXXX

# AD-DCsg-hoge
aws  ec2 delete-security-group --group-id sg-0078856e3XXXXXXXX

# test-hoge-auth-sg

괜찮을까요? 괜찮을 것 같네요?

그럼, 그 후에는 실행할 뿐입니다.
기도하면서 bash -x delete_sgs.sh 라고 두드리자!

God bless you!



dry run이란 「리허설」「예행 연습」이라고 하는 의미로, 실제의 변경은 행해지지 않습니다만, 그때까지의 부분(구문의 체크나 대상의 존재 확인)을 제대로 실행하는 것입니다. 대부분의 경우 dry run이 성공하면 프로덕션도 성공하도록 만들어졌습니다.

좋은 웹페이지 즐겨찾기