수백 개 또는 수천 개의 Route53 DNS 항목을 삭제하는 방법

8912 단어 jsondnsawsroute53

명령줄에서 수백 개 또는 수천 개의 Route53 항목을 빠르게 제거하는 방법


개술


발표할 때, 우리는 빠른 창설과 업데이트 환경을 통해 성숙하고 격리된 환경에서 응용 프로그램 코드를 실행하고 테스트하며 공유할 수 있도록 간소화한다.이전 릴리즈에서는 각 새 어플리케이션 및 환경에 대한 AWS Route53 DNS 항목을 대량으로 작성하여 새로운 환경과 기능을 신속하게 출시할 수 있었습니다.불행하게도, 이것은 우리가 곧 5000여 개의 Route53 항목을 만들었다는 것을 의미한다.
기본적으로 하나의 관리 영역에는 최대 10000개의 Route53 항목이 있을 수 있기 때문에 이 문제를 다 사용하기 전에 해결해야 합니다.다행히도, 우리는 새로운 기능을 추가하여 스마트 어댑터 항목을 만들고, 루트 시스템을 추가하여 자신과 고객을 위해 만든 항목의 수를 대폭 줄였다.
그러나 나중에 우리가 남긴 5000여 건은 삭제해야 한다(조심해!)합리적인 시간 범위 내에서 수동으로 완성하는 것이 아니라 자동으로 완성하는 것이 가장 좋다.본고는 우리가 어떻게 이 임무를 완성했는지, 그리고 이 상대적으로 모호하고 특수한 문제를 어떻게 해결하는지 보여 드리겠습니다(우리는 희망합니다!)비교적 빠르고 쉽게 해결할 수 있다.

조사하다.


최초의 방법은 간단하게 명령행 조회를 제출하고 로트 53 항목을 열거한 다음 하나하나 해석해서 삭제하는 것이다.불행하게도, 문서는 루트 53 항목의 'upserts' (추가 또는 변경) 또는' deletes' (예상한 대로) 가 업무에서 일괄 처리와 업로드를 해야 하기 때문에 잘못된 방법임을 곧 나타냅니다.이 문서를 작성할 때까지 CLI에는 간단한 "Route53 항목 삭제"명령이 없습니다.사실 이런 천진한 방법은 사실상 이런 대량 업데이트를 진행하는 좋은 방법이 아니다.Route53은 각 작업을 트랜잭션으로 올바르게 처리합니다.따라서 어떤 이유로 항목이 업데이트되거나 삭제되지 않으면, 전체 횟수는 기록의 완전성을 유지하기 위해 스크롤됩니다.
그래서 나는 내가 가장 좋아하는 답안 중 하나부터 시작한다. 이것은 내가 자주 사용하는 답안이다:How to Export Route53 Zone File.이것은 내가 Route53 용례를 처리할 때 맹목적으로 사용한 복사 붙여넣기 답안 중의 하나이며, 이 블로그를 구축하는 데 충분한 초기 해결 방안을 포함해서 매우 기쁘다.

JQ의 점 탄젠트


JQJSON query language의 줄임말로'sed 대표 JSON'이라고 불린다.나에게 있어서, jq는 항상 약간 불투명하다. 나는 보통 답안이 제공하는 모든 내용을 복사할 뿐이다.이 블로그에서 제기한 문제에 대해 저는 jq가 제공한 도움으로 이 문제를 해결하는 능력을 깊이 이해해야 합니다.사실상 상술한 답안이 넘치는 핵심 해결 방안의 일부분이다.
우선 주의해야 할 것은 jq는 프로그래밍 방식으로 JSON 대상이나 텍스트를 추출, 변환, 출력, 집합, 필터하는 데 사용할 수 있다는 것이다.이런 방식을 통해 저는 제 관점을 바꾸어 jq가'JSON의'awk라고 하기 시작했습니다.나는 jq문법과 구조가 테스트나 파악하기 어렵다는 것을 발견했기 때문에 나는 매우 기쁘다jq Play. 이것은 테스트와 시각화된 jq문법과 테스트 입력에 사용되는 온라인 자원이다.나는 jqplay의 캡처를 사용하여 나의 절차를 표시할 것이다.

첫 번째 단계, 테스트 데이터 수집


위에서 설명한 바와 같이 첫 번째 단계는 AWS CLI를 실행하여 모든 Route53 항목의 JSON 목록을 출력하는 것입니다. (우리의 예에서 5000개가 넘습니다.)출력의 첫 번째 부분에서 몇 줄을 선택하여 처리합니다.제한--max-items 명령의 list-resource-record-sets 옵션을 통해 항목을 얻을 수 있습니다.왼쪽 jq play 화면에 붙여넣은 다음 "모든 내용을 조작원으로 출력합니다.너는 이것을 따라갈 수 있다snippet.다음은 최초의 모습입니다.

이것은 좋은 출발점이지만, 우선 'ResourceRecords' 키의 바깥쪽을 펼쳐서 항목 목록 follows 을 찾아야 한다.

2단계, 레코드 필터링


특정 끝점과 일치하는 "AliasTarget->DNSname"키만 삭제할 수 있도록 기록을 필터링해야 합니다.파이프 ("|") 문자를 사용하여 결과를 필터하고 "선택"조작부호를 follows 로 사용하면 비교적 쉽게 할 수 있습니다.

