고아 AWS EC2 스냅 샷을 정리하는 방법은 무엇입니까?


22

AMI가 삭제 된 상당한 양의 AWS EC2 스냅 샷이 생성되지만 스냅 샷은 남게됩니다. 돈과 공간을 절약하기 위해 이러한 고아를 식별하고 삭제 하는 비 수동적 인 방법을 원합니다 .

이상적으로 CLI를 활용 하는 bash 스크립트를 생각하고 있지만 AWS-fu는 약합니다. 누군가 전에 이것을 한 것으로 가정하지만 실제로 작동하는 스크립트를 찾을 수 없습니다.

가장 좋은 시나리오에서는 볼륨을 확인하고 볼륨을 정리하지만 두 번째 질문에 더 적합 할 수 있습니다.


파이썬에서 내 버전. 사용법 및 github 링크
E.Big

답변:


13

블로그 게시물과 다른 답변에 이미 링크 된 요점에서 크게 영감을 얻었습니다. 여기에 문제가 있습니다.

복잡한 JMESpath 함수를 사용 하여 스냅 샷 목록을 가져 왔지만 필요하지는 않았습니다 tr.

면책 조항 : 귀하 책임 하에 사용하십시오 . 나는 문제를 피하고 제자리를 지키지 않기 위해 최선을 다했지만 문제가 발생하더라도 책임을지지 않습니다.

#!/bin/sh
# remove x if you don't want to see the commands
set -ex

# Some variable initialisation with sane defaults
DRUN='--dry-run'
DO_DELETE=${1:-'no'}
REGION=${2:-'eu-west-1'}
ACCOUNTID=${3:-'self'}

# Get two temporary files
SNAP_FILE=$(mktemp)
IMAGE_FILE=$(mktemp)

# Get the snapshot list and the volume list
aws --region "$REGION" ec2 describe-snapshots --owner-ids "$ACCOUNTID" --query 'Snapshots[*].[SnapshotId]' --output text > "$SNAP_FILE"
aws --region "$REGION" ec2 describe-images --owners "$ACCOUNTID" --filters Name=state,Values=available --query 'Images[*].BlockDeviceMappings[*].Ebs.[SnapshotId]' --output text > "$IMAGE_FILE"

# Check if the outputed command should be dry-run (default) or not
if [ "$DO_DELETE" = "IAMSURE" ]
then
 DRUN=''
fi

# count each snapshot id, decrease when a volume reference it, print delete command for those with no volumes
awk -v REGION="$REGION" -v DRUN="$DRUN" '
FNR==NR { snap[$1]++; next } # increment snapshots and get to next line in file immediately

{ snap[$1]-- } # we changed file, decrease the snap counter when a volume reference it

END {
 for (s in snap) { # loop over the snapshots
   if (snap[s] > 0) { # if we did not decrese under 1 that means there is no volume referencing this snapshot
    cmd="aws --region " REGION " " DRUN " ec2 delete-snapshot --snapshot-id " s
    print(cmd)
  }
 }
}
' "$SNAP_FILE" "$IMAGE_FILE"
# Clean up the temp files
rm "$SNAP_FILE" "$IMAGE_FILE"

스크립트 자체가 충분히 주석 처리되기를 바랍니다.

기본 사용법 (매개 변수 없음)은 현재 계정 및 리전 eu-west-1에 대한 고아 스냅 샷의 삭제 명령을 나열합니다.

aws --region eu-west-1 --dry-run ec2 delete-snapshot --snapshot-id snap-81e5856a
aws --region eu-west-1 --dry-run ec2 delete-snapshot --snapshot-id snap-95c68c7e
aws --region eu-west-1 --dry-run ec2 delete-snapshot --snapshot-id snap-a3bf50bd

모든 명령을 실행하기 전에이 출력을 검토 할 파일로 경로 재 지정할 수 있습니다.

스크립트 대신을 인쇄하는 명령을 실행하려면, 교체 print(cmd)에 의해 system(cmd).

사용법은 다음과 같은 스크립트를 사용합니다 snap_cleaner.

us-west-1 지역의 드라 이런 명령

./snap_cleaner no us-west-1

eu-central-1에서 사용 가능한 명령

./snap_cleaner IAMSURE eu-central-1 

세 번째 매개 변수를 사용하여 다른 계정에 액세스 할 수 있습니다 (이전에 역할을 다른 계정으로 전환하는 것을 선호합니다).

