Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
0b73f41
feat: bound trace observation caches and tighten agent tool contracts
Atom-oh Nov 6, 2026
e9ce3f3
feat: add default-off diagnosis discovery and evidence core
Atom-oh Nov 6, 2026
394bbaa
fix: harden discovery evidence before review
Atom-oh Nov 6, 2026
fcb856a
Merge remote-tracking branch 'origin/dev' into feat/discovery-evidenc…
Atom-oh Nov 6, 2026
f701e85
fix: disclose unconfirmed empty inventory and keep proxy bounds out o…
Atom-oh Nov 6, 2026
d485311
fix: require ReplicaLag for replicas and mask host-valued names in mo…
Atom-oh Nov 6, 2026
d34f78d
fix: canonicalize observed DB hosts and stop copying graph sources in…
Atom-oh Nov 6, 2026
86d5068
fix: admit allowlisted member roles in the dev plan guard and harden …
Atom-oh Nov 6, 2026
946a2a2
fix: pin the member-role plan exemption and keep discovery identities…
Atom-oh Nov 6, 2026
38868fe
feat: collect bounded DNS and network observations for diagnosis (#244)
Atom-oh Nov 6, 2026
63595f1
fix: move diagnosis IAM to managed policies and close evidence disclo…
Atom-oh Nov 6, 2026
8853ef1
Merge remote-tracking branch 'origin/feat/discovery-evidence-core-202…
Atom-oh Nov 6, 2026
3003aaa
fix: fence the member-role plan exemption and keep service endpoints …
Atom-oh Nov 6, 2026
cfa888b
fix: admit the network policy attachment in the plan guard and keep l…
Atom-oh Nov 7, 2026
d534f8b
fix: require an exact reference allowlist for unknown-ARN attachments…
Atom-oh Nov 7, 2026
967b1e1
fix: narrow confirmed observations and bound evidence eviction cost
Atom-oh Nov 7, 2026
34679f2
fix: follow ADR-011 ExternalId optionality and keep self-imposed boun…
Atom-oh Nov 7, 2026
524aac7
fix: keep coverage completeness honest and say the evidence gates are…
Atom-oh Nov 7, 2026
f5dcf1a
fix: require read-only gates beside member roles and demote every tru…
Atom-oh Nov 7, 2026
800e0ed
fix: bound IPv6 redaction scanning to linear work
Atom-oh Nov 7, 2026
afb0075
Merge remote-tracking branch 'origin/dev' into feat/discovery-evidenc…
Atom-oh Nov 7, 2026
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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Deploy-time model provider: the optional `model_provider` Terraform variable selects the model family for chat, query generation, synthesis, routing and AI Diagnosis: `mixed` (default, unchanged), `bedrock_claude` (Claude only on Bedrock), `bedrock_openai` (GPT-6 Luna and GPT-6.1 Terra only on Bedrock, no Claude fallback) or `anthropic_api` (Claude through the Anthropic API with a key stored in Secrets Manager). Bedrock model permissions shrink to the chosen family, and `anthropic_api` removes them and grants read access to that one secret only. Anthropic API usage is billed by Anthropic and does not appear on the AI usage/cost pages, which read Bedrock invocation logs; a rotated key is picked up without a redeploy.
- Chat connector auto-registration: with the optional `connector_target_sync_enabled` flag, adding a ClickHouse, Prometheus, Loki, Tempo or Mimir datasource registers that connector on its AgentCore gateway in the background, so chat can use it once the gateway finishes registering the target, without rerunning the AgentCore provisioner. This is ADR-023, an ADR-005 owner-override exception scoped to creating or updating this stack's own gateway targets. The worker first confirms the gateway belongs to this stack (its AgentCore role and IAM authentication), and a missing gateway fails the job visibly. It only creates or updates awsops's own gateway targets that point at this stack's connector functions, never deletes, and leaves a target owned by another stack untouched.
- Cross-account observability over PrivateLink: an optional `privatelink_endpoints` Terraform input creates interface endpoints, with a restricted security group, to ClickHouse, Prometheus, Loki, Tempo or Mimir endpoint services exposed by another AWS account, so the connector Lambdas reach them privately without peering or a public path. An optional `privatelink_zone_name` adds a private DNS zone with short, stable names such as `clickhouse.obs.awsops.internal`. The zone's CNAME records are a second step (`privatelink_zone_records_enabled`) once the provider accepts each connection. All of it defaults to off; the provider-side setup, acceptance and rollback are in the new PrivateLink runbook.
- AI Diagnosis evidence collection gates (default off, not yet used by reports): `diagnosis_evidence_loop_enabled` prepares the report worker to read bounded inventory, graph, 14-day metric, measured-memory and Compute Optimizer evidence with read-only permissions, and `diagnosis_network_evidence_enabled` adds Resolver query-log, Network Flow Monitor and RDS Proxy observations. Member accounts are read only through allowlisted `AWSopsReadOnlyRole` ARNs, sending the registered ExternalId. Capped, unconfirmed or failed evidence is reported as incomplete, missing or degraded rather than healthy.
- Topology navigation: the sidebar's Topology entry expands to Request flow, Infra layout, Network topology and Service map, and opens automatically on any topology page, so the infrastructure layout graph and service map no longer require the small in-page buttons.
- User guide: `docs-site/` is published as this repository's GitHub Pages site (deployed automatically on pushes to `dev`, or manually via workflow dispatch), retargeted from the previous personal-domain deployment — site URL, navigation/landing GitHub links, robots.txt sitemap and alert runbook cross-references now point at this repository, and the previous dashboard link and personal analytics tracker are removed.

Expand Down Expand Up @@ -702,6 +703,7 @@ First release of the **v2 line** (versioned independently from the v1 1.x line,
- 배포 시 모델 제공자 선택: 선택 Terraform 변수 `model_provider`로 채팅, 쿼리 생성, 합성, 라우팅, AI 진단에 쓸 모델 계열을 고릅니다. `mixed`(기본값, 기존과 동일), `bedrock_claude`(Bedrock의 Claude만), `bedrock_openai`(Bedrock의 GPT-6 Luna·GPT-6.1 Terra만, Claude 대체 없음), `anthropic_api`(Secrets Manager에 저장한 키로 Anthropic API의 Claude 사용) 중 하나입니다. Bedrock 모델 권한은 선택한 계열로 좁혀지며, `anthropic_api`는 Bedrock 모델 권한을 없애고 해당 시크릿 하나의 읽기 권한만 부여합니다. Anthropic API 사용량은 Anthropic이 청구하며 Bedrock 호출 로그를 읽는 AI 사용량·비용 화면에는 나타나지 않고, 교체한 키는 재배포 없이 반영됩니다.
- 채팅 커넥터 자동 등록: 선택 플래그 `connector_target_sync_enabled`를 켜면 ClickHouse·Prometheus·Loki·Tempo·Mimir 데이터소스를 추가할 때 해당 커넥터를 백그라운드에서 AgentCore 게이트웨이에 등록하므로, AgentCore 프로비저너를 다시 실행하지 않아도 게이트웨이가 target 등록을 마치면 채팅에서 사용할 수 있습니다. 이는 이 스택 자신의 게이트웨이 target 생성·갱신으로 범위를 한정한 ADR-005 owner-override 예외(ADR-023)입니다. worker는 먼저 게이트웨이가 이 스택 소유(이 스택의 AgentCore role과 IAM 인증)인지 확인하고, 게이트웨이가 없으면 job을 눈에 보이게 실패 처리합니다. 또한 이 스택의 커넥터 함수를 가리키는 awsops 소유 게이트웨이 target만 생성·갱신하고, 삭제하지 않으며, 다른 스택이 소유한 target은 건드리지 않습니다.
- PrivateLink 기반 교차 계정 관측 데이터소스 연결: 선택 입력 `privatelink_endpoints`가 다른 AWS 계정이 노출한 ClickHouse·Prometheus·Loki·Tempo·Mimir 엔드포인트 서비스로 가는 인터페이스 엔드포인트와 제한된 보안 그룹을 만들어, 커넥터 Lambda가 피어링이나 공용 경로 없이 비공개로 접속합니다. 선택 입력 `privatelink_zone_name`은 `clickhouse.obs.awsops.internal`처럼 짧고 안정적인 이름의 프라이빗 DNS 영역을 추가하며, CNAME 레코드는 제공자가 연결을 수락한 뒤의 두 번째 단계(`privatelink_zone_records_enabled`)입니다. 모두 기본값은 꺼짐이며, 제공자 측 설정·승인·롤백 절차는 새 PrivateLink 런북에 있습니다.
- AI 진단 증거 수집 게이트(기본 꺼짐, 아직 리포트에서 사용하지 않음): `diagnosis_evidence_loop_enabled`를 켜면 리포트 워커가 인벤토리·그래프·14일 지표·메모리 실측·Compute Optimizer 증거를 읽기 전용 권한으로 제한된 범위만 읽고, `diagnosis_network_evidence_enabled`는 Resolver 쿼리 로그·Network Flow Monitor·RDS Proxy 관측을 추가합니다. 멤버 계정은 허용 목록에 있는 `AWSopsReadOnlyRole`로만 읽고, 등록된 ExternalId를 함께 보냅니다. 한도에 걸리거나 확인되지 않았거나 실패한 증거는 정상이 아니라 불완전·누락·저하로 표시합니다.
- 토폴로지 내비게이션: 사이드바의 토폴로지 항목을 펼치면 요청 흐름·인프라 배치·네트워크 토폴로지·서비스 맵으로 바로 이동할 수 있고, 토폴로지 화면에 있으면 자동으로 펼쳐집니다. 인프라 배치 그래프와 서비스 맵을 찾기 위해 화면 안의 작은 버튼을 쓰지 않아도 됩니다.
- 사용자 가이드: `docs-site/`를 이 저장소의 GitHub Pages 사이트로 게시합니다(`dev` 브랜치 push 시 자동 배포, 또는 워크플로 수동 실행). 이전 개인 도메인 배포 대상을 이 저장소 기준으로 재조정하여 사이트 URL, 내비게이션·랜딩 페이지의 GitHub 링크, robots.txt sitemap, 알림 런북 상호 참조가 이 저장소를 가리키며, 기존 대시보드 링크와 개인 애널리틱스 트래커는 제거합니다.

Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,8 @@ and [deployment runbook §5](docs/runbooks/dev-repo-setup.md#5-deploy-while-dns-
| `sg_rule_activity_enabled` | the SG Rules Athena-based traffic-evidence pipeline (`/network/security-groups/rules`) — the Athena/Glue broker Lambda, the daily `sg_rule_scan` worker job, and their Terraform (`sg-rules.tf`) |
| `network_path_check_enabled` | the Network Path Check page/worker (`network-path.tf`) — `fetch_live_topology()` is now real (cache-only, from Aurora's synced topology), but a full live AWS/Kubernetes re-read at run time is still deliberately unimplemented, so `POST .../runs` still 503s `unimplemented` even with this flag on; see the Network Path Check changelog entry. A pod/node source's live identity confirmation additionally needs an EKS Access Entry — for the **worker task role** on a host-account cluster (this feature's `_default_k8s_get()` uses that role's own credentials directly when the source's account is the host account), or for the target account's **`AWSopsReadOnlyRole`** on a member-account cluster (the K8s GET is authenticated via that assumed session instead, so registering the worker task role there is a no-op and every GET 403s) — see [`docs/runbooks/network-path-eks-access.md`](docs/runbooks/network-path-eks-access.md) + `scripts/v2/eks/register-network-path-access.sh` (`ROLE_ARN=...` overrides the principal for the member-account case) |
| `connector_target_sync_enabled` | registers a just-added ClickHouse/Prometheus/Loki/Tempo/Mimir datasource's connector on its AgentCore gateway in the background (`connector_target_sync` worker job, via a dedicated Lambda whose own role holds the gateway grant) so chat can call it without rerunning `make agentcore`. Creates/updates only this stack's own gateway targets, never deletes; an ADR-005 owner-override exception (ADR-023, 2026-11-05). Enable it on at most one awsops stack per account. Requires `workers_enabled`, `agentcore_enabled` and `integrations_enabled` |
| `diagnosis_evidence_loop_enabled` | provisions bounded read-only evidence discovery for AI Diagnosis on the Fargate report worker (the report path does not use it yet; the six-pillar diagnosis that consumes it ships separately, so enabling it alone changes no report): inventory/graph reads, 14-day CloudWatch metrics, measured EC2 memory (CloudWatch agent `mem_used_percent`) and Compute Optimizer EC2/RDS recommendations, via a customer-managed policy on the worker task role. Nothing is mutated. Requires `workers_enabled`. `diagnosis_member_role_arns` (default empty, requires this flag) allowlists member `AWSopsReadOnlyRole` ARNs for member-account reads; the registered ExternalId is sent (first-party registrations without one rely on the trust policy pinning the worker task role, ADR-011) |
| `diagnosis_network_evidence_enabled` | adds DNS/NFM observations to that loop: Resolver query-log configuration, Network Flow Monitor top contributors on existing host monitors and RDS Proxy configuration. It creates no monitors, logging or instrumentation. Logs Insights runs only on the log groups listed in `diagnosis_dns_log_group_arns` (default empty). Requires `diagnosis_evidence_loop_enabled` |
| `model_provider` | model family for chat, query generation, synthesis, routing and AI Diagnosis: `mixed` (default, unchanged), `bedrock_claude`, `bedrock_openai` or `anthropic_api` (Claude through the Anthropic API; needs `anthropic_api_key_secret_arn`, a Secrets Manager secret holding the key). Bedrock model grants shrink to the chosen family; `anthropic_api` grants only that secret. Under `anthropic_api` the AI usage/cost pages, which read Bedrock invocation logs, show no usage. See `docs/runbooks/model-provider.md` |

Runtime IAM narrowing is independent of these opt-in flags: the next apply changes permissions on already-enabled stacks, including main (three web SSM parameters, runtime discovery/token actions, own-cluster task control and the models of the selected `model_provider` family). Known regions include future opt-ins; this is not live-access proof.
Expand Down Expand Up @@ -398,6 +400,8 @@ apply에서 바꿀 수 없습니다. 기본 false인 일반 full 계획도 DNS
| `sg_rule_activity_enabled` | SG Rules Athena 기반 트래픽 근거 파이프라인(`/network/security-groups/rules`) — Athena/Glue 브로커 Lambda, 일일 `sg_rule_scan` 워커 job, 관련 Terraform(`sg-rules.tf`) |
| `network_path_check_enabled` | Network Path Check 페이지/워커(`network-path.tf`) — `fetch_live_topology()`는 이제 실제 구현이다(캐시된 Aurora 토폴로지 기반), 다만 run 시점의 실시간 AWS/Kubernetes 재조회는 여전히 의도적으로 미구현이라 이 플래그가 켜져 있어도 `POST .../runs`는 여전히 503 `unimplemented`를 반환한다; Network Path Check CHANGELOG 항목 참고. pod/node 소스의 live identity 확인에는 EKS Access Entry가 추가로 필요하다 — 소스 계정이 호스트 계정이면 **워커 task role**용(이 경우 `_default_k8s_get()`이 그 role 자신의 자격증명을 직접 사용), 멤버 계정이면 대상 계정의 **`AWSopsReadOnlyRole`**용(그 assume된 세션으로 K8s GET을 인증하므로, 워커 task role을 등록해도 아무 효과가 없고 모든 GET이 403된다) — [`docs/runbooks/network-path-eks-access.md`](docs/runbooks/network-path-eks-access.md) + `scripts/v2/eks/register-network-path-access.sh`(멤버 계정의 경우 `ROLE_ARN=...`로 principal 오버라이드) 참고 |
| `connector_target_sync_enabled` | 방금 추가한 ClickHouse/Prometheus/Loki/Tempo/Mimir 데이터소스의 커넥터를 백그라운드(`connector_target_sync` 워커 job, gateway 권한을 자체 role로 보유한 전용 Lambda 경유)에서 해당 AgentCore gateway에 등록해, `make agentcore`를 다시 실행하지 않아도 채팅에서 호출할 수 있게 한다. 이 스택 자신의 gateway target만 생성·갱신하며 삭제하지 않는다(ADR-005 owner-override 예외 ADR-023, 2026-11-05). 계정당 awsops 스택 하나에서만 켠다. `workers_enabled`, `agentcore_enabled`, `integrations_enabled` 선행 |
| `diagnosis_evidence_loop_enabled` | Fargate 리포트 워커에서 AI 진단용 읽기 전용 증거 수집을 준비한다(리포트 경로는 아직 이를 쓰지 않으며, 이를 사용하는 6대 영역 진단은 별도로 제공되므로 이 플래그만 켜서는 리포트가 바뀌지 않는다). 수집 범위(인벤토리·그래프 조회, 14일 CloudWatch 지표, CloudWatch 에이전트 `mem_used_percent` 기반 EC2 메모리 실측, Compute Optimizer EC2/RDS 권장)을 워커 task role의 고객 관리형 정책으로 허용한다. 리소스를 변경하지 않는다. `workers_enabled` 선행. `diagnosis_member_role_arns`(기본 빈 목록, 이 플래그 선행)에 멤버 계정 `AWSopsReadOnlyRole` ARN을 넣으면 멤버 계정도 읽으며, 등록된 ExternalId를 함께 보낸다(ExternalId 없이 등록된 1st-party 계정은 trust policy가 워커 task role을 고정하는 것에 의존, ADR-011) |
| `diagnosis_network_evidence_enabled` | 위 수집에 DNS/NFM 관측을 추가한다: Resolver 쿼리 로그 설정, 기존 호스트 모니터의 Network Flow Monitor top contributors, RDS Proxy 설정. 모니터·로그·계측을 새로 만들지 않는다. Logs Insights는 `diagnosis_dns_log_group_arns`(기본 빈 목록)에 적힌 로그 그룹에서만 실행한다. `diagnosis_evidence_loop_enabled` 선행 |
| `model_provider` | 채팅·쿼리 생성·합성·라우팅·AI 진단에 쓸 모델 계열: `mixed`(기본값, 기존과 동일), `bedrock_claude`, `bedrock_openai`, `anthropic_api`(Anthropic API의 Claude; 키를 담은 Secrets Manager 시크릿 `anthropic_api_key_secret_arn` 필요). Bedrock 모델 권한은 선택한 계열로 좁혀지고 `anthropic_api`는 해당 시크릿 읽기만 부여합니다. `anthropic_api`에서는 Bedrock 호출 로그를 읽는 AI 사용량·비용 화면에 사용량이 표시되지 않습니다. `docs/runbooks/model-provider.md` 참고 |

런타임 IAM 축소는 위 선택 플래그와 무관하며 main 등 기존 활성 스택의 다음 apply에 적용됩니다(웹 SSM 세 파라미터·런타임 조회/토큰 동작·자체 클러스터 태스크 제어·선택한 `model_provider` 계열 모델). 알려진 리전에는 이후 opt-in 리전도 포함되며 실제 접근 성공의 증거는 아닙니다.
Expand Down
Loading
Loading