AWS 쓰는 개발자 지금 멈춰…

AWS 로컬 에뮬레이터, 봇 허니팟, 크로스플랫폼 앱 런타임을 상징하는 녹색 테마 일러스트
AWS 로컬 에뮬레이터, 봇 허니팟, 크로스플랫폼 앱 런타임을 상징하는 녹색 테마 일러스트
DIGEST
  • AWS가 공식 로컬 에뮬레이터를 공개했다. 계정도, 과금도 없이 내 노트북과 CI에서 AWS API를 그대로 호출한다. 단, 프로덕션과 보안 테스트는 금지.
  • Expo가 React 없는 앱 런타임 Exact를 실험 공개했다. AI 에이전트가 직접 빌드·실행·스크린샷·탭까지 하도록 설계된 “에이전트 네이티브” 런타임이다.
  • 허니팟 링크 하나로 봇 트래픽 80%를 잘라낸 B6. 하루 216GB가 25GB로 줄었다. 대신 경고도, 이의신청도 없다.

“프로덕션 워크로드나 보안 테스트에는 쓰지 마세요.” AWS가 자기 손으로 만든 에뮬레이터 README에 적어 둔 문장입니다. 10년 넘게 서드파티가 메워 온 자리를 본사가 직접 채우면서도, 쓰임새는 선을 그어 놓았습니다. 이번 Tech Digest는 GeekNews에서 가장 많은 표를 받은 세 가지 이야기를 묶었습니다. AWS의 로컬 에뮬레이터, Expo의 React 없는 런타임 Exact, 그리고 영국 개발자 테렌스 에덴이 봇을 잡으려고 만든 투박한 망치 B6. 셋 다 “개발자의 시간과 돈을 어디서 아낄 것인가”라는 같은 질문을 다른 각도에서 던지고 있습니다.

AWS가 마침내 자체 AWS 에뮬레이터를 만들었다

계정 없이, 과금 없이, 내 노트북에서 AWS API를 호출한다

AWS가 GitHub aws 조직 아래에 aws-emulator 저장소를 공개했습니다. 설명은 간결합니다. AWS를 호출하지 않고 “내 머신, 개발 서버, 혹은 CI에서” 소프트웨어를 테스트하기 위한 로컬 에뮬레이터이며, AWS 계정이 필요 없고 별도 서비스 요금도 없습니다. 공개 하루 만에 GitHub 스타 2.8천 개, 포크 62개를 기록했고 GeekNews에서도 27포인트로 하루 1위에 올랐습니다. 커밋 수가 29,684개에 달하는 걸 보면 내부에서 오래 굴리던 도구를 밖으로 꺼낸 것으로 보입니다.

구조는 Rust 워크스페이스입니다. AWS 서비스 하나당 크레이트 하나가 대응되고, 각 크레이트는 AWS가 API 정의에 쓰는 Smithy 모델로부터 생성됩니다. 사용 방식은 세 가지입니다. 첫째, 서버 모드. Linux에서는 RPM 또는 Debian 패키지로 설치하고, macOS와 Windows는 AWS가 제공하는 짧은 Dockerfile로 컨테이너를 띄웁니다. 에뮬레이터는 127.0.0.1:9297에서 자체 서명 인증서로 HTTPS를 서빙하고, AWS CLI나 SDK의 엔드포인트만 여기로 돌리면 됩니다. 둘째, 임베디드 모드. Rust 프로젝트라면 dev-dependency로 넣어 테스트마다 격리된 인스턴스를 프로세스 안에서 띄울 수 있습니다. 엔드포인트도, 인증서도, 환경 변수도 설정할 필요가 없습니다. 셋째, AI 에이전트용 스킬. aws-emulator 스킬을 설치하면 에이전트가 알아서 쓰는데, AWS CLI 2.35.0 이상이 필요합니다.

PR은 받지 않고, 100GB 디스크가 필요하고, 텔레메트리는 켜져 있다

