aws-samples / aws-samples/sample-autonomous-cloud-coding-agents

feat(cdk): switch Bedrock inference profile to the global geo

Closed
#747 1 comment 0 reactions 1 assignee Claimed by @scottschreckengaust View on GitHub
agent-runtime approved enhancement infra-cdk P1
Dominant language
TypeScript
Stars
143
Forks
46
Avg merge
3d 9h
Merged PRs (30d)
20

Description

Child 6 of 6 — parent #741. **Behavior change. Depends on #746 being deployed first.**

Flips the geo from `us` to `global`. One context value + three default strings; revert is a one-line context change.

## Blocked by

- **#746** — the `bedrockGeoRegion` plumbing must be deployed first, or the IAM grant won't cover `inference-profile/global.anthropic.…` and every task fails at turn 0 with `AccessDenied`.
- **#745** recommended first, so Opus 5 is already proven in production on the `us.` profile and this change isolates the geo variable.

## Verified prerequisites (us-east-1, acct 677276119483)

| Profile | Status | `InvokeModel` |
|---|---|---|
| `global.anthropic.claude-opus-5` | ACTIVE | ✅ 200 |
| `global.anthropic.claude-haiku-4-5-20251001-v1:0` | ACTIVE | ✅ 200 |

SDK path verified end-to-end with the pinned toolchain (`claude-agent-sdk==0.2.110`, bundled CLI `2.1.191`): `agent/scripts/diagnostics/test_sdk_smoke.py` with `ANTHROPIC_MODEL=global.anthropic.claude-opus-5` **and** `ANTHROPIC_DEFAULT_HAIKU_MODEL=global.anthropic.claude-haiku-4-5-20251001-v1:0` returned `status=success turns=1` in 3.6s. No SDK/CLI bump required.

## Why global

`global.` routes to any supported commercial AWS Region, giving higher throughput and better resilience under peak demand than a US-only profile. That matters for a workload whose tasks run up to 8h and burst.

**The tradeoff is data residency.** A deployer with a residency requirement must keep a geo profile (`us.`/`eu.`/`apac.`) instead — which is why #746 made this a context key rather than a second hardcode. Document the tradeoff in the canonical section from #742: when to prefer `global.` (throughput/resilience) vs a geo profile (residency), and that the geo choice must match the deployment Region's entitlements.

There is prior art in-repo: `.threat-composer/20260526-1924/config/config.json` pins `global.anthropic.claude-opus-4-6-v1`.

## Scope

| File | Change |
|---|---|
| `cdk/cdk.json` | add `context: { "bedrockGeoRegion": "global" }` — the file currently has **no** `context` block |
| `agent/src/config.py:563` | `ANTHROPIC_MODEL` fallback → `global.anthropic.claude-opus-5` |
| `agent/src/models.py:157` | `anthropic_model` default → same |
| `cli/src/repo-display.ts:48` | `PLATFORM_REPO_DEFAULTS.model_id` → same |
| `cdk/src/handlers/shared/workflows.ts:84` | add `global.anthropic.claude-opus-5` to `WORKFLOW_MODEL_ALLOWLIST` (#744 deliberately held this back) |
| docs | geo tradeoff subsection + documented default (#742 drift test will enforce) |

`ANTHROPIC_DEFAULT_HAIKU_MODEL` needs no edit — #746 derives its prefix from the context key.

The generalized drift guard from #746 accepts the `global.` prefix; if it fails here, #746 is incomplete and this issue is blocked rather than the guard being wrong.

## Rollback

Set `bedrockGeoRegion` back to `us` in `cdk.json` and redeploy; revert the three default strings. Because #746 keeps both geos' plumbing valid, rollback needs no code restructuring. The `us.` profile ARNs remain granted only if `bedrockGeoRegion` is `us` — so **roll back context and defaults together**, not independently.

## Acceptance criteria

- [ ] #746 confirmed deployed before merge
- [ ] `cdk.json` sets `bedrockGeoRegion: "global"`
- [ ] Three default strings updated to `global.anthropic.claude-opus-5` in one commit
- [ ] `global.anthropic.claude-opus-5` added to `WORKFLOW_MODEL_ALLOWLIST`
- [ ] `cdk diff` reviewed: inference-profile ARNs change `us.` → `global.`; foundation-model ARNs unchanged (already `region: '*'`)
- [ ] Deployed smoke test on **`agentcore`**: one task completes end-to-end and opens a PR
- [ ] ECS / `lambda-microvm` verification is **out of scope** — CI deploys `agentcore` only (`ALLOWED_COMPUTE_TYPES: "agentcore"` in `.github/workflows/build.yml` + `deploy.yml`). ECS unit-test coverage still applies and must pass
- [ ] `platform doctor` passes its access probe against the global profile
- [ ] Docs updated with the global-vs-geo tradeoff and residency caveat; `mise //docs:sync` run
- [ ] Rollback rehearsed: `-c bedrockGeoRegion=us` synths cleanly with `us.` ARNs
- [ ] `mise run build` green

## Notes

Blocked by #746. Final step in the #740/#741 stack.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.