whatsapp_stack.py
 1  """CDK Stack for WhatsApp integration via AWS End User Messaging Social.
 2  
 3  Reads AgentCore Runtime ARN from SSM Parameter Store (deployed by 00-agent-agentcore).
 4  """
 5  
 6  from aws_cdk import (
 7      Stack,
 8      CfnOutput,
 9      aws_s3 as s3,
10      aws_iam as iam,
11      RemovalPolicy,
12  )
13  from constructs import Construct
14  
15  from get_param import get_string_param
16  from databases.databases import MessageDatabase
17  from topic.topic import WhatsAppTopic
18  from lambdas.project_lambdas import ProjectLambdas
19  
20  # Read AgentCore config from SSM (set by 00-agent-agentcore stack)
21  AGENT_RUNTIME_ARN = get_string_param("/agentcore/agent_runtime_arn")
22  RUNTIME_ROLE_ARN = get_string_param("/agentcore/runtime_role_arn")
23  
24  
25  class WhatsAppEndUserMessagingStack(Stack):
26      """WhatsApp via End User Messaging Social -> SNS -> Lambda -> AgentCore."""
27  
28      def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
29          super().__init__(scope, construct_id, **kwargs)
30  
31          # --- S3 Bucket for media ---
32          bucket = s3.Bucket(
33              self,
34              "MediaBucket",
35              versioned=True,
36              removal_policy=RemovalPolicy.DESTROY,
37              auto_delete_objects=True,
38              block_public_access=s3.BlockPublicAccess.BLOCK_ALL,
39              enforce_ssl=True,
40          )
41  
42          # --- Grant AgentCore runtime role read access to media bucket ---
43          agentcore_role = iam.Role.from_role_arn(
44              self, "AgentCoreRole", RUNTIME_ROLE_ARN
45          )
46          bucket.grant_read(agentcore_role)
47  
48          # --- DynamoDB ---
49          db = MessageDatabase(self, "Database")
50  
51          # --- SNS Topic for WhatsApp events ---
52          sns_topic = WhatsAppTopic(self, "Topic")
53  
54          # --- Lambda ---
55          lambdas = ProjectLambdas(
56              self,
57              "Lambdas",
58              topic=sns_topic.topic,
59              table=db.table,
60              bucket=bucket,
61              agent_runtime_arn=AGENT_RUNTIME_ARN,
62          )
63  
64          # --- Outputs ---
65          CfnOutput(self, "AgentRuntimeArn", value=AGENT_RUNTIME_ARN)
66          CfnOutput(self, "MessagesTableName", value=db.table.table_name)
67          CfnOutput(self, "WhatsAppTopicArn", value=sns_topic.topic.topic_arn)
68          CfnOutput(self, "S3BucketName", value=bucket.bucket_name)
69          CfnOutput(self, "LambdaFunctionName", value=lambdas.whatsapp_handler.function_name)
70          CfnOutput(self, "ProcessorFunctionName", value=lambdas.message_processor.function_name)