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)