README에는 솔직한 제약이 나열돼 있습니다. 소스 빌드는 Linux x86_64와 aarch64만 지원하고, 콜드 풀 빌드에는 target 디렉터리에 최소 100GB의 여유 공간이 필요합니다. 텔레메트리는 기본으로 켜져 있으며 –telemetry off 플래그, EMULATOR_TELEMETRY=off 환경 변수, config.toml의 enabled = false 셋 중 하나로 끌 수 있습니다. 수집 기록에는 “요청·응답 내용, 코드, 자격 증명, 개인 데이터가 절대 포함되지 않는다”고 명시했습니다. 실제 AWS와의 일치도는 릴리스 페이지에 서비스별 점수로 공개하고, 알려진 차이는 issues/things-that-do-not-work 디렉터리에서 추적하다가 고쳐지면 things-that-now-work로 옮깁니다. 라이선스는 CC0-1.0, vendor 코드는 Apache 2.0입니다. 그리고 한 줄 더. “이 저장소는 PR을 받지 않습니다.” 버그 리포트는 Issues로만 받습니다.

GeekNews 댓글은 대체로 “드디어”라는 반응이었지만, 보안 문서를 읽은 한 사용자는 IAM과 KMS 테스트에는 쓰지 말라는 경고를 짚었습니다. IAM 정책은 부분적으로만 평가되고, 에뮬레이터 자체 키로 서명한 요청은 절대 거부되지 않으며, 크로스 계정 호출은 지원하지 않는다는 겁니다. 기존에 같은 역할을 하던 Floci나 Testcontainers를 추천하는 의견도 있었고, “AI로 만든 도구가 해자를 무너뜨리는가, 아니면 AWS API 호환성 자체가 해자인가”라는 논쟁도 붙었습니다.

Tech Insight — 이 프로젝트의 진짜 의미는 “AWS가 LocalStack을 따라 했다”가 아닙니다. 에이전트용 스킬을 설치 경로 첫 번째로 올려 둔 점, 그리고 Rust 테스트 안에 격리 인스턴스를 박아 넣는 임베디드 모드가 핵심입니다. AI 코딩 에이전트가 클라우드 코드를 작성하고 스스로 검증하는 루프를 AWS가 공식 지원하기 시작했다는 뜻입니다. 다만 IAM이 반쪽짜리라는 점은 기억해야 합니다. 로컬에서 통과한 권한 테스트는 통과한 게 아닙니다. 기능 로직은 에뮬레이터에서, 권한과 보안은 실제 샌드박스 계정에서 검증하는 이중 구조가 당분간 정답입니다.


Expo의 Exact, React 없이 웹·iOS·macOS·Linux를 한 번에

“코드 대부분은 AI 에이전트가 쓸 것”이라는 전제에서 출발한 런타임

React Native 생태계의 핵심인 Expo가 전혀 다른 실험을 꺼냈습니다. GitHub expo 조직에 공개된 Exact는 Rust 기반 크로스플랫폼 앱 런타임입니다. README의 첫 문장은 “앱을 한 번 작성하면 웹, macOS, iOS, Linux에서 네이티브로 실행된다”이고, 바로 다음 전제가 “Exact는 코드의 상당 부분을 AI 에이전트가 작성한다고 가정한다”입니다. 세 가지 원칙은 에이전트 네이티브 설계, 속도, 그리고 “웹처럼 쓰고 플랫폼으로 배포한다”입니다. 상태는 명확히 pre-1.0, 라이선스는 MIT이며 README 스스로 “매일 바뀌고, API 안정성도 하위 호환도 마이그레이션 가이드도 의도적으로 없다”고 밝힙니다.

UI는 Contract라는 작은 선언형 언어로 작성합니다. JSX도, React도 없습니다. 데이터와 로직은 TypeScript나 Rust로 쓰고, Contract 컴파일러가 문법·타입·분석·로어링 네 단계를 거쳐 상수 데이터를 “플랜”에 미리 구워 넣습니다. 첫 프레임을 그리는 데 추가 작업이 필요 없다는 설계입니다. 렌더러는 플랫폼마다 따로 있습니다. 웹은 약 20KB 런타임이 실제 DOM과 CSS를 구동하고, macOS는 AppKit과 CoreText, iOS는 UIKit과 CoreText, Linux는 vello 또는 tiny-skia로 GPU·CPU 페인팅을 하며 DRM/KMS에 직접 그릴 수도 있습니다. 네이티브 레이아웃은 CSS block·flex·grid 규칙을 적용하도록 패치한 Taffy 커널이 담당합니다. “UI에는 웹뷰도 JavaScript 브리지도 없다”는 문장이 이 구조를 요약합니다.