awk 스크립트를 oneliner로 사용하여 스크립트 버전을 제거했습니다.

#!/bin/sh
set -ex

# Some variable initialisation with sane defaults
DRUN='--dry-run'
DO_DELETE=${1:-'no'}
REGION=${2:-'eu-west-1'}
ACCOUNTID=${3:-'self'}

# Get two temporary files
SNAP_FILE=$(mktemp)
IMAGE_FILE=$(mktemp)

# Get the snapshot list and the volume list
aws --region "$REGION" ec2 describe-snapshots --owner-ids "$ACCOUNTID" --query 'Snapshots[*].[SnapshotId]' --output text > "$SNAP_FILE"
aws --region "$REGION" ec2 describe-images --owners "$ACCOUNTID" --filters Name=state,Values=available --query 'Images[*].BlockDeviceMappings[*].Ebs.[SnapshotId]' --output text > "$IMAGE_FILE"

# Check if the outputed command should be dry-run (default) or not
if [ "$DO_DELETE" = "IAMSURE" ]
then
 DRUN=''
fi

# count each snapshot id, decrease when a volume reference it, print delete command for those with no volumes
awk -v REGION="$REGION" -v DRUN="$DRUN" 'FNR==NR { snap[$1]++; next } { snap[$1]-- } END { for (s in snap) { if (snap[s] > 0) { cmd="aws --region " REGION " " DRUN " ec2 delete-snapshot --snapshot-id " s; print(cmd) } } }' "$SNAP_FILE" "$IMAGE_FILE"
# Clean up the temp files
rm "$SNAP_FILE" "$IMAGE_FILE"

대단해! '팔로우'(IMO가 '팔로우'해야 함)를 제외 하고는이 답변이 고품질 게시물의 샘플로 간주된다고 생각합니다. 약간 중복 된 것으로 보이는 유일한 점은 면책 조항입니다 (SE 사이트의 어떤 것에서 사용하는 것은 "자신의 위험으로 사용"함). 경우 표시 : 난 단지 당신이 추가 할 수 있습니다 1 개 추가 개선 생각할 수있는 당신이 시험이 스크립트를했고, 어떻게 그 시험 결과를 요약 할 수 있도록하는 경우 ( "설계된대로 작동"같은 것을?). 분명히, 당신이 이미 그것을 직접 사용한다면, 그것은 더 나은 표시입니다.
Pierre.Vriens

@pierre는 오늘 아침에 그것을 작성하고 부분적으로 테스트했으며 오늘 오후에 파이프 라인에 들어갈 것입니다. '있는 그대로 제공되는'일반적인 아이디어에 동의하는 동안 '백업'을 제거하는 위험 수준이 높으며 스트레스를 받아야한다고 생각합니다. 더 나아가.
Tensibai

흠, 그래서 우리는 이러한 종류의 DevOps 요구에 대한 무료 코드 작성 서비스 를 시작하도록 참여시킬 수 있습니다 (일부 면책 조항이 첨부 됨) ... 흥미로운! 나중에 (시간이 늦었을 때) " 내 스크립트가 오늘 오후에 파이프 라인에 들어갔습니다 "와 같은 사소한 업데이트를 추가 할 것을 제안합니다 .
Pierre.Vriens

@ Pierre.Vriens 내가 아마 보증하지, 말했다 다음 주 또는 나중에도 될 수있다;)
Tensibai

1
편집 해 주셔서 감사합니다! 의도 한대로 정확하게 작동합니다.
Alex

5

Rodrigue Koffi (bonclay7)의 GitHub에서 다음 스크립트를 사용했으며 꽤 잘 작동합니다.

https://github.com/bonclay7/aws-amicleaner

명령:

amicleaner --check-orphans

문서 블로그 게시물에서 더 많은 작업을 수행합니다.

실제로는 그보다 약간 더 많은 작업을 수행합니다.

  • 이미지 및 관련 스냅 샷 목록 제거
  • AMI 매핑 :
    • 이름 사용
    • 태그 사용
  • AMI 필터링 :
    • 인스턴스를 실행하여 사용
    • 원하는 용량이 0으로 설정된 자동 확장 그룹 (시작 구성)에서
    • 자동 확장 그룹에서 분리 된 시작 구성에서
  • 유지할 AMI 수 지정
  • 고아 스냅 샷 정리
  • 약간의보고

