
고속/저비용 CommonCrawl RegExp (Node.js)
Image
WARCannon은 '인터넷을 grep하는' 과정을 단순화하고 저렴화하기 위해 만들어졌습니다.
WARCannon을 사용하면 다음을 수행할 수 있습니다:
WARCannon은 AWS 기술을 영리하게 활용하여 수평적으로 모든 용량으로 확장하고, 스팟 플릿과 동일 리전 데이터 전송을 통해 비용을 최소화하며, 놀라운 속도(노드당 최대 100Gbps)로 S3에서 데이터를 가져오고, 수백 개의 CPU 코어에서 병렬 처리하며, DynamoDB 및 CloudFront를 통해 상태를 보고하고, S3를 통해 결과를 저장합니다.
전체적으로 WARCannon은 약 30달러로 몇 시간 안에 400TB에 걸쳐 여러 정규식 패턴을 처리할 수 있습니다.
가장 빠르고 쉬운 시작 방법은 AWS CloudShell을 사용하는 것입니다. 다음 한 줄 명령을 붙여넣기만 하면 됩니다:
source <(curl https://raw.githubusercontent.com/c6fc/warcannon/master/cloudshell/deploy.sh)
WARCannon의 master 브랜치가 아닌 다른 브랜치를 사용하려면 다음을 입력하세요:
export GIT_BRANCH=branch_name
source <(curl https://raw.githubusercontent.com/c6fc/warcannon/$GIT_BRANCH/cloudshell/deploy.sh)
참고: CloudShell 배포는 임시 스토리지를 사용하므로 CloudShell이 종료되면 사용자 정의 정규식 패턴이 손실됩니다. WARCannon을 자주 사용할 예정이라면 아래의 '로컬 설치'를 권장합니다.
WARCannon은 다음이 설치되어 있어야 합니다:
전문가 팁: AWS에 있는 다른 것들과 깔끔하게 분리하려면 WARCannon을 새 계정에 배포하는 것을 강력히 권장합니다. AWS의 '조직' 콘솔에서 새 계정을 쉽게 만들 수 있습니다. '강력히 권장'한다는 것은 '진심으로 다른 것 옆에 설치하지 마세요'라는 뜻입니다.
먼저 레포지토리를 클론하고 예제 설정을 복사하세요.
$ git clone [email protected]:c6fc/warcannon.git
$ cd warcannon
warcannon$ cp settings.json.sample settings.json
settings.json을 원하는 대로 편집하세요:
필수 설정
nodeInstanceType: 병렬 처리에 사용할 인스턴스 유형 배열입니다. 'c' 유형이 이 목적에 가장 가성비가 좋으며, 모든 크기를 사용할 수 있습니다. 실제 캠페인에는 ["c5n.18xlarge"]를 권장합니다.nodeCapacity: 병렬 처리 중 요청할 노드 수입니다. 결과 노드는 지정한 nodeInstanceTypes의 임의 분포가 됩니다.nodeParallelism: vCPU당 동시에 처리할 WARC 수입니다. 여기서는 2가 적절합니다. 노드에 이 수준의 병렬 처리를 실행하기에 충분한 RAM이 없는 경우 ( 'c' 유형 인스턴스에서 발생할 수 있음), 대신 안전한 최대 병렬 처리 수준에서 실행됩니다.nodeMaxDuration: 컴퓨팅 노드의 최대 수명(초)입니다. 이 시간이 지나도 작업이 완료되지 않으면 노드가 자동으로 종료됩니다. 기본값은 24시간입니다.선택적 설정 (사용하지 않으면 완전히 생략)
sshKeyName: us-east-1에 이미 존재하는 EC2 SSH 키의 이름입니다.allowSSHFrom: SSH를 허용할 CIDR 마스크입니다. 일반적으로 <yourpublicip>/32입니다.설치하려면 다음을 실행하세요:
$ npm install
$ npm link
$ warcannon deploy
WARCannon에서 캠페인을 실행하는 것은 다음 몇 단계로 설명할 수 있는 간단하고 따라하기 쉬운 워크플로우를 사용합니다:
warcannon deploywarcannon testLocal -swarcannon testwarcannon list 2022warcannon populate 2022-21warcannon firewarcannon syncResults로 S3에서 결과 검색각 단계에 대한 자세한 이해를 위해 계속 읽어보세요.
WARCannon은 AWS Open Data 프로그램을 통해 Common Crawl에서 데이터를 공급받습니다. Common Crawl은 스파이더가 검색한 데이터가 웹사이트 텍스트뿐만 아니라 JavaScript, TypeScript, 전체 HTML, CSS 등 다른 텍스트 기반 콘텐츠도 캡처한다는 점에서 독특합니다. 고유한 구성 요소를 식별할 수 있는 적절한 정규식을 구성함으로써 연구자들은 웹사이트가 사용하는 기술을 통해 웹사이트를 식별할 수 있으며, 웹사이트 자체에 접촉하지 않고도 가능합니다. 문제는 수백 테라바이트의 데이터를 구문 분석해야 한다는 것인데, 이는 가용한 자원에 관계없이 어려운 작업입니다. 다행히 WARCannon에는 이를 수행하는 데 사용할 수 있는 여러 도구가 있습니다!
인터넷을 grep하는 것은 겁쟁이에게 적합한 일이 아니지만, 효과적인 체로 시작하는 것이 첫걸음입니다. WARCannon은 실제 Common Crawl 데이터에 대해 정규식을 로컬에서 검증할 수 있도록 지원합니다. 먼저 lambda_functions/warcannon/matches.js를 열고 regex_patterns 객체를 수정하여 name: pattern 형식으로 사용하려는 정규식을 포함시키세요. 다음은 기본 검색 세트의 예입니다:
exports.regex_patterns = {
"access_key_id": /(\'A|"A)(SIA|KIA|IDA|ROA)[JI][A-Z0-9]{14}[AQ][\'"]/g,
};
이 표현식과 일치하는 문자열은 결과에서 해당 키(이 경우 access_key_id) 아래에 저장됩니다. 전문가 팁: RegExr을 'JavaScript' 형식으로 사용하여 알려진 일치 항목에 대해 정규식을 작성하고 테스트하세요.
지정된 도메인의 결과만 캡처하는 옵션도 있습니다. 이렇게 하려면 포함하려는 FQDN으로 domains 배열을 채우기만 하면 됩니다. 거의 가치가 없으므로(절약되는 처리 노력이 매우 적음) 비워두는 [] 것이 좋지만, 일부 특수한 경우에는 유용할 수 있습니다.
exports.domains = ["example1.com", "example2.com"];
matches.js가 채워지면 다음 명령을 실행하세요:
warcannon$ warcannon testLocal -s
원하는 경우 commoncrawl S3 버킷에 있는 WARC의 경로를 추가할 수도 있지만, 그렇지 않으면 하드코딩된 기본값이 사용됩니다.
WARCannon은 WARC 파일을 스트림 처리(또는 -s를 생략하면 전체 다운로드)하여 설정된 일치 항목을 찾습니다. ctrl+c로 중단하거나 처리가 완료되면 WARCannon은 결과를 ~/.warcannon/ 폴더에 저장합니다. 이를 통해 최소한의 대역폭으로 일반적인 일치 항목을 매우 빠르게 테스트할 수 있습니다.
그 외에도 WARCannon은 로컬에서 실행할 때 정규식의 총 컴퓨팅 비용을 평가하려고 시도합니다. 이를 통해 캠페인을 실행하기 전에 특정 정규식이 성능에 큰 영향을 미칠지 알 수 있습니다.

때로는 단순한 정규식 패턴만으로는 충분하지 않으며 올바른 정보를 반환하기 위해 추가 단계가 필요합니다. 이 경우 동일한 키 이름으로 exports.custom_functions 객체에 함수를 추가하면 원하는 추가 처리를 수행할 수 있습니다.
exports.regex_patterns = {
"access_key_id": /(\'A|"A)(SIA|KIA|IDA|ROA)[JI][A-Z0-9]{14}[AQ][\'"]/g,
};
exports.custom_functions = {
"access_key_id": function(match) {
// Ignore matches with 'EXAMPLE' in the text, since this is common for documentation.
if (match.text(/EXAMPLE/) != null) {
// Returning a boolean 'false' discards the match.
return false
}
}
}
참고: WARCannon은 엄청난 속도로 텍스트를 처리하도록 설계되었습니다. 원하는 모든 유형의 작업을 수행하는 것이 확실히 가능하지만, 네트워크 호출과 같은 지연 시간이 긴 사용자 정의 함수를 추가하면 처리 시간과 비용이 크게 증가할 수 있습니다. 또한 네트워크 호출로 인해 웹사이트에 대한 많은 호출이 발생하여 문제가 발생할 수 있습니다. 이러한 함수를 현명하게 사용하세요.
AWS 비용은 특히 연구 목적으로만 사용할 때 불안을 유발할 수 있습니다. WARCannon은 전체 캠페인 외에도 일회성 실행을 허용하도록 구축되었으므로 얻은 결과에 대해 확신을 가질 수 있습니다. testLocal로 얻은 결과가 만족스러우면 업데이트된 일치 항목을 배포하고 클라우드 기반 테스트를 쉽게 실행할 수 있습니다:
warcannon$ warcannon deploy
warcannon$ warcannon test
다시 말하지만, 원하는 경우 WARC 경로를 포함할 수 있지만 필수는 아닙니다.
이렇게 하면 구성한 정규식을 사용하여 Lambda 함수가 동기적으로 실행되고 즉시 결과를 반환합니다. 이 프로세스는 약 2.5분이 소요되므로 마법이 일어나는 동안 기다리는 것을 두려워하지 마세요.
Lambda에서 얻은 결과가 만족스러우면 실제로 인터넷을 grep할 준비가 된 것입니다. 먼저 몇 가지 기본적인 정리 작업을 수행한 다음 시작하겠습니다.
WARCannon은 AWS Simple Queue Service를 사용하여 컴퓨팅 노드에 작업을 분배합니다. 이전 실행으로 인해 결과가 오염되지 않도록 하려면 WARCannon에 큐를 비우도록 지시할 수 있습니다:
warcannon$ warcannon emptyQueue
[+] Cleared [ 15 ] messages from the queue
그런 다음 큐 상태를 확인할 수 있습니다:
warcannon$ warcannon status
Deployed: [ YES ]; SQS Status: [ EMPTY ]
Job Status: [ INACTIVE ]
Active job url: https://d201offlnmhkmd.cloudfront.net
진행하기 전에 다음을 확인하세요:
컴퓨팅 노드가 소비할 큐 메시지를 생성하려면 먼저 SQS를 크롤 데이터로 채워야 합니다. WARCannon에는 사용 가능한 스캔을 표시하는 기능부터 시작하여 이를 돕는 여러 명령이 있습니다. 이 경우 2021년에 사용 가능한 스캔을 살펴보겠습니다:
warcannon$ warcannon list 2021
CC-MAIN-2021-04
CC-MAIN-2021-10
작업할 문자열 "2021"과 일치하는 두 개의 스캔이 있습니다. 이제 WARCannon에 이러한 스캔 중 하나를 기반으로 큐를 채우도록 지시할 수 있습니다. 이번에는 스캔 중 하나를 고유하게 식별하는 매개변수를 제공해야 합니다. "2021-04"가 적합합니다. 청크 수와 청크 크기를 지정하여 부분 스캔만 채우도록 선택할 수도 있지만 지금은 건너뛰겠습니다.
warcannon$ warcannon populate 2021-04
{Created 799 chunks of 100 from 79840 available segments"
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
배포 중에 WARCannon은 CommonCrawl에서 정보를 빠르게 쿼리하는 데 사용할 수 있는 Athena의 데이터베이스(warcannon_commoncrawl) 및 작업 그룹(warcannon)을 자동으로 프로비저닝합니다. 이는 특정 쿼리를 기반으로 희소 캠페인을 채우는 데 특히 유용할 수 있습니다. 예를 들어 다음 쿼리는 'example.com'의 응답이 포함된 WARC를 검색합니다.
SELECT
warc_filename,
COUNT(url_path) as num
FROM
warcannon_commoncrawl.ccindex
WHERE
subset = 'warc' AND
url_host_registered_domain IN ('example.com') AND
crawl = 'CC-MAIN-2021-04'
GROUP BY warc_filename
ORDER BY num DESC
Athena 콘솔을 사용하여 결과를 미세 조정할 수 있지만, 작업을 채우려면 WARCannon 명령줄에서 쿼리를 실행해야 합니다:
warcannon queryAthena "SELECT warc_filename, COUNT(url_path) as num FROM warcannon_commoncrawl.ccindex WHERE subset = 'warc' AND url_host_registered_domain IN ('example.com') AND crawl = 'CC-MAIN-2021-04' GROUP BY warc_filename ORDER BY num DESC"
[+] Query Exec Id: 0319486e-1846-491c-badf-2e23ae213974 .. SUCCEEDED
그런 다음 WARCannon은 쿼리 결과를 사용하여 큐를 채울 수 있으며, 결과 집합의 warc_filename 열을 기반으로 수행합니다. 따라서 중복을 피하기 위해 이 열을 group by하거나 distinct()를 사용하는 것이 좋습니다. 이 필드가 없으면 WARCannon에서 오류가 발생합니다. 쿼리 실행 ID를 populateAthena 명령에 전달하여 Athena 결과로 큐를 채웁니다.
warcannon populateAthena 0319486e-1846-491c-badf-2e23ae213974
{Created 26 chunks of 10 from 251 available segments"
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
참고: 단일 도메인에 대한 희소 작업을 채우는 것이 좋은 생각처럼 보일 수 있지만, 종종 그렇지 않습니다. 단일 도메인의 응답은 많은 WARC 하위 집합에 광범위하게 분산되는 경향이 있습니다. 위의 예시 쿼리를 사용하면 각 WARC의 약 150,000개 레코드 중 중간 규모 웹사이트의 최대 단일 적중이 한 자리 수에 불과하다는 것을 명확히 알 수 있습니다.
큐가 채워지면 발사할 준비가 되었습니다. WARCannon은 몇 가지 상태 확인을 수행하여 모든 것이 정상인지 확인한 다음 캠페인 구성을 보여주고 최종화하기 전에 마지막으로 중단할 기회를 제공합니다.
warcannon$ warcannon fire
[!] This will request [ 6 ] spot instances of type [ m5n.24xlarge, m5dn.24xlarge ]
lasting for [ 86400 ] seconds.
To change this, edit your settings in settings.json and run warcannon deploy
--> Ready to fire? [Yes]:
'Yes'로 응답하여 방아쇠를 당기세요.
--> Ready to fire? [Yes]: Yes
{
"SpotFleetRequestId": "sfr-03dd32b8-51f7-4c8e-802b-a702fc3c8c95"
}
[+] Spot fleet request has been sent, and nodes should start coming online within ~5 minutes.
Monitor node status and progress at https://d201offlnmhkmd.cloudfront.net
응답에는 고유한 상태 URL 링크가 포함되어 있으며, 여기서 캠페인 진행 상황과 각 노드의 성능을 모니터링할 수 있습니다.

WARCannon 결과는 JSON 형식으로 S3에 저장되며, 결과를 생성한 각 노드별로 구분됩니다. Athena 결과는 동일한 버킷의 /athena/ 접두사 아래에 저장됩니다. syncResults 명령을 사용하여 캠페인 결과를 로컬 머신의 ~/.warcannon/ 폴더에 동기화할 수 있습니다.
warcannon syncResults
sync: s3://warcannon-results-202...
sync: s3://warcannon-results-202...
sync: s3://warcannon-results-202...
...
그런 다음 clearResults로 결과 버킷을 비울 수 있습니다.
warcannon clearResults
delete: s3://warcannon-results-202...
delete: s3://warcannon-results-202...
delete: s3://warcannon-results-202...
...
[+] Deleted [ 21 ] files from S3.
질문이 있거나, 도움이 필요하거나, 기여하고 싶거나, 성과를 자랑하고 싶으신가요? Discord에서 함께하세요!