실천 과정에서 우리는 4개의 기록 중에서 2개 이상의 기록을 선별할 것이지만, 이것은 완전한 해결 방안을 실행하기 전의 테스트일 뿐이라는 것을 명심하십시오.또한 유형 필드와 같은 필터 및 선택기 연산자를 사용하여 작업할 항목을 선택할 수 있습니다.세상은 너의 굴이야!
물론 이것은 어리석은 말이다.만약 이 세상이 당신의 굴이라면, 이 세상은 짜고 끈적끈적하며 엉망진창이고 근육이 발달한 세상이 될 것입니다.당신의 세계 속의 진주는 어디에 있습니까?너의 침실 안에는 딱딱하고 동그랗고 기형적인 것이 굴러다니며 너를 불편하게 했니?나는 이것이 여기저기 모래가 쌓여 있는 것보다 낫다고 생각하지만, 정말이다.'세상은 너의 굴'?

3단계, 삭제할 행 작업


다음 단계는 일괄 삭제 작업이 될 단일 기록을 만들기 위해 우리가 선별하고 선택한 줄을 조작하는 것입니다.이를 위해서는 Route53이 예상한 모드를 사용하여 각각의 삭제 작업에 대한 출력 기록 폼을 만들어야 합니다.이 예에서는 각 레코드에서 몇 개의 필드를 추출하여 "Action:DELETE"키follows로 포장합니다.

오른쪽 창에 있는 JSON이 출력처럼 보이므로 파이프라인을 통해 AWS CLI 호출을 통해 항목을 삭제할 수 있습니다.우리는 매우 순조롭게 진전되었다.
또한 레코드 유형을 변경하거나 TTL 또는 기타 필드를 대량으로 변경하는 등 항목을 확장할 수 있습니다.
출력이 어떻게 줄로 구분되는지 주의하시겠습니까?이 점은 처음에는 당혹스러웠지만 전체 질의를 대괄호(목록의 경우) 또는 중괄호(매핑의 경우)로 포장하여 목록이나 매핑을 쉽게 만들 수 있습니다.

4. 최대량 주의


우리는 거의 완성되었지만, 수백 개의 (실제로는 수천 개의) 기록을 삭제하고 있기 때문에, 합리적인 배치 크기를 설정하기를 희망합니다. 로터53은 이 배치 크기를 받아들일 것입니다.파일에 따라 최대 볼륨은 1000입니다.볼륨 크기를 100으로 임의로 선택했는데 CLI에서 보다 합리적이고 관리하기 쉽기 때문_nwise() 연산자의 레이어는 follows입니다.

이 예에서 나는 네 장의 레코드를 사용해서 두 장으로 필터한 후에 한 장으로 나누어 처리했다는 것을 기억해 주십시오.실제로 우리는 그것을 5000여 개의 기록에 적용하여 약 4000개의 기록을 거르고 100번으로 처리할 것이다.중간에 폭발이 발생하면 몇 개의 기록을 처리해야 합니까? 아니면 한 번에 몇 개의 기록을 추가/삭제/마사지를 해야 합니까?나는 약 100파운드를 결정했다.
나처럼 미친 듯이 비슷한 곤경에 빠지지 않았으면 좋겠어.우선, 너는 이런 상황을 피하기 위해 충분히 똑똑해야 한다.하지만 나처럼 미치면 클럽에 가입하는 것을 환영한다.우리는 네가 이곳에서 겪은 문제를 매우 동정한다.나도 네가 여기까지 읽어줘서 고마워, 이 미친 미묘하고 인내심 있는 영혼아.

다섯 번째, 그것을 싸라


위의 그림에서 보듯이 모든 제품은 한 라인에서 납품할 수 있지만, 완성되기 전에, 로터53이 받아들일 수 있도록 맨 위에 '변경' 키를 추가해야 한다.이것은 쉽게 실현될 수 있다. 단지 하나의 키로 결과를 지도에 파이프라인화하고 문장 (".") 을 사용하면 된다.모두follows를 선택합니다.

6.신청


지금 우리는 이 기록들을 실제로 응용할 준비가 되어 있으니, 우리가 얼마나 큰 손실을 초래할 수 있는지 보자.이 질의를 통해 레코드의 모든 출력을 가져오려면 다음과 같이 하십시오.
aws route53 list-resource-record-sets \
  --hosted-zone-id ${hostedzoneid} \
  --max-items 10000 \
  --output json
jq player 응용 프로그램 화면 하단에서 사용할 수 있는 편리한 명령줄 옵션을 가져옵니다.
jq --compact-output '[.ResourceRecordSets[] |
  select(.AliasTarget.DNSName == "something.us-west-2.elb.amazonaws.com.") |
  {Action: "DELETE", ResourceRecordSet: {Name: .Name, Type: .Type, AliasTarget: .AliasTarget}}] |
  _nwise(1) |
  {Changes: .}'
split을 사용하여 개별 파일 세트를 생성합니다.
split -l 100
그런 다음 모든 파일을 반복하여 라우팅 53에 적용합니다.
for file in x*; do
  aws route53 change-resource-record-sets \
  --hosted-zone-id=${hostedzoneid} \
  --cange-batch=file://${file}
done

7. 이윤


나는 당신이 이번 탐색을 좋아하고 당신이 얼마나 빠른 속도로 jq로 JSON 데이터를 조작하여 신속하고 효율적이며 자동화된 방법을 만들어 지역의 대량의 오래된 Route53 항목을 제거할 수 있기를 바랍니다!
영웅 이미지:Sharon McCutcheon via Unsplash.com

좋은 웹페이지 즐겨찾기