/ 00-agent-agentcore / agent_agentcore / agent_agentcore_stack.py
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)