3

고아 스냅 샷을 찾는 데 도움이되는 스크립트가 있습니다.

comm -23 <(echo $(ec2-describe-snapshots --region eu-west-1 | grep SNAPSHOT | awk '{print $2}' | sort | uniq) | tr ' ' '\n') <(echo $(ec2-describe-images --region eu-west-1 | grep BLOCKDEVICEMAPPING | awk '{print $3}' | sort | uniq) | tr ' ' '\n') | tr '\n' ' '

( 여기에서 )

또한 당신은 serverfault 에서이 기사를 확인할 수 있습니다

추신 : 물론 지역을 변경하여

PPS 업데이트 된 코드는 다음과 같습니다.

 comm -23 \
<(echo $(aws ec2 describe-snapshots --region eu-west-1 |awk '/SNAPSHOT/ {print $2}' | sort -u) | tr ' ' '\n') \
<(echo $(aws ec2 describe-images --region eu-west-1 |  awk '/BLOCKDEVICEMAPPING/ {print $3}' | sort -u) | tr ' ' '\n') | tr '\n' ' '

코드가 수행하는 샘플 설명은 다음과 같습니다.

echo $(aws ec2 describe-snapshots --region eu-west-1 | awk '/SNAPSHOT/ {print $2}' | sort -u) | tr ' ' '\n')

스냅 샷 목록을 STDOUT에 보냅니다. 이 건설 :

<(...)

가상 임시 파일 핸들러를 작성 comm하여 두 "파일"에서 명령을 읽고 비교


테스트 했습니까? 같은 기사를 찾았지만 작동하지 않습니다. 가능하다면 사용자의 실수는 있지만 기사의 나이에 따라 오래된 것일 수도 있습니다.
Alex


명령 변경 변경 참조 aws ec2 설명 / 삭제
Tensibai

1
나는 같은 소스를 찾았지만 체인 영웅 awk 정렬과 uniq 내 셸 코더 측면을 슬프게 만듭니다. 내일 내 버전을 게시하겠습니다 :)
Tensibai

1
저에게 좋습니다, 당신에게 전문가처럼 일반 영어처럼 보이는 것이 나에게 중국어처럼 보이는 것을 알려주기 위해 (건설적인) 피드백을 제공하고 싶었습니다. 추신 : 그리고 그것은 Flemish 소리도 들리지 않습니다 ... 당신이 끝난 후에 나에게 알리고 싶다면 추가 의견을 남겨주세요 (내 업데이트 된 피드백을 원한다면).
Pierre.Vriens

2

여기에 당신이 다닐 Yaroslavtsev에 의해 요구하고 정확하게의 GitHub의 요점 코드 조각입니다.

모든 이미지 목록과 해당 스냅 샷을 사용하고 ID를 모든 스냅 샷 ID 목록과 비교합니다. 남아있는 것은 고아입니다. 코드는 위의 답변과 동일한 원리로 작동하지만 형식이 더 좋고 약간 더 읽기 쉽습니다.

이 코드는 JMESPath --query Snapshots[*].SnapshotId옵션을 활용합니다 (이미 배포판에 jp 명령 줄 유틸리티를 사용할 수도 있습니다. 출력을 텍스트로 형식화합니다 --output text. 여기에는 API 참조에 대한 링크 와 몇 가지 예제가 있습니다. grep / awk / sort / uniq / tr 파이프의 긴 체인보다 더 우아합니다.

Todd Walton에 의한 경고 : 다른 쿼리 언어를 사용하여 json 문서를 구문 분석하는 'jq'유틸리티로 실수하지 마십시오.


참고로 jq 명령 줄 유틸리티는 "aws"명령이 사용하는 것과 동일한 JSON 쿼리 언어 가 아닙니다 . "aws"명령은 JMESPath를 사용합니다.
Todd Walton

지적 해 주셔서 감사합니다. 나는 오늘 새로운 것을 배웠다.
Jiri Klouda

0

정의 된 영역 목록에있는 모든 스냅 샷을 반복하고 생성하는 snapshots.py 스크립트를 작성했습니다 report.csv. 이 파일에는 모든 스냅 샷에서 참조하는 인스턴스, AMI 및 볼륨에 대한 정보가 포함되어 있습니다.

매달려있는 스냅 샷을 대화식으로 제거하는 명령도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.