에이전트 명령 10개, 콜드 스타트 100ms p50

에이전트 네이티브라는 말은 구체적입니다. 모든 플랫폼에서 동일하게 동작하는 열 가지 명령(tree, screenshot, tap, type, state, layout, logs, clock, prefer, perf)이 scripts/agent.mjs 하나로 제공됩니다. 에이전트는 앱의 위젯 트리를 읽고, 탭하고, 입력하고, 가상 시계를 60초 앞당기고, 상태를 덤프하고, 스크린샷을 찍어 스스로 검증합니다. 성능 목표표도 숫자로 못 박았습니다. 콜드 스타트에서 인터랙티브 첫 프레임까지 100ms p50, 편집 저장에서 화면 반영까지 100ms p50, 첫 픽셀 전 실행되는 앱 JavaScript는 0, 한 줄 수정 후 해당 크레이트 리빌드 30초, 전체 블로킹 체크 스위트 65초. RealWorld(Conduit) 벤치마크에서는 React SSR 빌드가 하이드레이션을 마치기 약 300ms 전에 런타임이 떠 있었고, 코드 크기는 26KB 대 81KB였다고 적었습니다. exact new로 만든 새 앱에서는 저장 후 99ms 만에 페이지에 반영됐다는 수치도 있습니다.

준비물은 Rust(rustup), Bun 1.4.2, Apple 호스트에서는 Xcode와 Chrome입니다. bun scripts/exact.mjs setup을 한 번 실행하고 exact new로 앱을 만듭니다. 첫 네이티브 빌드는 10~15분, 이후 빌드는 1~2분 정도입니다. 아직 Android는 초기 단계이고 Windows는 부분 지원입니다. GeekNews 댓글에서는 가상 시계로 비동기 테스트를 다루는 접근이 유용하다는 의견과 함께, 단일 개발자 품질에 대한 의심, “크로스플랫폼이라면서 왜 Windows와 Android가 빠졌나”라는 지적, Slint나 Qt/QML과의 비교, 그리고 “커스텀 DSL보다 그냥 JSX/TSX가 낫다”는 반론이 나란히 나왔습니다.

Tech Insight — Exact가 흥미로운 이유는 기술보다 전제입니다. 사람이 읽기 편한 JSX 대신 컴파일러가 검증하기 쉬운 Contract를 택했고, 디버깅 UI 대신 에이전트가 호출할 10개 명령을 먼저 만들었습니다. 사람 개발자 경험(DX)이 아니라 에이전트 경험(AX)을 1순위로 둔 프레임워크의 첫 사례에 가깝습니다. 지금 당장 제품에 쓸 물건은 아닙니다. 하지만 “AI가 쓰는 코드라면 문법도 툴체인도 달라져야 한다”는 가설을 Expo 규모의 팀이 공개 실험하기 시작했다는 신호는 React Native 로드맵을 읽는 사람이라면 놓치지 않는 게 좋습니다.


투박한 차단 망치 B6, 허니팟 하나로 봇 트래픽 80%를 잘랐다

한 달에 2.5TB, 취미 사이트를 갉아먹은 AI 크롤러

영국 개발자 테렌스 에덴은 11월 9일 블로그에 “Blunt Banhammer Blocks Basic Bots Ballistically”, 줄여서 B6를 공개했습니다. 계기는 숫자였습니다. 그가 운영하는 취미 사이트 OpenBenches.org가 지난달 “방문자에게 2.5TB가 넘는 데이터를 전송했다”는 겁니다. 그는 그 대부분이 “데이터를 끝없이 크롤링하고 이미지를 빨아들이는 AI 봇”이라고 봤고, “이 원치 않는 기생충을 박멸하는 무차별적 도구”를 만들기로 했습니다. 제프 스타의 Blackhole에서 느슨하게 영감을 받았다고 밝혔습니다.

