Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs-site/scripts/capture-screenshots.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,14 +168,14 @@ async function login(page: Page): Promise<void> {
}
});

// Wait for redirect back to app (dark-fallback path only — v2 defaults to /login, ADR-042).
// Wait for redirect back to app (dark-fallback path only — v2 defaults to /login).
// Match against BASE_URL's own origin, not just "amazoncognito.com" — a custom Cognito
// domain (CLAUDE.md's `a-ops-v2-auth-*`) wouldn't contain that substring, which would make
// this predicate true immediately on the auth page itself instead of after the redirect.
await page.waitForURL((u) => URL_POLICY.isApp(u.href), { timeout: 60000 });
console.log('Login successful, redirected to app.');
} else if (new URL(currentUrl).pathname === '/login' || (await page.locator('input[type="password"]').count()) > 0) {
// v2's self-hosted /login form (ADR-042) — email + password + a locale-dependent submit
// v2's self-hosted /login form — email + password + a locale-dependent submit
// button ("로그인 →" / "Sign in →"), no placeholder text and no basePath on redirect.
console.log('Custom login page detected, filling credentials...');
if (!LOGIN_PASSWORD) throw new Error('AWSOPS_LOGIN_PASSWORD is required');
Expand Down
28 changes: 8 additions & 20 deletions docs-site/scripts/pptx/build-awsops-intro-pptx.js
Original file line number Diff line number Diff line change
Expand Up @@ -466,9 +466,6 @@ kit.sectionDivider(pres, {
• JWKS(JSON Web Key Set): 토큰 서명 검증용 공개키 집합
• CMK(Customer Managed Key): 고객 관리형 KMS 암호화 키

[출처]
• AWSops 결정 기준선 — 리포지토리 docs/decisions/BASELINE.md

[변경 이력]
• 2026-08-11: 초기 작성
• 2026-08-12: AWS Light 테마 재설계`);
Expand All @@ -489,8 +486,8 @@ kit.sectionDivider(pres, {
});
const cols = [
["대화형 어시스턴트", "ai_agent", "자연어 질문을 자동 라우팅하거나 슬래시(/)로 섹션을 지정. \"두 리소스 간 통신이 안 되는 원인\", \"이 IAM 역할 과다권한 점검\" 같은 운영 질문에 라이브 근거로 답변", A.blue],
["aws-data — 리소스 질의 섹션", "aws_cloud", "\"리전별 EC2 몇 개야?\" 같은 수량·목록 질문을 받는 generic 섹션. 라이브 AWS 조회는 AgentCore 게이트웨이 경유가 원칙(ADR-001/010) — 별도 SQL 라이브 실행 경로는 설계상 차단", A.green],
["전문 섹션 6종 (자동 수집형 설계)", "evaluations", "유휴 리소스 스캔 · EKS/DB/MSK 최적화 · 지연 분석 · 인시던트 — 근거 데이터를 먼저 모으고 분석하는 설계 — 현재는 설계 원칙(ADR-001/010)에 따라 비활성, 표준 라우팅으로 대응. 총 16개 챗 섹션 구성", A.magenta],
["aws-data — 리소스 질의 섹션", "aws_cloud", "\"리전별 EC2 몇 개야?\" 같은 수량·목록 질문을 받는 generic 섹션. 라이브 AWS 조회는 AgentCore 게이트웨이 경유가 원칙 — 별도 SQL 라이브 실행 경로는 설계상 차단", A.green],
["전문 섹션 6종 (자동 수집형 설계)", "evaluations", "유휴 리소스 스캔 · EKS/DB/MSK 최적화 · 지연 분석 · 인시던트 — 근거 데이터를 먼저 모으고 분석하는 설계 — 현재는 설계 원칙에 따라 비활성, 표준 라우팅으로 대응. 총 16개 챗 섹션 구성", A.magenta],
];
const gw5 = 0.35, cw = (CW - gw5 * 2) / 3, cy = 3.15, chh = 2.85;
cols.forEach((c, i) => {
Expand All @@ -513,15 +510,12 @@ kit.sectionDivider(pres, {
• 챗 16섹션 정의 = 게이트웨이 9 + aws-data + 전문 섹션 6 (로컬 7종은 현재 비활성 — 표준 라우팅 대응)
• 라이브 AWS 조회는 AgentCore 게이트웨이 경유 원칙

AI 레이어의 핵심은 '분업'입니다. 범용 챗봇 하나가 모든 질문을 받는 게 아니라, 네트워크·컨테이너·데이터·보안·비용·모니터링·IaC·운영·외부관측 아홉 개 도메인 게이트웨이가 각자 전문 도구를 들고 있습니다. 질문이 오면 해당 도메인 에이전트가 라이브 AWS 데이터를 직접 조회해서 답합니다. 여기에 두 가지가 더 있습니다. aws-data는 리소스 수량·목록 질문을 받는 generic 섹션이고 — 라이브 AWS 조회는 어디까지나 AgentCore 게이트웨이 경유가 원칙입니다. 그리고 유휴 리소스 스캔이나 인시던트 분석 같은 여섯 개 전문 섹션은 근거 데이터를 먼저 모으고 분석하는 자동 수집형 설계입니다 — 이 경로는 현재 설계 원칙(ADR-001/010)에 따라 비활성이며 해당 질문은 표준 라우팅이 대응합니다. 합쳐서 16개 섹션 정의입니다. 모델은 Bedrock의 Claude 계열을 용도별로 혼용합니다.
AI 레이어의 핵심은 '분업'입니다. 범용 챗봇 하나가 모든 질문을 받는 게 아니라, 네트워크·컨테이너·데이터·보안·비용·모니터링·IaC·운영·외부관측 아홉 개 도메인 게이트웨이가 각자 전문 도구를 들고 있습니다. 질문이 오면 해당 도메인 에이전트가 라이브 AWS 데이터를 직접 조회해서 답합니다. 여기에 두 가지가 더 있습니다. aws-data는 리소스 수량·목록 질문을 받는 generic 섹션이고 — 라이브 AWS 조회는 어디까지나 AgentCore 게이트웨이 경유가 원칙입니다. 그리고 유휴 리소스 스캔이나 인시던트 분석 같은 여섯 개 전문 섹션은 근거 데이터를 먼저 모으고 분석하는 자동 수집형 설계입니다 — 이 경로는 현재 설계 원칙에 따라 비활성이며 해당 질문은 표준 라우팅이 대응합니다. 합쳐서 16개 섹션 정의입니다. 모델은 Bedrock의 Claude 계열을 용도별로 혼용합니다.

[약어]
• MCP(Model Context Protocol): AI 에이전트가 도구를 호출하는 표준 프로토콜
• MSK(Managed Streaming for Apache Kafka): AWS 관리형 Kafka 서비스

[출처]
• AWSops 결정 기준선 — 리포지토리 docs/decisions/BASELINE.md

[변경 이력]
• 2026-08-11: 초기 작성
• 2026-08-12: AWS Light 테마 재설계`);
Expand Down Expand Up @@ -586,7 +580,7 @@ AI 레이어의 핵심은 '분업'입니다. 범용 챗봇 하나가 모든 질
{
const s = newContent("읽기 전용은 제약이 아니라 신뢰다", "변경 기능 코드 동결 + K8s 읽기 verb 한정 + 계정당 ReadOnly 역할 1개의 안전 설계");
const cols = [
["거버넌스로 동결", "변경·자동 조치·코드 배포 기능은 아키텍처 결정 기록(ADR)으로 동결 — 해제는 별도 승인 절차가 필요한 제품 결정. 단일 문서화 예외(ADR-015): 시크릿 회전 시 자기 웹 서비스 재시작(기본 꺼짐, IAM 1개 ARN 한정)", A.purple],
["거버넌스로 동결", "변경·자동 조치·코드 배포 기능은 제품 정책으로 동결 — 해제는 별도 승인 절차가 필요한 제품 결정. 단일 문서화 예외: 시크릿 회전 시 자기 웹 서비스 재시작(기본 꺼짐, IAM 1개 ARN 한정)", A.purple],
["K8s는 읽기 verb만", "런타임 조회는 read-only verb(get·list·watch)만 발행 + BFF kind 허용목록으로 추가 제한. 온보딩은 opt-in Access Entry + AWS 관리형 read-only 정책 부여(제어부 권한 설정) — 워크로드 오브젝트는 변경하지 않음", A.green],
["계정 연결 = 역할 1개", "모니터링 대상 계정에는 ReadOnly 역할 하나만 요구. 3rd-party 연결은 ExternalId 필수로 혼동 대리인 차단(1st-party는 역할 ARN 고정 시 선택), 등록 시점에 실제 assume 검증 통과해야 연결", A.blue],
];
Expand All @@ -605,22 +599,16 @@ AI 레이어의 핵심은 '분업'입니다. 범용 챗봇 하나가 모든 질
addStatBand(s, [
{ value: "1개", label: "계정당 요구 IAM 역할 (ReadOnly)" },
{ value: "get·list·watch", label: "K8s에 발행하는 읽기 verb (BFF kind 허용목록)" },
{ value: "1", label: "문서화된 예외 — 자기 웹 재시작 (ADR-015 · 기본 off)" },
{ value: "1", label: "문서화된 예외 — 자기 웹 재시작 (기본 off)" },
{ value: "근거 필수", label: "발견마다 근거(소스) 첨부 — 프롬프트 강제 설계" },
]);
kit.addFooter(pres, s, ++pageNum);
s.addNotes(`[요약]
• 변경 기능은 거버넌스(ADR)로 동결 — 해제는 별도 승인 절차
• 변경 기능은 거버넌스로 동결 — 해제는 별도 승인 절차
• K8s 읽기 verb 한정 · 계정 연결은 ReadOnly 역할 1개 + 검증
• AI 오답의 최악 = 틀린 조언 (틀린 변경이 아님)

실무자 여러분께 가장 중요한 슬라이드입니다. AWSops에 변경 기능이 '없는' 것은 미완성이 아니라 설계 결정입니다. 자동 변경은 두 번째 장애의 가장 흔한 원인이고, 운영자가 도구를 신뢰하지 못하면 결국 쓰지 않게 됩니다. 그래서 변경·자동 조치 기능은 아키텍처 결정 기록으로 동결되어 있고, 해제하려면 별도 승인 절차가 필요합니다. 쿠버네티스에는 읽기 verb만 발행하고 — 온보딩 때 opt-in으로 Access Entry에 AWS 관리형 read-only 정책을 부여하는 것이 유일한 설정 변경이며 워크로드 오브젝트는 건드리지 않습니다 — 계정 연결에 요구하는 것도 읽기 전용 역할 하나뿐입니다. 유일한 문서화된 예외는 ADR-015 — 데이터베이스 시크릿 회전 때 자기 자신의 웹 서비스를 재시작하는 것 하나이며, 기본 꺼짐에 IAM도 해당 서비스 ARN 하나로 한정됩니다. 등록 시점에 실제로 역할을 assume해 봐서 성공해야만 연결됩니다. 이 원칙 덕분에 AI가 틀려도 최악의 경우가 '틀린 조언'입니다 — 인프라에는 아무 일도 일어나지 않습니다. 변경은 사람과 기존 IaC 파이프라인의 몫으로 남기고, AWSops는 판단 근거를 극단적으로 잘 만드는 데 집중합니다.

[약어]
• ADR(Architecture Decision Record): 아키텍처 결정과 근거를 남기는 공식 기록

[출처]
• AWSops 결정 기준선 — 리포지토리 docs/decisions/BASELINE.md
실무자 여러분께 가장 중요한 슬라이드입니다. AWSops에 변경 기능이 '없는' 것은 미완성이 아니라 설계 결정입니다. 자동 변경은 두 번째 장애의 가장 흔한 원인이고, 운영자가 도구를 신뢰하지 못하면 결국 쓰지 않게 됩니다. 그래서 변경·자동 조치 기능은 제품 정책으로 동결되어 있고, 해제하려면 별도 승인 절차가 필요합니다. 쿠버네티스에는 읽기 verb만 발행하고 — 온보딩 때 opt-in으로 Access Entry에 AWS 관리형 read-only 정책을 부여하는 것이 유일한 설정 변경이며 워크로드 오브젝트는 건드리지 않습니다 — 계정 연결에 요구하는 것도 읽기 전용 역할 하나뿐입니다. 유일한 문서화된 예외는 데이터베이스 시크릿 회전 때 자기 자신의 웹 서비스를 재시작하는 것 하나이며, 기본 꺼짐에 IAM도 해당 서비스 ARN 하나로 한정됩니다. 등록 시점에 실제로 역할을 assume해 봐서 성공해야만 연결됩니다. 이 원칙 덕분에 AI가 틀려도 최악의 경우가 '틀린 조언'입니다 — 인프라에는 아무 일도 일어나지 않습니다. 변경은 사람과 기존 IaC 파이프라인의 몫으로 남기고, AWSops는 판단 근거를 극단적으로 잘 만드는 데 집중합니다.

[변경 이력]
• 2026-08-11: 초기 작성
Expand Down Expand Up @@ -862,7 +850,7 @@ kit.sectionDivider(pres, {
{
const s = newContent("가장 많이 받는 질문, 셋", "권한 · AI 신뢰 · 기존 도구 — 도입 검토에서 반드시 나오는 질문 선답변");
const cols = [
["\"권한을 얼마나 줘야 하죠?\"", "읽기 전용 역할 하나입니다. 3rd-party 연결에는 ExternalId로 혼동 대리인을 차단하고, 등록 시점에 실제 assume 검증을 통과해야 연결됩니다. 모니터링 대상 계정에는 쓰기 권한을 요구하지도, 받지도 않습니다(호스트 자신에 대한 단일 문서화 예외는 ADR-015 웹 재시작뿐).", A.blue],
["\"권한을 얼마나 줘야 하죠?\"", "읽기 전용 역할 하나입니다. 3rd-party 연결에는 ExternalId로 혼동 대리인을 차단하고, 등록 시점에 실제 assume 검증을 통과해야 연결됩니다. 모니터링 대상 계정에는 쓰기 권한을 요구하지도, 받지도 않습니다(호스트 자신에 대한 단일 문서화 예외는 웹 재시작뿐).", A.blue],
["\"AI가 틀리면요?\"", "에이전트는 수집된 라이브 데이터에만 근거하고, 신호가 없으면 '데이터 불가'로 답하도록 설계되어 있습니다. 모든 발견에 근거가 첨부되고 — 읽기 전용이라 최악의 경우가 '틀린 조언'입니다. Bedrock은 고객 데이터를 모델 학습에 쓰지 않습니다.", A.purple],
["\"기존 도구는 버리나요?\"", "아니요, 연동입니다. Prometheus·ClickHouse 등 8종을 읽기 전용으로 등록하면 그 데이터가 서비스 맵과 AI 진단의 근거로 흡수됩니다. 기존 대시보드는 그대로 두고 '조합하는 층'을 얹습니다.", A.green],
];
Expand Down
2 changes: 1 addition & 1 deletion docs-site/static/diagrams/agentcore-architecture.drawio
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<mxCell id="bedrock-label" value="&lt;font color='#FFFFFF' style='font-size:15px'&gt;&lt;b&gt;Amazon Bedrock&lt;/b&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;" parent="1" vertex="1">
<mxGeometry x="1015" y="42" width="140" height="36" as="geometry"/>
</mxCell>
<mxCell id="model-sonnet" value="&lt;font color='#00d4ff' style='font-size:13px'&gt;&lt;b&gt;Claude Haiku 4.5&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;font color='#aaaaaa' style='font-size:10px'&gt;Intent Classification&lt;br&gt;Route Selection (9 sections, ADR-038)&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1a2540;strokeColor=#00d4ff;strokeWidth=1.5;" parent="1" vertex="1">
<mxCell id="model-sonnet" value="&lt;font color='#00d4ff' style='font-size:13px'&gt;&lt;b&gt;Claude Haiku 4.5&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;font color='#aaaaaa' style='font-size:10px'&gt;Intent Classification&lt;br&gt;Route Selection (9 sections)&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1a2540;strokeColor=#00d4ff;strokeWidth=1.5;" parent="1" vertex="1">
<mxGeometry x="955" y="100" width="190" height="70" as="geometry"/>
</mxCell>
<mxCell id="model-opus" value="&lt;font color='#a855f7' style='font-size:13px'&gt;&lt;b&gt;Claude Opus 4.8&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;font color='#aaaaaa' style='font-size:10px'&gt;Deep Analysis (AI Diagnosis worker,&lt;br&gt;NOT the Runtime) — Report (15 sections)&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1a2540;strokeColor=#a855f7;strokeWidth=1.5;" parent="1" vertex="1">
Expand Down
Loading
Loading