agent_agentcore_stack.py
1 """CDK Stack for standalone AgentCore Runtime deployment. 2 3 Deploys the multimodal agent with Memory and RuntimeEndpoint, 4 and exports ARNs via SSM Parameter Store so that WhatsApp 5 integration stacks can consume them. 6 """ 7 8 import os 9 10 from aws_cdk import ( 11 Stack, 12 CfnOutput, 13 RemovalPolicy, 14 SecretValue, 15 aws_bedrockagentcore as bedrockagentcore, 16 aws_s3 as s3, 17 aws_secretsmanager as secretsmanager, 18 aws_ssm as ssm, 19 ) 20 from constructs import Construct 21 22 from agentcore.agentcore_role import AgentCoreRole 23 from agentcore.agentcore_deployment import AgentCoreDeployment 24 from agentcore.agentcore_memory import AgentCoreMemory 25 26 27 REGION = os.environ.get("AWS_REGION", "us-east-1") 28 MODEL_ID = os.environ.get("MODEL_ID", "us.anthropic.claude-sonnet-4-20250514-v1:0") 29 TL_MODEL_NAME = os.environ.get("TL_MODEL_NAME", "pegasus1.2") 30 31 32 class AgentAgentCoreStack(Stack): 33 """Standalone AgentCore Runtime + Memory stack.""" 34 35 def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: 36 super().__init__(scope, construct_id, **kwargs) 37 38 # --- Secrets Manager for TwelveLabs API key --- 39 tl_secret = secretsmanager.Secret( 40 self, 41 "TwelveLabsApiKey", 42 secret_object_value={ 43 "TL_API_KEY": SecretValue.unsafe_plain_text("CHANGE_ME"), 44 }, 45 description="TwelveLabs API key for video analysis", 46 ) 47 48 # --- S3 Bucket for agent code and media --- 49 bucket = s3.Bucket( 50 self, 51 "AgentBucket", 52 versioned=True, 53 removal_policy=RemovalPolicy.DESTROY, 54 auto_delete_objects=True, 55 block_public_access=s3.BlockPublicAccess.BLOCK_ALL, 56 enforce_ssl=True, 57 ) 58 59 # --- AgentCore Memory --- 60 memory = AgentCoreMemory(self, "AgentCoreMemory") 61 62 # --- AgentCore Runtime --- 63 agentcore_role = AgentCoreRole(self, "AgentCoreRole") 64 bucket.grant_read_write(agentcore_role.role) 65 tl_secret.grant_read(agentcore_role.role) 66 67 agentcore = AgentCoreDeployment( 68 self, 69 "AgentCore", 70 bucket=bucket, 71 role=agentcore_role.role, 72 memory_id=memory.memory_id, 73 environment_variables={ 74 "AWS_REGION": REGION, 75 "MODEL_ID": MODEL_ID, 76 "TL_SECRET_ARN": tl_secret.secret_arn, 77 "TL_MODEL_NAME": TL_MODEL_NAME, 78 "FACTS_STRATEGY_ID": os.environ.get("FACTS_STRATEGY_ID", ""), 79 "PREFERENCES_STRATEGY_ID": os.environ.get("PREFERENCES_STRATEGY_ID", ""), 80 }, 81 ) 82 83 # --- AgentCore Runtime Endpoint --- 84 endpoint = bedrockagentcore.CfnRuntimeEndpoint( 85 self, 86 "AgentCoreEndpoint", 87 agent_runtime_id=agentcore.agent_runtime_id, 88 name="WhatsAppAgentEndpoint", 89 description="Endpoint to invoke the WhatsApp multimodal agent", 90 ) 91 endpoint.node.add_dependency(agentcore.runtime) 92 93 # --- Export via SSM Parameter Store --- 94 ssm.StringParameter( 95 self, 96 "AgentRuntimeArnParam", 97 parameter_name="/agentcore/agent_runtime_arn", 98 string_value=agentcore.agent_runtime_arn, 99 ) 100 101 ssm.StringParameter( 102 self, 103 "S3BucketParam", 104 parameter_name="/agentcore/s3_bucket_name", 105 string_value=bucket.bucket_name, 106 ) 107 108 ssm.StringParameter( 109 self, 110 "MemoryIdParam", 111 parameter_name="/agentcore/memory_id", 112 string_value=memory.memory_id, 113 ) 114 115 ssm.StringParameter( 116 self, 117 "RuntimeRoleArnParam", 118 parameter_name="/agentcore/runtime_role_arn", 119 string_value=agentcore_role.role.role_arn, 120 ) 121 122 # --- Outputs --- 123 CfnOutput(self, "AgentRuntimeArn", value=agentcore.agent_runtime_arn) 124 CfnOutput(self, "AgentRuntimeId", value=agentcore.agent_runtime_id) 125 CfnOutput(self, "EndpointArn", value=endpoint.attr_agent_runtime_endpoint_arn) 126 CfnOutput(self, "MemoryId", value=memory.memory_id) 127 CfnOutput(self, "S3BucketName", value=bucket.bucket_name) 128 CfnOutput(self, "TwelveLabsSecretArn", value=tl_secret.secret_arn)