작동 원리는 네 단계입니다. /honeypot/ 같은 디렉터리에 index.php를 둡니다. robots.txt에 User-agent: *와 Disallow: /honeypot/을 추가합니다. 모든 페이지에 허니팟으로 가는 숨은 링크를 심는데, aria-hidden=”true”, 제로폭 결합자 텍스트, CSS display: none !important를 모두 써서 사람 눈과 스크린리더에는 절대 보이지 않게 합니다. 그 링크를 밟는 순간 PHP 스크립트가 방문자 IP와 User-Agent를 .htaccess의 BLOCKED IPs 블록에 추가하고, 이후 그 IP는 RewriteCond %{REMOTE_ADDR}에 걸려 사이트 전체에서 402 “Payment Required – Access Denied” 응답만 받습니다. 결과는 분명했습니다. “B6를 돌린 지 일주일 만에 400개가 넘는 IP를 차단했다.” 피크 시 하루 216GB였던 전송량은 “지금 약 25GB로 떨어졌다.” 아직 불만 접수는 한 건도 없다고 합니다.

첫 방문에 즉시 차단, 경고도 이의신청도 없다

에덴 스스로 “이건 투박한 망치”라고 인정합니다. User-Agent도 국가도 보지 않고, 첫 히트에 바로 막으며, 경고나 해제 절차가 없습니다. 유용한 봇도 robots.txt를 무시하면 걸리고, 탈취된 IP가 차단되면 무고한 사용자가 피해를 볼 수 있으며, .htaccess 항목이 수천 개로 불어나면 서버가 느려질 수 있다는 한계를 그가 직접 나열했습니다. 반대로 “B6에는 오탐이 없다”고도 주장합니다. 일반 사용자는 그 링크를 따라갈 수 없고, 예의 바른 봇은 따라가지 않기 때문입니다. 물론 robots.txt는 무시하되 허니팟은 건드리지 않는 영리한 봇은 잡지 못합니다. 향후에는 IP 지리 정보를 기록하고 오래된 차단을 자동 해제할 계획입니다. 댓글에서는 Apache RewriteMap으로 .htaccess 재작성을 피하라는 제안, 봇넷 트래픽 아래서 파일 쓰기 부하가 문제라는 경고가 나왔고, Lobsters에서는 프록시 주소 검증 없이 X-Forwarded-For를 신뢰하면 누구나 남의 IP를 차단 목록에 올릴 수 있다는 지적이 있었습니다. “access log를 tail해서 fail2ban에 넘기는 게 더 단순하다”는 의견도 있었습니다. 라이선스는 글은 CC BY-SA, 코드는 AGPL v3로 다뤄 달라고 요청했습니다.

Tech Insight — B6는 기술이 아니라 비용 문제의 해법입니다. 취미 사이트 한 곳이 AI 크롤러 때문에 월 2.5TB를 감당하는 시대에, 정교한 WAF 대신 PHP 스크립트 한 장으로 80%를 걷어냈다는 점이 요지입니다. 다만 자사 서비스에 그대로 옮기면 안 됩니다. X-Forwarded-For 스푸핑 취약점, 공유 IP(기업 NAT, 통신사 CGNAT) 뒤의 정상 사용자, 그리고 “402 Payment Required”라는 재치가 검색엔진 봇에 돌아갈 때의 SEO 영향까지 생각해야 합니다. 허니팟 아이디어는 가져가되, 차단은 fail2ban이나 CDN 레벨에서 만료 시간과 함께 적용하는 쪽이 현실적입니다.

관련 글

출처

  1. GitHub — aws/aws-emulator (README)
  2. GeekNews — AWS가 마침내 자체 AWS 에뮬레이터를 만들었다
  3. GitHub — expo/exact (README)
  4. GeekNews — Expo의 Exact, React 없이 웹·iOS·macOS·Linux 앱을 만드는 AI 에이전트 중심 런타임
  5. Terence Eden — Blunt Banhammer Blocks Basic Bots Ballistically (2026-11-09)
  6. GeekNews — 투박한 차단 망치로 단순한 봇을 가차 없이 막기

AI Biz Insider · Tech Digest · aibizinsider.com

코멘트

답글 남기기