From 8379efeaa140ec8278442eb8176cef34ab9e2245 Mon Sep 17 00:00:00 2001 From: David Kaleko Date: Wed, 11 Mar 2026 19:42:49 +0000 Subject: [PATCH 1/4] feat(terraform): add claude-agent-sdk patterns to backend_pattern variable --- infra-terraform/terraform.tfvars.example | 2 +- infra-terraform/variables.tf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/infra-terraform/terraform.tfvars.example b/infra-terraform/terraform.tfvars.example index 3fe9548..a6df20a 100644 --- a/infra-terraform/terraform.tfvars.example +++ b/infra-terraform/terraform.tfvars.example @@ -30,7 +30,7 @@ admin_user_email = null # Example: "admin@example.com" # ----------------------------------------------------------------------------- # Agent pattern to deploy -# Available patterns: strands-single-agent, langgraph-single-agent +# Available patterns: strands-single-agent, langgraph-single-agent, claude-agent-sdk-single-agent, claude-agent-sdk-multi-agent backend_pattern = "strands-single-agent" # Deployment type for AgentCore Runtime diff --git a/infra-terraform/variables.tf b/infra-terraform/variables.tf index 801b88d..918aac0 100644 --- a/infra-terraform/variables.tf +++ b/infra-terraform/variables.tf @@ -35,13 +35,13 @@ variable "admin_user_email" { # ============================================================================= variable "backend_pattern" { - description = "Agent pattern to deploy. Available patterns: strands-single-agent, langgraph-single-agent" + description = "Agent pattern to deploy. Available patterns: strands-single-agent, langgraph-single-agent, claude-agent-sdk-single-agent, claude-agent-sdk-multi-agent" type = string default = "strands-single-agent" validation { - condition = contains(["strands-single-agent", "langgraph-single-agent"], var.backend_pattern) - error_message = "Backend pattern must be one of: strands-single-agent, langgraph-single-agent." + condition = contains(["strands-single-agent", "langgraph-single-agent", "claude-agent-sdk-single-agent", "claude-agent-sdk-multi-agent"], var.backend_pattern) + error_message = "Backend pattern must be one of: strands-single-agent, langgraph-single-agent, claude-agent-sdk-single-agent, claude-agent-sdk-multi-agent." } } From 06cc0d07888b318e1cf0f5aa9daf8acfcc61c87b Mon Sep 17 00:00:00 2001 From: David Kaleko Date: Thu, 12 Mar 2026 14:11:00 +0000 Subject: [PATCH 2/4] feat(terraform): add claude-agent-sdk input validation and CLAUDE_CODE_USE_BEDROCK env var - Add precondition to prevent zip deployment with claude-agent-sdk patterns - Add conditional CLAUDE_CODE_USE_BEDROCK=1 environment variable - Add is_claude_agent_sdk local flag Mirrors CDK backend-stack.ts changes from PR #45. --- infra-terraform/modules/backend/locals.tf | 3 +++ infra-terraform/modules/backend/runtime.tf | 22 +++++++++++++------- infra-terraform/modules/backend/variables.tf | 2 +- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/infra-terraform/modules/backend/locals.tf b/infra-terraform/modules/backend/locals.tf index 40f80f1..df639ee 100644 --- a/infra-terraform/modules/backend/locals.tf +++ b/infra-terraform/modules/backend/locals.tf @@ -42,6 +42,9 @@ locals { is_docker = var.backend_deployment_type == "docker" is_zip = var.backend_deployment_type == "zip" + # Pattern flags + is_claude_agent_sdk = contains(["claude-agent-sdk-single-agent", "claude-agent-sdk-multi-agent"], var.backend_pattern) + # Project paths (for zip packaging) project_root = "${path.module}/../../.." pattern_dir = "${local.project_root}/patterns/${var.backend_pattern}" diff --git a/infra-terraform/modules/backend/runtime.tf b/infra-terraform/modules/backend/runtime.tf index 2056085..a0c7eb2 100644 --- a/infra-terraform/modules/backend/runtime.tf +++ b/infra-terraform/modules/backend/runtime.tf @@ -471,16 +471,24 @@ resource "aws_bedrockagentcore_agent_runtime" "main" { } # Environment variables for the runtime - environment_variables = { - AWS_REGION = local.region - AWS_DEFAULT_REGION = local.region - MEMORY_ID = aws_bedrockagentcore_memory.main.id - STACK_NAME = var.stack_name_base - GATEWAY_CREDENTIAL_PROVIDER_NAME = "${var.stack_name_base}-runtime-gateway-auth" - } + environment_variables = merge( + { + AWS_REGION = local.region + AWS_DEFAULT_REGION = local.region + MEMORY_ID = aws_bedrockagentcore_memory.main.id + STACK_NAME = var.stack_name_base + GATEWAY_CREDENTIAL_PROVIDER_NAME = "${var.stack_name_base}-runtime-gateway-auth" + }, + # claude-agent-sdk patterns require CLAUDE_CODE_USE_BEDROCK=1 + local.is_claude_agent_sdk ? { CLAUDE_CODE_USE_BEDROCK = "1" } : {} + ) # Force runtime replacement when agent code changes (zip or docker) lifecycle { + precondition { + condition = !local.is_claude_agent_sdk || local.is_docker + error_message = "claude-agent-sdk patterns require Docker deployment (backend_deployment_type = \"docker\") because they need Node.js and the claude-code CLI installed at build time." + } precondition { condition = var.backend_network_mode != "VPC" || (var.backend_vpc_id != null && var.backend_vpc_id != "") error_message = "backend_vpc_id is required when backend_network_mode is 'VPC'." diff --git a/infra-terraform/modules/backend/variables.tf b/infra-terraform/modules/backend/variables.tf index f0b7538..2377e32 100644 --- a/infra-terraform/modules/backend/variables.tf +++ b/infra-terraform/modules/backend/variables.tf @@ -17,7 +17,7 @@ variable "backend_pattern" { } variable "backend_deployment_type" { - description = "Deployment type: 'docker' (container via ECR) or 'zip' (Python package via S3)." + description = "Deployment type: 'docker' (container via ECR) or 'zip' (Python package via S3). Note: claude-agent-sdk patterns require 'docker'." type = string default = "docker" } From 15f44f3562567cb7ac434673760382c4cf5754fd Mon Sep 17 00:00:00 2001 From: David Kaleko Date: Thu, 12 Mar 2026 14:16:06 +0000 Subject: [PATCH 3/4] refactor: rename StrandsAgent to FASTAgent in CDK and Terraform Rename the default agent name from StrandsAgent to FASTAgent since the template is framework-agnostic and supports multiple patterns. Updated in: - infra-cdk/lib/backend-stack.ts (CfnParameter default) - infra-terraform/modules/backend/locals.tf - infra-terraform/README.md Note: the CDK change is slightly out of scope for this Terraform-focused PR but included here to keep the two infra tools in sync. --- infra-cdk/lib/backend-stack.ts | 2 +- infra-terraform/README.md | 2 +- infra-terraform/modules/backend/locals.tf | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/infra-cdk/lib/backend-stack.ts b/infra-cdk/lib/backend-stack.ts index b9f34c0..d61209c 100644 --- a/infra-cdk/lib/backend-stack.ts +++ b/infra-cdk/lib/backend-stack.ts @@ -102,7 +102,7 @@ export class BackendStack extends cdk.NestedStack { // Parameters this.agentName = new cdk.CfnParameter(this, "AgentName", { type: "String", - default: "StrandsAgent", + default: "FASTAgent", description: "Name for the agent runtime", }) diff --git a/infra-terraform/README.md b/infra-terraform/README.md index eb85e12..a5f28bb 100644 --- a/infra-terraform/README.md +++ b/infra-terraform/README.md @@ -66,7 +66,7 @@ Terraform uses flat variables with a `backend_` prefix to mirror the CDK's neste | `backend.vpc.subnet_ids` | `backend_vpc_subnet_ids` | | `backend.vpc.security_group_ids` | `backend_vpc_security_group_ids` | -Values that are hardcoded in CDK (not in `config.yaml`) are defined as module-internal locals in Terraform: agent name (`StrandsAgent`), memory event expiry (30 days), callback URLs, and password minimum length. +Values that are hardcoded in CDK (not in `config.yaml`) are defined as module-internal locals in Terraform: agent name (`FASTAgent`), memory event expiry (30 days), callback URLs, and password minimum length. ## Module Structure diff --git a/infra-terraform/modules/backend/locals.tf b/infra-terraform/modules/backend/locals.tf index df639ee..4c84a57 100644 --- a/infra-terraform/modules/backend/locals.tf +++ b/infra-terraform/modules/backend/locals.tf @@ -22,8 +22,8 @@ locals { # Stack name for resource naming (underscores for some AWS resources) stack_name_underscore = replace(var.stack_name_base, "-", "_") - # Agent name (matches CDK CfnParameter default in backend-stack.ts) - agent_name = "StrandsAgent" + # Agent name used in runtime naming + agent_name = "FASTAgent" # Runtime name (underscores required by AgentCore) runtime_name = "${local.stack_name_underscore}_${local.agent_name}" From ec33efded9edea2906a798b9948e1f88957c4a56 Mon Sep 17 00:00:00 2001 From: David Kaleko Date: Thu, 12 Mar 2026 14:16:56 +0000 Subject: [PATCH 4/4] fix(terraform): use recursive glob for pattern dir change detection Change *.py to **/*.py so files in subdirectories (code_int_mcp/, agents/, tools/) are included in the Docker image content hash. Without this, edits to those files wouldn't trigger a rebuild. --- infra-terraform/modules/backend/runtime.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infra-terraform/modules/backend/runtime.tf b/infra-terraform/modules/backend/runtime.tf index a0c7eb2..6ee5d66 100644 --- a/infra-terraform/modules/backend/runtime.tf +++ b/infra-terraform/modules/backend/runtime.tf @@ -63,7 +63,7 @@ resource "terraform_data" "docker_image_hash" { input = local.is_docker && var.container_uri == null ? sha256(join("", concat( [filesha256("${local.pattern_dir}/Dockerfile")], [filesha256("${local.pattern_dir}/requirements.txt")], - [for f in fileset(local.pattern_dir, "*.py") : filesha256("${local.pattern_dir}/${f}")], + [for f in fileset(local.pattern_dir, "**/*.py") : filesha256("${local.pattern_dir}/${f}")], [for f in fileset("${local.project_root}/patterns/utils", "**/*.py") : filesha256("${local.project_root}/patterns/utils/${f}")], [for f in fileset("${local.project_root}/gateway", "**/*.py") : filesha256("${local.project_root}/gateway/${f}")], [for f in fileset("${local.project_root}/tools", "**/*.py") : filesha256("${local.project_root}/tools/${f}")],