Amazon Bedrock Agents dia toy ny mpiara-miasa malaza ho an'ny sehatry ny AWS - afaka manontany, manapa-kevitra izay tokony hatao manaraka ary manomboka hetsika amin'ny fampiasana ny endri-javatra Lambda. Amin'ity lahatsoratra ity dia hampiseho aho hoe ahoana no namorona ny Supervisor Agent izay manamboatra AWS Lambdas maromaro amin'ny: List EC2 instances, Fetch their CPU metrics from CloudWatch, Combine both results intelligently — all without the agent ever calling AWS APIs directly. By the end, you’ll understand how Bedrock Agents work, how to use action groups, and how to chain Lambdas through a supervisor function — a clean, scalable pattern for multi-step automation. Aoka isika hanara-maso ny sary sy ny ohatra hafa momba ny zava-mahadomelina, ho an'ny fahitana tsara kokoa sy ny fahatakarana: Ny mpampiasa dia miantso ny mpampiasa Bedrock (1) miaraka amin'ny asa sasany, ohatra, "iza ny fahitalavitra anananao ao amin'ny varotra?" Ny mpampiasa dia mahalala amin'ny fangatahana voafaritra fa raha mifandray amin'ny fanamarinana ny toeran'ny varotra ny fanontaniana, dia mila miantso (2) ny "database" vondrona hetsika (3, AG). Ao amin'ny angon-drakitra AG, dia nametrahantsika endri-javatra lambda hampiasa (4), ary ity lambda ity dia hanamarina ny toe-javatra ao amin'ny tabilao DynamoDB (5), mahazo ny valiny (6,7) ary miverina ny valiny amin'ny mpampiasa (8). Andeha hojerentsika indray ny ohatra iray: Ny mpikarakara tsirairay dia afaka manana vondrona asa maromaro, ohatra, tiantsika ny hahazo vaovao momba ny loharanon'ny AWS sasany, toy ny lisitry ny asa ECS rehetra, ny lohahevitra dia mitovy amin'ny teo aloha. Ary ny ohatra bebe kokoa: Nampiditra AG iray hafa miaraka amin'ny vondrona fampiharana EKS izahay. Araka ny hitanao eto, ny vondrona fampiharana tsirairay dia afaka manana endri-javatra iray mihoatra noho ny lambda iray mba hametrahana fangatahana. Ny vondrona hetsika sy ny endri-javatra lambda dia afaka manana endri-javatra rehetra, na dia mila mahazo angon-drakitra avy amin'ny API antoko fahatelo aza ianao mba hahazoana angon-drakitra momba ny toetr'andro na ny fidirana amin'ny fiaramanidina. Manantena aho fa mazava bebe kokoa amin'izao fotoana izao, ary aoka isika hiverina amin'ny fametrahana ny mpanara-maso: Ao amin'ny console AWS, misokatra ny Bedrock → Agents → Create agent Ampiasao ny anaran'izy ireo ary namorona Rehefa natsangana ianao, dia afaka manova ny modely raha tianao na hitazona an'i Claude amin'ny endriky ny. Ampidiro ny famaritana sy ny torolàlana ho an'ny Agent. Ny vondrona hetsika dia hamoronana amin'ny dingana manaraka Ianao no mpanara-maso ny AWS Supervisor. Ny tanjona dia ny hanampy amin'ny fanadihadiana ny rafitra AWS. Ny vondrona fampandrosoana: ec2: list_instances → returns instance list + instanceIds Ny fitsipika: Aza miantso ny API AWS mivantana. For EC2: Call ec2__list_instances Amin'ny ankapobeny, dia mampiasa ny "thinking" alohan'ny handray hetsika ianao. Ianao no mpanara-maso ny AWS Supervisor. Ny tanjona dia ny hanampy amin'ny fanadihadiana ny rafitra AWS. Ny vondrona fampandrosoana: ec2: list_instances → mamerina lisitry ny lisitry ny lisitry ny lisitry ny lisitry ny lisitry ny lisitry ny lisitry Ny fitsipika: Aza miantso ny API AWS mivantana. For EC2: Call ec2__list_instances Amin'ny ankapobeny, dia mampiasa ny "thinking" alohan'ny handray hetsika ianao. Ny fahatsiarovana: ec2 - ny anaran'ny vondrona asa list_instances - fonosana anarana, araka ny voalaza teo aloha - azonao atao ny manana fonosana maromaro isaky ny vondrona asa Ary tsindrio ny "Save" Ary ny bokotra "Prepare" ao amin'ny ambony. Prepares dia ho mavitrika rehefa voavonjy ianao. Tsindrio eto amin'ny vondrona asa → Add EC2. Action group. invocation - mamorona ampahany vaovao amin'ny lambda, izay Tsy maintsy mitovy amin'izany araka ny voalaza ao amin'ny toro-hevitra momba ny mpampiasa list_instances Ampidiro ny anaran'ny vondrona asa sy ny famaritana, tsindrio ny famoronana ary indray ny "Save" sy "Prepare". Mandeha any amin'ny lambda, Bedrock namorona ny endri-javatra miaraka amin'ny EC2 prefix ao amin'ny anarana ary manampy ity code ity: import logging from typing import Dict, Any from http import HTTPStatus import boto3 logger = logging.getLogger() logger.setLevel(logging.INFO) ec2_client = boto3.client('ec2') def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]: """ AWS Lambda handler for processing Bedrock agent requests related to EC2 instances. Supports: - Listing all EC2 instances - Describing a specific instance by ID """ try: action_group = event['actionGroup'] function = event['function'] message_version = event.get('messageVersion', 1) parameters = event.get('parameters', []) response_text = "" if function == "list_instances": # List all EC2 instances instances = ec2_client.describe_instances() instance_list = [] for reservation in instances['Reservations']: for instance in reservation['Instances']: instance_list.append({ 'InstanceId': instance.get('InstanceId'), 'State': instance.get('State', {}).get('Name'), 'InstanceType': instance.get('InstanceType'), 'PrivateIpAddress': instance.get('PrivateIpAddress', 'N/A'), 'PublicIpAddress': instance.get('PublicIpAddress', 'N/A') }) response_text = f"Found {len(instance_list)} EC2 instance(s): {instance_list}" elif function == "describe_instance": # Expect a parameter with the instance ID instance_id_param = next((p for p in parameters if p['name'] == 'instanceId'), None) if not instance_id_param: raise KeyError("Missing required parameter: instanceId") instance_id = instance_id_param['value'] result = ec2_client.describe_instances(InstanceIds=[instance_id]) instance = result['Reservations'][0]['Instances'][0] response_text = ( f"Instance {instance_id} details: " f"State={instance['State']['Name']}, " f"Type={instance['InstanceType']}, " f"Private IP={instance.get('PrivateIpAddress', 'N/A')}, " f"Public IP={instance.get('PublicIpAddress', 'N/A')}" ) else: response_text = f"Unknown function '{function}' requested." # Format Bedrock agent response response_body = { 'TEXT': { 'body': response_text } } action_response = { 'actionGroup': action_group, 'function': function, 'functionResponse': { 'responseBody': response_body } } response = { 'response': action_response, 'messageVersion': message_version } logger.info('Response: %s', response) return response except KeyError as e: logger.error('Missing required field: %s', str(e)) return { 'statusCode': HTTPStatus.BAD_REQUEST, 'body': f'Error: {str(e)}' } except Exception as e: logger.error('Unexpected error: %s', str(e)) return { 'statusCode': HTTPStatus.INTERNAL_SERVER_ERROR, 'body': f'Internal server error: {str(e)}' } SOHA: Ny valin'ny fonosana dia tsy maintsy amin'ny format Bedrock manokana, ny antsipirihany dia azo jerena ao amin'ny antontan-taratasy: https://docs.aws.amazon.com/bedrock/latest/userguide/agents-lambda.html Taorian'ny fanavaozana ny fehezan-dalàna, mandeha any amin'ny fonosana Configuration → permissions → role name, mamorona fitsipika vaovao: Toy ny JSON: { "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Action": [ "ec2:DescribeInstances" ], "Resource": [ "*" ] } ] } Ankehitriny dia afaka miverina amin'ny mpiara-miasa isika ary tsindrio ny "Test", alefaso ny lahatsoratra mba hanamarinana raha tena miasa izany: Cool! Ny vondrona hetsika voalohany dia miasa araka ny fanantenana, mamela ny vondrona hetsika iray hafa hanampy amin'ny lisitry ny cloudwatch: Ny anaran'ny vondrona hetsika - cloudwatch Ny anaran'ny endri-javatra dia getMetrics, manampy ny famaritana sy ny parameters, satria ity lambda ity dia tsy maintsy mahalala ny instance na intances mba hanamarinana ny metrics Ataovy amin'ny fampahafantarana ny mpiara-miasa mba hampahafantarana ny fomba tiantsika ny hampiasa ny vondrona vaovao, ary tsindrio indray ny "Save" sy "Prepare" Ianao no mpanara-maso ny AWS Supervisor. Ny tanjona dia ny hanampy amin'ny fanadihadiana ny rafitra AWS. Ny vondrona fampandrosoana: ec2: describeInstances → miverina ny lisitry ny instance + instanceIds cloudwatch: getMetrics → mila ny instance_ids Ny fitsipika: Aza miantso ny API AWS mivantana. For EC2 + CPU: Call ec2__describeInstances Extract instanceIds Call cloudwatch__getMetrics Mifandray ny vokatra. Amin'ny ankapobeny, dia mampiasa ny "thinking" alohan'ny handray hetsika ianao. Ianao no mpanara-maso ny AWS Supervisor. Ny tanjona dia ny hanampy amin'ny fanadihadiana ny rafitra AWS. Ny vondrona fampandrosoana: ec2: describeInstances → miverina ny lisitry ny instance + instanceIds cloudwatch: getMetrics → mila ny instance_ids Ny fitsipika: Aza miantso ny API AWS mivantana. For EC2 + CPU: Call ec2__describeInstances Extract instanceIds Call cloudwatch__getMetrics Mifandray ny vokatra. Amin'ny ankapobeny, dia mampiasa ny "thinking" alohan'ny handray hetsika ianao. Amin'izao fotoana izao dia azonao atao ny manatsara ny fehezan-dalàna Cloudwatch: import boto3 import datetime import logging import json from typing import Dict, Any from http import HTTPStatus logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]: try: action_group = event["actionGroup"] function = event["function"] message_version = event.get("messageVersion", 1) parameters = event.get("parameters", []) region = "us-east-1" instance_ids = [] # --- Parse parameters --- for param in parameters: if param.get("name") == "region": region = param.get("value") elif param.get("name") == "instance_ids": raw_value = param.get("value") if isinstance(raw_value, str): # Clean up stringified list from Bedrock agent raw_value = raw_value.strip().replace("[", "").replace("]", "").replace("'", "") instance_ids = [x.strip() for x in raw_value.split(",") if x.strip()] elif isinstance(raw_value, list): instance_ids = raw_value logger.info(f"Parsed instance IDs: {instance_ids}") if not instance_ids: response_text = f"No instance IDs provided for CloudWatch metrics in {region}." else: cloudwatch = boto3.client("cloudwatch", region_name=region) now = datetime.datetime.utcnow() start_time = now - datetime.timedelta(hours=1) metrics_output = [] for instance_id in instance_ids: try: metric = cloudwatch.get_metric_statistics( Namespace="AWS/EC2", MetricName="CPUUtilization", Dimensions=[{"Name": "InstanceId", "Value": instance_id}], StartTime=start_time, EndTime=now, Period=300, Statistics=["Average"] ) datapoints = metric.get("Datapoints", []) if datapoints: datapoints.sort(key=lambda x: x["Timestamp"]) avg_cpu = round(datapoints[-1]["Average"], 2) metrics_output.append(f"{instance_id}: {avg_cpu}% CPU (avg last hour)") else: metrics_output.append(f"{instance_id}: No recent CPU data") except Exception as e: logger.error(f"Error fetching metrics for {instance_id}: {e}") metrics_output.append(f"{instance_id}: Error fetching metrics") response_text = ( f"CPU Utilization (last hour) in {region}:\n" + "\n".join(metrics_output) ) # --- Bedrock Agent response format --- response_body = { "TEXT": { "body": response_text } } action_response = { "actionGroup": action_group, "function": function, "functionResponse": { "responseBody": response_body } } response = { "response": action_response, "messageVersion": message_version } logger.info("Response: %s", response) return response except Exception as e: logger.error(f"Unexpected error: {e}") return { "statusCode": HTTPStatus.INTERNAL_SERVER_ERROR, "body": f"Internal server error: {str(e)}" } Ary manatsara ny fahazoan-dalana lambda amin'ny cloudwatch tahaka ny nataonay tamin'ny ec2 lambda: { "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Action": [ "cloudwatch:GetMetricStatistics" ], "Resource": [ "*" ] } ] } Ary manandrana izany indray Manana EC2 sy CloudWatch asa vondrona, ary izy ireo dia azo antso avy amin'ny mpiara-miasa mba hahazoana lisitry ny EC2 instances sy ny CPU metrics. Ankoatra ny mpitantana miantso ny EC2 sy ny CloudWatch tsy miankina, ny mpitantana dia miantso ity lohahevitra ity. Voalohany dia miantso ny endri-javatra EC2 mba hahazoana rehetra, ary avy eo dia mandefa ireo ID instance ireo amin'ny endri-javatra CloudWatch mba hahazoana metrics, ary farany dia mampifandray ny zava-drehetra amin'ny vokatra iray mazava. Amin'ity fomba ity, ny mpiara-miasa dia mila miantso asa iray ihany - ny Supervisor - raha ny Supervisor dia miara-miasa amin'ny dingana rehetra ao amin'ny taonjato. Omeo ny anarana sy ny famaritana Ampidiro ny anaran'ny asa sy ny famaritana Ary manatsara ny toro-hevitra momba ny mpiara-miasa mba hisorohana ny antso mivantana amin'ny vondrona fiantraikany amin'ny ec2 sy CloudWatch: Ary tsindrio eo amin'ny “Save” sy “Prepare”. Amin'ny alalan'ny fametrahana ny lambda function code, NOTE: need to update your EC2 and Cloudwatch functions name in the code below: import boto3 import json import logging import re import ast logger = logging.getLogger() logger.setLevel(logging.INFO) lambda_client = boto3.client("lambda") def lambda_handler(event, context): try: action_group = event["actionGroup"] function = event["function"] parameters = event.get("parameters", []) message_version = event.get("messageVersion", "1.0") # Parse parameters region = "us-east-1" for param in parameters: if param.get("name") == "region": region = param.get("value") # Decide routing if function == "analyzeInfrastructure": logger.info("Supervisor: calling EC2 and CloudWatch") # Step 1: call EC2 Lambda ec2_payload = { "actionGroup": "ec2", "function": "list_instances", "parameters": [{"name": "region", "value": region}], "messageVersion": "1.0" } ec2_response = invoke_lambda("ec2-yeikw", ec2_payload) #### CHANGE TO YOUR EC2 FUNCTION NAME instances = extract_instance_ids(ec2_response) # Step 2: call CloudWatch Lambda (if instances found) if instances: cw_payload = { "actionGroup": "cloudwatch", "function": "getMetrics", "parameters": [ {"name": "region", "value": region}, {"name": "instance_ids", "value": instances} ], "messageVersion": "1.0" } cw_response = invoke_lambda("cloudwatch-ef6ty", cw_payload) #### CHANGE TO YOUR CLOUDWATCH FUNCTION NAME final_text = merge_responses(ec2_response, cw_response) else: final_text = "No instances found to analyze." else: final_text = f"Unknown function: {function}" # Construct Bedrock-style response response = { "messageVersion": message_version, "response": { "actionGroup": action_group, "function": function, "functionResponse": { "responseBody": { "TEXT": {"body": final_text} } } } } logger.info("Supervisor response: %s", response) return response except Exception as e: logger.exception("Error in supervisor") return { "statusCode": 500, "body": f"Supervisor error: {str(e)}" } def invoke_lambda(name, payload): """Helper to call another Lambda and parse response""" response = lambda_client.invoke( FunctionName=name, InvocationType="RequestResponse", Payload=json.dumps(payload), ) result = json.loads(response["Payload"].read()) return result def extract_instance_ids(ec2_response): """Extract instance IDs from EC2 Lambda response""" try: body = ec2_response["response"]["functionResponse"]["responseBody"]["TEXT"]["body"] # Try to extract JSON-like data after "Found X EC2 instance(s):" if "Found" in body and "[" in body and "]" in body: data_part = body.split(":", 1)[1].strip() try: instances = ast.literal_eval(data_part) # safely parse the list return [i["InstanceId"] for i in instances if "InstanceId" in i] except Exception: pass # fallback regex in case of plain text return re.findall(r"i-[0-9a-f]+", body) except Exception as e: logger.error("extract_instance_ids error: %s", e) return [] def merge_responses(ec2_resp, cw_resp): """Combine EC2 and CloudWatch outputs""" ec2_text = ec2_resp["response"]["functionResponse"]["responseBody"]["TEXT"]["body"] cw_text = cw_resp["response"]["functionResponse"]["responseBody"]["TEXT"]["body"] return f"{ec2_text}\n\n{cw_text}" Ary indray, manampy ny fahazoan-dalana lambda ny mpitantana mba hitarika ny EC2 sy ny Cloudwatch, ohatra: { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-east-1:<account_id>:function:ec2-<id>", "arn:aws:lambda:us-east-1:<account_id>:function:cloudwatch-<id>" ] } ] } Aoka isika hanandrana indray ny endri-javatra, ary mahagaga izany dia tsy Nitsidika ny Supervisor Supervisor Function Logs aho ary nahita izany Ny iray dia toa tsy mampiseho na inona na inona mahasoa, fa tsy - ny torohevitra izany 3000.00ms. ny fe-potoan'ny lambda fe-potoana, mamela ny fanitsiana azy. Mandehana any amin'ny fanaraha-maso asa - fametrahana - ankapobeny ary manova ny Timeout parameter , niova ho 10 segondra Ary dia nanampy izany! Azonao atao ny manatsara ity endri-javatra ity amin'ny alàlan'ny fanampian'ny fanadihadiana ny fandoavam-bola AWS mba hahita ny loharano lafo indrindra na ny ankamaroan'ny ary Salmona niteraka an'i Boaza tamin-dRahaba ; ary Boaza niteraka an'i Obeda tamin-dRota ; ary Obeda niteraka an'i Jese ; Expensive ec2 instances izay mihazakazaka