Bedrock Practice Series 03
Bedrock Agent로
AWS 리소스 조회 자동화하기
Lambda Action Group 구성
2편에서는 Python 코드가 직접 EC2와 S3를 조회하고, Bedrock이 그 결과를 요약하는 구조를 실습했습니다. 이번 글에서는 한 단계 더 나아가 사용자가 자연어로 질문하면 Bedrock Agent가 Lambda를 호출하고, Lambda가 AWS 리소스를 조회한 뒤 결과를 다시 Agent에게 전달하는 구조를 초보자 기준으로 설명합니다.
Amazon Bedrock Bedrock Agent Action Group Lambda EC2 Automation
핵심 요약
Bedrock Agent는 사용자의 자연어 요청을 이해하고, 필요한 도구를 선택해 실행할 수 있는 구조입니다. 여기서 도구 역할을 하는 것이 Action Group이고, Action Group 뒤에는 Lambda 함수를 연결할 수 있습니다.
예를 들어 사용자가 “현재 실행 중인 EC2 알려줘”라고 질문하면 Bedrock Agent는 이 요청이 EC2 조회 작업이라는 것을 판단합니다. 그리고 Action Group에 연결된 Lambda 함수를 호출합니다. Lambda는 ec2.describe_instances()를 실행해 EC2 목록을 가져오고, Agent는 그 결과를 사람이 읽기 쉬운 문장으로 정리합니다.
!
초보자 핵심: Bedrock Agent가 직접 EC2를 조회하는 것이 아닙니다. Agent는 “어떤 작업이 필요한지” 판단하고, 실제 AWS API 조회는 Lambda가 수행합니다.
SECTION 01
이번 글에서 만들 구조
사용자가 질문하면 Agent가 Lambda를 호출한다
이번 글에서는 사용자가 자연어로 AWS 리소스 조회를 요청하는 구조를 만듭니다. 2편에서는 사용자가 직접 Python 코드를 실행했습니다. 하지만 이번에는 사용자가 코드 파일을 실행하지 않습니다. 대신 Bedrock Agent에게 질문합니다.
Agent는 사용자의 질문을 보고 어떤 기능이 필요한지 판단합니다. EC2 조회가 필요하다고 판단하면 Action Group을 선택하고, Action Group에 연결된 Lambda 함수를 호출합니다. Lambda는 실제 AWS API를 호출해 실행 중인 EC2 목록을 조회합니다.
사용자 질문
→
Bedrock Agent
→
Action Group
→
Lambda
→
EC2 API 조회
→
Agent 응답
| 구성 요소 |
역할 |
초보자 설명 |
| 사용자 |
자연어로 질문합니다. |
“실행 중인 EC2 알려줘”라고 입력합니다. |
| Bedrock Agent |
요청을 이해하고 필요한 작업을 판단합니다. |
이 질문은 EC2 조회가 필요하다고 판단합니다. |
| Action Group |
Agent가 사용할 수 있는 기능 묶음입니다. |
EC2 조회 기능을 Agent에게 알려주는 역할입니다. |
| Lambda |
실제 AWS API를 호출합니다. |
EC2 목록을 조회하는 Python 코드가 실행됩니다. |
| EC2 API |
AWS 리소스 정보를 반환합니다. |
describe_instances 결과를 Lambda로 돌려줍니다. |
| 최종 응답 |
Agent가 결과를 요약합니다. |
“현재 실행 중인 EC2는 2대입니다.”처럼 답합니다. |
SECTION 02
2편 구조와 3편 구조의 차이
2편은 코드 직접 실행, 3편은 Agent가 Lambda 호출
2편에서는 사용자가 Python 파일을 직접 실행했습니다. Python 코드가 EC2와 S3를 조회하고, 조회 결과를 Bedrock Converse API에 전달했습니다. 이 구조는 이해하기 쉽고 실습하기 좋지만, 매번 코드를 직접 실행해야 합니다.
3편에서는 Bedrock Agent를 사용합니다. 사용자는 코드 파일을 직접 실행하지 않고, Agent에게 질문합니다. Agent는 질문을 이해한 뒤 필요한 Lambda 함수를 호출합니다. 이 구조가 되면 “자연어 기반 AWS 리소스 조회”에 가까워집니다.
| 구분 |
2편 구조 |
3편 구조 |
| 사용자 입력 |
Python 파일 실행 |
Agent에게 자연어 질문 |
| AWS API 호출 주체 |
로컬 Python 코드 |
Lambda 함수 |
| Bedrock 역할 |
조회 결과 요약 |
요청 판단, 도구 선택, 결과 요약 |
| 자동화 수준 |
낮음 |
높음 |
| 실무 확장성 |
스크립트 기반 점검 |
대화형 AI 운영 도우미 |
i
정리: 2편은 “내가 코드를 실행해서 Bedrock에게 요약시키는 방식”이고, 3편은 “Agent가 필요한 도구를 골라 Lambda를 실행하는 방식”입니다.
SECTION 03
Bedrock Agent를 아주 쉽게 이해하기
Agent는 질문을 이해하고 도구를 고르는 역할
Bedrock Agent는 단순히 문장을 생성하는 모델 호출보다 한 단계 더 나아간 구조입니다. 일반 모델 호출은 사용자가 입력한 문장에 대해 답변을 생성합니다. 반면 Agent는 사용자의 요청을 보고 필요한 작업을 수행할 수 있습니다.
예를 들어 “EC2가 뭐야?”라는 질문은 설명만 하면 됩니다. 하지만 “현재 실행 중인 EC2를 알려줘”라는 요청은 실제 AWS API 조회가 필요합니다. Bedrock Agent는 이런 차이를 구분하고, 필요한 경우 Action Group을 통해 Lambda 같은 외부 기능을 호출합니다.
| 사용자 질문 |
필요한 동작 |
Agent의 판단 |
| EC2가 뭐야? |
개념 설명 |
모델이 바로 답변 |
| 현재 실행 중인 EC2 알려줘 |
EC2 API 조회 필요 |
Lambda Action Group 호출 |
| S3 버킷 목록 정리해줘 |
S3 API 조회 필요 |
S3 조회 도구 호출 |
| 보안그룹에 0.0.0.0/0 열린 포트 찾아줘 |
Security Group 조회와 분석 필요 |
보안 점검용 Lambda 호출 |
질문 이해
→
필요한 작업 판단
→
Action Group 선택
→
Lambda 실행
→
결과 설명
!
오해 주의: Agent가 모든 것을 알아서 안전하게 처리하는 것은 아닙니다. 어떤 Lambda를 연결하는지, Lambda에 어떤 IAM 권한을 부여하는지, Agent가 어떤 작업을 할 수 있게 허용하는지가 중요합니다.
SECTION 04
Action Group이란 무엇인가
Agent가 사용할 수 있는 기능 목록
Action Group은 Bedrock Agent가 호출할 수 있는 기능을 정의하는 영역입니다. 예를 들어 EC2 조회, S3 조회, 보안 그룹 점검, 비용 조회 같은 기능을 각각 Action Group으로 만들 수 있습니다.
Action Group에는 “이 기능은 어떤 요청을 받을 수 있는지”, “어떤 Lambda를 실행해야 하는지”, “입력과 출력은 어떤 형식인지”를 정의합니다. 초보자 관점에서는 Action Group을 Agent에게 연결해 주는 도구 메뉴라고 생각하면 됩니다.
| Action Group 구성 요소 |
의미 |
이번 실습 예시 |
| Action Group Name |
도구 묶음 이름입니다. |
AwsResourceLookupActionGroup |
| Description |
Agent가 이 도구의 용도를 이해하는 설명입니다. |
EC2 리소스 조회용 도구 |
| Action Group Executor |
실제로 실행할 대상입니다. |
Lambda 함수 |
| API Schema |
Agent가 호출할 API 형식을 정의합니다. |
GET /ec2/running |
| Lambda Response |
Lambda가 Agent에게 반환하는 결과입니다. |
실행 중인 EC2 목록 JSON |
i
쉽게 말하면: Agent는 “생각하는 역할”, Action Group은 “사용 가능한 도구 목록”, Lambda는 “실제로 AWS API를 실행하는 코드”입니다.
SECTION 05
이번 실습의 목표
자연어로 실행 중인 EC2를 조회한다
이번 글에서는 가장 단순한 예시로 시작합니다. 사용자가 Bedrock Agent에게 “현재 실행 중인 EC2 인스턴스를 알려줘”라고 질문하면, Agent가 Lambda를 호출해 실행 중인 EC2 목록을 조회하게 만들 것입니다.
S3, RDS, IAM, 보안 그룹 점검까지 한 번에 넣으면 초보자에게 너무 복잡해집니다. 따라서 3편에서는 EC2 조회 하나에 집중합니다. 구조를 이해한 뒤 같은 방식으로 S3, 보안 그룹, CloudTrail 점검 기능을 추가하면 됩니다.
사용자 질문: 현재 실행 중인 EC2 인스턴스를 알려줘. Agent 동작: 1. EC2 조회가 필요한 요청이라고 판단한다. 2. Action Group을 선택한다. 3. Lambda 함수를 호출한다. 4. Lambda가 EC2 DescribeInstances API를 실행한다. 5. 결과를 받아 사용자가 이해하기 쉽게 요약한다.
| 이번 글에서 하는 것 |
이번 글에서 하지 않는 것 |
| Lambda로 실행 중인 EC2 조회 |
EC2 생성, 삭제, 중지 |
| Bedrock Agent Action Group 연결 |
MCP 서버 구성 |
| OpenAPI Schema로 Lambda 호출 정의 |
복잡한 다중 API 운영 자동화 |
| 콘솔 테스트와 SDK 호출 개념 설명 |
운영 배포용 전체 웹 화면 구축 |
SECTION 06
실습 전에 필요한 준비물
Bedrock, Lambda, EC2 조회 권한이 필요하다
이번 실습에는 Bedrock Agent, Lambda, EC2 조회 권한이 필요합니다. 2편보다 구성 요소가 많기 때문에 처음에는 테스트 계정에서 진행하는 것이 좋습니다.
특히 IAM 권한을 주의해야 합니다. Lambda에는 EC2를 조회할 수 있는 권한만 부여합니다. 처음부터 EC2 중지, 삭제, 생성 권한을 주면 실습 중 실수로 운영 리소스에 영향을 줄 수 있습니다.
01
Amazon Bedrock 모델 접근 권한
Agent가 사용할 Foundation Model에 접근 권한이 있어야 합니다.
02
Bedrock Agent 생성 권한
Agent, Action Group, Alias를 생성하고 테스트할 수 있어야 합니다.
03
Lambda 함수 생성 권한
EC2 조회 코드를 실행할 Lambda를 만들어야 합니다.
04
EC2 조회 권한
Lambda 실행 역할에 ec2:DescribeInstances 권한이 필요합니다.
05
CloudWatch Logs 권한
Lambda 실행 로그를 확인하기 위해 필요합니다.
!
보안 기준: 이번 실습에서 Lambda는 조회만 해야 합니다. ec2:StartInstances, ec2:StopInstances, ec2:TerminateInstances 같은 권한은 넣지 않습니다.
SECTION 07
Lambda 실행 역할 만들기
Lambda가 EC2를 조회할 수 있도록 IAM Role을 준비한다
Lambda 함수가 EC2 정보를 조회하려면 Lambda 실행 역할에 EC2 조회 권한이 있어야 합니다. 또한 Lambda가 로그를 남길 수 있도록 CloudWatch Logs 권한도 필요합니다.
아래 정책은 학습용 예시입니다. 실행 중인 EC2 목록을 조회하는 데 필요한 ec2:DescribeInstances와 Lambda 로그 저장에 필요한 기본 로그 권한만 포함했습니다.
json - Lambda 실행 역할에 연결할 학습용 정책 예시
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowReadEc2Instances", "Effect": "Allow", "Action": [ "ec2:DescribeInstances" ], "Resource": "*" }, { "Sid": "AllowLambdaLogging", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" } ] }
| 권한 |
필요한 이유 |
주의사항 |
| ec2:DescribeInstances |
EC2 목록을 조회합니다. |
조회 권한이므로 리소스를 변경하지 않습니다. |
| logs:CreateLogGroup |
Lambda 로그 그룹을 만들 수 있습니다. |
실습 후 로그 그룹 정리를 검토합니다. |
| logs:CreateLogStream |
Lambda 실행 로그 스트림을 만듭니다. |
로그에 민감 정보가 남지 않도록 주의합니다. |
| logs:PutLogEvents |
Lambda 로그를 기록합니다. |
과도한 로그 출력은 비용에 영향을 줄 수 있습니다. |
i
초보자 팁: AWS 관리형 정책 AWSLambdaBasicExecutionRole을 사용해 로그 권한을 부여하고, EC2 조회 권한만 별도 정책으로 추가하는 방식도 가능합니다.
SECTION 08
EC2 조회 Lambda 함수 작성
Lambda가 실제 AWS API를 호출한다
이제 Lambda 함수를 작성합니다. 이 Lambda는 실행 중인 EC2 인스턴스만 조회합니다. 그리고 인스턴스 이름, 인스턴스 ID, 타입, 상태, AZ, Private IP, Public IP를 정리해서 반환합니다.
중요한 점은 Lambda 응답 형식입니다. Bedrock Agent의 Action Group에서 Lambda를 호출하면, Lambda는 Agent가 이해할 수 있는 형식으로 결과를 반환해야 합니다. 아래 예시는 Action Group에서 API Schema 기반으로 Lambda를 호출하는 경우를 기준으로 작성했습니다.
import json import boto3 import os AWS_REGION = os.environ.get("RESOURCE_REGION", "ap-northeast-2") ec2 = boto3.client("ec2", region_name=AWS_REGION) def get_running_ec2_instances(): response = ec2.describe_instances( Filters=[ {"Name": "instance-state-name", "Values": ["running"]} ] ) instances = [] for reservation in response.get("Reservations", []): for instance in reservation.get("Instances", []): name = "-" for tag in instance.get("Tags", []): if tag.get("Key") == "Name": name = tag.get("Value", "-") instances.append({ "name": name, "instanceId": instance.get("InstanceId"), "instanceType": instance.get("InstanceType"), "state": instance.get("State", {}).get("Name"), "availabilityZone": instance.get("Placement", {}).get("AvailabilityZone"), "privateIpAddress": instance.get("PrivateIpAddress", "-"), "publicIpAddress": instance.get("PublicIpAddress", "-") }) return instances def lambda_handler(event, context): print("Received event:", json.dumps(event, ensure_ascii=False)) action_group = event.get("actionGroup", "AwsResourceLookupActionGroup") api_path = event.get("apiPath", "/ec2/running") http_method = event.get("httpMethod", "GET") try: if api_path == "/ec2/running" and http_method == "GET": instances = get_running_ec2_instances() result = { "region": AWS_REGION, "runningInstanceCount": len(instances), "instances": instances } status_code = 200 else: result = { "message": f"Unsupported path or method: {http_method} {api_path}" } status_code = 400 except Exception as e: result = { "message": "EC2 조회 중 오류가 발생했습니다.", "error": str(e) } status_code = 500 response_body = { "application/json": { "body": json.dumps(result, ensure_ascii=False) } } return { "messageVersion": "1.0", "response": { "actionGroup": action_group, "apiPath": api_path, "httpMethod": http_method, "httpStatusCode": status_code, "responseBody": response_body } }
!
주의: Lambda 로그에 실제 인스턴스 ID, IP, 태그 정보가 출력될 수 있습니다. 운영 환경에서는 로그 출력 범위를 최소화하고, 민감한 태그 값이 남지 않도록 관리해야 합니다.
SECTION 09
Lambda 환경 변수 설정
조회할 리전을 환경 변수로 관리한다
Lambda 코드에는 RESOURCE_REGION이라는 환경 변수를 사용했습니다. 이 값은 EC2를 조회할 리전입니다. 예를 들어 서울 리전의 EC2를 조회하려면 ap-northeast-2를 입력합니다.
Bedrock Agent가 동작하는 리전과 EC2를 조회할 리전은 다를 수 있습니다. Lambda가 어느 리전에서 실행되든, boto3 client에 지정한 리전의 EC2를 조회합니다.
Key: RESOURCE_REGION Value: ap-northeast-2
| 리전 코드 |
의미 |
예시 |
| ap-northeast-2 |
서울 리전 |
한국에서 많이 사용하는 리전 |
| us-east-1 |
버지니아 북부 리전 |
Bedrock 모델 실습에서 자주 사용하는 리전 |
| ap-northeast-1 |
도쿄 리전 |
일본 워크로드가 있는 경우 사용 |
i
초보자 팁: EC2가 없는 리전을 조회하면 결과가 빈 배열로 나올 수 있습니다. 실제 EC2가 있는 리전을 정확히 지정해야 합니다.
SECTION 10
Lambda 단독 테스트
Agent에 연결하기 전에 Lambda부터 테스트한다
초보자가 가장 많이 하는 실수는 Lambda를 테스트하지 않은 상태에서 바로 Bedrock Agent에 연결하는 것입니다. 이렇게 하면 오류가 났을 때 Agent 문제인지, Lambda 문제인지, IAM 권한 문제인지 구분하기 어렵습니다.
따라서 먼저 Lambda 콘솔에서 테스트 이벤트를 만들어 실행합니다. 아래 이벤트는 Bedrock Agent가 Lambda를 호출할 때 전달하는 값과 비슷한 형태로 만든 테스트용 이벤트입니다.
{ "messageVersion": "1.0", "actionGroup": "AwsResourceLookupActionGroup", "apiPath": "/ec2/running", "httpMethod": "GET" }
| 테스트 결과 |
의미 |
조치 |
| runningInstanceCount가 출력됨 |
Lambda와 EC2 조회 권한이 정상입니다. |
Action Group 연결 단계로 넘어갑니다. |
| AccessDenied |
Lambda 실행 역할에 EC2 조회 권한이 없습니다. |
ec2:DescribeInstances 권한을 확인합니다. |
| 빈 instances 배열 |
해당 리전에 실행 중인 EC2가 없습니다. |
환경 변수 RESOURCE_REGION을 확인합니다. |
| Unsupported path |
테스트 이벤트의 apiPath나 method가 다릅니다. |
/ec2/running, GET으로 맞춥니다. |
!
중요: Lambda 단독 테스트가 성공해야 Agent 연결도 수월합니다. Agent 연결 전에 Lambda 로그와 응답 형식을 먼저 확인하세요.
SECTION 11
Action Group API Schema 작성
Agent에게 어떤 API를 호출할 수 있는지 알려준다
Bedrock Agent가 Lambda를 호출하려면 “어떤 기능이 있는지”를 알아야 합니다. 이를 설명하는 방법 중 하나가 API Schema입니다. 초보자에게는 어렵게 보일 수 있지만, 핵심은 단순합니다.
아래 Schema는 Agent에게 GET /ec2/running이라는 기능이 있고, 이 기능은 실행 중인 EC2 인스턴스 목록을 조회하는 기능이라고 알려줍니다.
openapi: 3.0.0 info: title: AWS Resource Lookup API version: 1.0.0 description: APIs for looking up AWS resources through Lambda. paths: /ec2/running: get: operationId: getRunningEc2Instances summary: Get running EC2 instances description: Retrieve a list of currently running EC2 instances in the configured AWS region. responses: "200": description: A list of running EC2 instances. content: application/json: schema: type: object properties: region: type: string runningInstanceCount: type: integer instances: type: array items: type: object properties: name: type: string instanceId: type: string instanceType: type: string state: type: string availabilityZone: type: string privateIpAddress: type: string publicIpAddress: type: string
| Schema 항목 |
의미 |
Agent 관점 |
| operationId |
작업의 고유 이름입니다. |
이 기능이 어떤 작업인지 식별합니다. |
| summary |
짧은 설명입니다. |
사용자 질문과 기능을 매칭하는 데 도움을 줍니다. |
| description |
자세한 설명입니다. |
언제 이 기능을 호출해야 하는지 이해합니다. |
| responses |
응답 형식입니다. |
Lambda 결과를 어떻게 해석할지 참고합니다. |
i
초보자 팁: Schema의 description을 대충 쓰면 Agent가 언제 도구를 호출해야 하는지 헷갈릴 수 있습니다. “실행 중인 EC2 인스턴스를 조회한다”처럼 명확하게 작성하는 것이 좋습니다.
SECTION 12
Bedrock Agent 생성하기
Agent의 역할 설명을 명확하게 작성한다
이제 Bedrock 콘솔에서 Agent를 생성합니다. Agent를 만들 때는 이름, 설명, 사용할 Foundation Model, Instruction을 지정합니다. 여기서 Instruction은 Agent에게 “너는 어떤 역할을 해야 하는가”를 알려주는 지시문입니다.
초보자에게 중요한 것은 Instruction을 너무 넓게 쓰지 않는 것입니다. 이번 Agent는 AWS 리소스 조회 실습용이므로, EC2 조회와 결과 설명에 집중하도록 지시하는 것이 좋습니다.
text - Agent Instruction 예시
너는 AWS 초보자를 돕는 클라우드 운영 어시스턴트야. 사용자가 실행 중인 EC2 인스턴스에 대해 질문하면, 반드시 연결된 Action Group을 사용해서 실제 EC2 정보를 조회해. 조회 결과를 바탕으로 다음 내용을 초보자도 이해할 수 있게 설명해. 1. 실행 중인 EC2 개수 2. 인스턴스 이름과 타입 3. Public IP가 있는 인스턴스 여부 4. 비용 관점에서 확인할 점 5. 보안 관점에서 확인할 점 입력 데이터에 없는 내용은 추측하지 말고, 추가 확인이 필요하다고 말해. EC2를 생성, 중지, 삭제하는 작업은 수행하지 마.
01
Bedrock 콘솔에서 Agents 메뉴로 이동합니다.
Agent 생성 화면에서 새 Agent를 만듭니다.
02
Agent 이름을 입력합니다.
예: AwsResourceLookupAgent
03
Foundation Model을 선택합니다.
해당 리전에서 접근 가능한 모델을 선택합니다.
04
Instruction을 입력합니다.
Agent의 역할과 금지 작업을 명확히 작성합니다.
05
Agent를 저장합니다.
이후 Action Group을 추가합니다.
!
중요: Agent Instruction에 금지 작업을 명확히 적어두는 것이 좋습니다. 이번 실습에서는 EC2 조회만 허용하고, 생성·중지·삭제는 수행하지 않도록 제한합니다.
SECTION 13
Action Group 연결하기
Agent와 Lambda를 연결한다
Agent를 만들었다면 이제 Action Group을 추가합니다. Action Group은 Agent가 사용할 수 있는 도구입니다. 이번 실습에서는 실행 중인 EC2를 조회하는 Lambda 함수를 Action Group에 연결합니다.
Action Group을 만들 때는 Lambda 함수와 API Schema를 지정합니다. Schema에는 앞에서 작성한 GET /ec2/running 정의를 넣습니다. 그러면 Agent는 사용자가 EC2 조회를 요청했을 때 이 Action Group을 호출할 수 있습니다.
| 설정 항목 |
입력 예시 |
설명 |
| Action Group Name |
AwsResourceLookupActionGroup |
Agent가 사용할 도구 묶음 이름입니다. |
| Description |
실행 중인 EC2 인스턴스를 조회하는 기능 |
Agent가 도구 용도를 이해하는 데 중요합니다. |
| Action Group Executor |
Lambda Function |
실제 실행할 Lambda를 선택합니다. |
| Lambda Function |
bedrock-ec2-lookup |
앞에서 만든 EC2 조회 Lambda입니다. |
| API Schema |
OpenAPI Schema |
/ec2/running API 정의를 입력합니다. |
01
Agent 화면에서 Action Group을 추가합니다.
Agent가 사용할 수 있는 새 도구를 만드는 단계입니다.
02
Action Group 이름과 설명을 입력합니다.
EC2 조회용 기능임을 명확히 적습니다.
03
Lambda 함수를 선택합니다.
앞에서 만든 EC2 조회 Lambda를 연결합니다.
04
OpenAPI Schema를 입력합니다.
GET /ec2/running 경로를 정의한 Schema를 사용합니다.
05
Action Group을 저장합니다.
이후 Agent를 Prepare해서 테스트할 수 있게 만듭니다.
i
초보자 팁: Action Group을 수정한 뒤에는 Agent를 다시 Prepare해야 최신 설정이 테스트에 반영됩니다.
SECTION 14
Lambda 호출 권한 추가
Bedrock Agent가 Lambda를 호출할 수 있어야 한다
Action Group에서 Lambda를 선택했다고 해서 항상 호출이 바로 되는 것은 아닙니다. Lambda 함수 쪽에서도 Bedrock이 이 함수를 호출할 수 있도록 권한이 필요합니다.
콘솔에서 Action Group을 설정할 때 자동으로 권한을 추가해 주는 경우도 있지만, 호출 오류가 발생한다면 Lambda resource-based policy를 확인해야 합니다. AWS CLI로 권한을 추가하는 예시는 아래와 같습니다.
bash - Lambda 호출 권한 추가 예시
AWS_REGION="us-east-1" ACCOUNT_ID="123456789012" AGENT_ID="ABCDEFGHIJ" LAMBDA_FUNCTION_NAME="bedrock-ec2-lookup" aws lambda add-permission \ --function-name "${LAMBDA_FUNCTION_NAME}" \ --statement-id "AllowBedrockAgentInvoke" \ --action "lambda:InvokeFunction" \ --principal "bedrock.amazonaws.com" \ --source-arn "arn:aws:bedrock:${AWS_REGION}:${ACCOUNT_ID}:agent/${AGENT_ID}"
!
주의: 위 명령어의 리전, 계정 ID, Agent ID, Lambda 함수 이름은 본인 환경에 맞게 바꿔야 합니다. 이미 같은 statement-id가 있으면 중복 오류가 날 수 있습니다.
SECTION 15
Agent Prepare와 Alias 이해하기
설정 변경 후에는 Prepare가 필요하다
Bedrock Agent를 만들고 Action Group까지 연결했다면 Agent를 Prepare해야 합니다. Prepare는 현재 Agent 설정을 실행 가능한 상태로 준비하는 단계라고 보면 됩니다.
그리고 애플리케이션에서 Agent를 호출하려면 보통 Agent Alias를 사용합니다. Alias는 특정 버전의 Agent를 호출하기 위한 고정된 이름 또는 참조 지점처럼 생각하면 됩니다. 개발용, 운영용 Alias를 나누면 변경 관리가 쉬워집니다.
| 용어 |
의미 |
초보자 설명 |
| Prepare |
Agent 설정을 실행 가능한 상태로 준비합니다. |
Action Group 수정 후 다시 눌러야 합니다. |
| Agent Version |
Agent 설정의 특정 버전입니다. |
변경 시 버전 관리에 사용됩니다. |
| Alias |
Agent를 호출할 때 사용하는 참조입니다. |
애플리케이션에서 호출할 대상입니다. |
| Test Alias |
콘솔 테스트에 사용되는 임시 또는 테스트용 참조입니다. |
초기 테스트에 사용합니다. |
01
Action Group 저장 후 Agent를 Prepare합니다.
최신 설정이 Agent 실행에 반영됩니다.
02
콘솔 테스트 창에서 질문합니다.
“현재 실행 중인 EC2 인스턴스 알려줘”라고 입력합니다.
03
Lambda 로그를 함께 확인합니다.
Agent가 실제로 Lambda를 호출했는지 CloudWatch Logs에서 확인합니다.
04
응답이 부정확하면 Instruction과 Schema 설명을 수정합니다.
Agent가 도구를 잘 선택하도록 설명을 명확히 바꿉니다.
SECTION 16
콘솔에서 Agent 테스트하기
자연어 질문으로 Lambda 호출을 확인한다
이제 Bedrock Agent 테스트 창에서 질문을 입력합니다. 처음에는 아주 단순한 질문부터 시작하는 것이 좋습니다. 질문이 복잡하면 Agent가 어떤 도구를 호출해야 하는지 헷갈릴 수 있습니다.
실행 중인 EC2 인스턴스 목록을 조회하고, Public IP가 있는 인스턴스가 있는지 알려줘. 비용과 보안 관점에서 확인할 점도 같이 설명해줘.
예상 답변 형태
정상적으로 연결되었다면 Agent는 Lambda가 반환한 EC2 목록을 바탕으로 답변합니다. 예를 들어 실행 중인 인스턴스 수, 인스턴스 타입, Public IP 보유 여부, 운영자가 확인해야 할 점을 정리할 수 있습니다.
| 결과 |
의미 |
확인할 곳 |
| EC2 목록을 요약함 |
Agent와 Lambda 연결이 정상입니다. |
CloudWatch Logs에서 Lambda 호출 확인 |
| 도구를 호출하지 않고 일반 설명만 함 |
Instruction 또는 Schema 설명이 부족할 수 있습니다. |
Agent Instruction, Action Group description |
| Lambda 호출 오류 |
Lambda 권한 또는 응답 형식 문제일 수 있습니다. |
Lambda resource policy, CloudWatch Logs |
| AccessDenied |
Lambda 실행 역할에 EC2 조회 권한이 없습니다. |
Lambda IAM Role |
i
실무 팁: Agent 테스트 시에는 Bedrock 콘솔의 trace 기능을 함께 보면 Agent가 어떤 Action Group을 선택했는지 확인하는 데 도움이 됩니다.
SECTION 17
Python에서 Agent 호출하기
애플리케이션에서는 InvokeAgent를 사용한다
콘솔 테스트가 끝났다면 애플리케이션 코드에서 Agent를 호출할 수 있습니다. 이때는 Bedrock Agent Runtime의 invoke_agent를 사용합니다.
아래 코드는 Agent ID와 Agent Alias ID를 사용해 Agent에게 질문을 보내는 예시입니다. 실제 값은 본인의 Bedrock Agent 콘솔에서 확인한 값으로 바꿔야 합니다.
python - Bedrock Agent 호출 예시
import boto3 import uuid REGION = "us-east-1" AGENT_ID = "YOUR_AGENT_ID" AGENT_ALIAS_ID = "YOUR_AGENT_ALIAS_ID" client = boto3.client("bedrock-agent-runtime", region_name=REGION) prompt = "현재 실행 중인 EC2 인스턴스를 알려줘. Public IP가 있는지도 확인해줘." session_id = str(uuid.uuid4()) response = client.invoke_agent( agentId=AGENT_ID, agentAliasId=AGENT_ALIAS_ID, sessionId=session_id, inputText=prompt, enableTrace=True ) final_answer = "" for event in response.get("completion", []): if "chunk" in event: final_answer += event["chunk"]["bytes"].decode("utf-8") print(final_answer)
| 값 |
의미 |
확인 위치 |
| agentId |
Agent의 고유 ID입니다. |
Bedrock Agent 상세 화면 |
| agentAliasId |
호출할 Agent Alias ID입니다. |
Agent Alias 화면 |
| sessionId |
대화 세션을 구분하는 값입니다. |
애플리케이션에서 생성 |
| inputText |
사용자 질문입니다. |
사용자가 입력한 문장 |
| enableTrace |
Agent 동작 추적을 활성화합니다. |
디버깅 시 유용 |
!
주의: Agent를 호출하는 IAM 주체에는 bedrock:InvokeAgent 권한이 필요합니다. 또한 Agent Alias ARN 범위로 권한을 제한하는 것이 좋습니다.
SECTION 18
Agent 호출 권한 예시
애플리케이션이 Agent를 호출하려면 권한이 필요하다
Python 코드나 애플리케이션에서 Bedrock Agent를 호출하려면 해당 실행 주체에 bedrock:InvokeAgent 권한이 필요합니다. 예를 들어 EC2, Lambda, 로컬 사용자, CI/CD 역할이 Agent를 호출한다면 그 주체에 권한을 부여해야 합니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowInvokeSpecificBedrockAgentAlias", "Effect": "Allow", "Action": [ "bedrock:InvokeAgent" ], "Resource": [ "arn:aws:bedrock:us-east-1:123456789012:agent-alias/AGENTID1234/ALIASID1234" ] } ] }
i
권장 방식: 가능하면 Resource: "*"보다 특정 Agent Alias ARN으로 권한을 제한하는 것이 좋습니다.
SECTION 19
자주 발생하는 오류와 해결 방법
| 오류 또는 증상 |
가능한 원인 |
해결 방법 |
| Agent가 Lambda를 호출하지 않음 |
Instruction 또는 Action Group 설명이 모호함 |
“EC2 조회 요청 시 반드시 Action Group을 사용”이라고 명확히 작성 |
| Lambda AccessDenied |
Lambda 실행 역할에 EC2 조회 권한 없음 |
ec2:DescribeInstances 권한 추가 |
| Agent가 Lambda 호출 권한 없음 |
Lambda resource-based policy 누락 |
lambda:add-permission으로 Bedrock 호출 허용 |
| Lambda 응답 형식 오류 |
Action Group이 기대하는 응답 구조와 다름 |
messageVersion, response, responseBody 형식 확인 |
| 실행 중인 EC2가 없다고 나옴 |
조회 리전이 다르거나 실제 실행 중 EC2가 없음 |
RESOURCE_REGION 환경 변수 확인 |
| Agent 호출 AccessDenied |
애플리케이션 실행 주체에 InvokeAgent 권한 없음 |
bedrock:InvokeAgent 권한 추가 |
| 수정했는데 테스트에 반영 안 됨 |
Agent Prepare를 다시 하지 않음 |
Action Group 수정 후 Agent Prepare 재실행 |
!
디버깅 순서: Lambda 단독 테스트 → Lambda 로그 확인 → Agent Action Group 설정 확인 → Agent Prepare → 콘솔 테스트 → InvokeAgent 코드 테스트 순서로 보는 것이 좋습니다.
SECTION 20
보안과 비용 주의사항
Agent는 편리하지만 권한 관리가 더 중요하다
Bedrock Agent를 사용하면 자연어로 AWS 리소스를 조회할 수 있어 매우 편리합니다. 하지만 편리한 만큼 권한 관리가 중요합니다. Agent가 호출하는 Lambda에 강한 권한을 부여하면, 사용자의 질문에 따라 의도치 않은 작업이 실행될 수 있습니다.
이번 실습에서는 조회만 수행하지만, 실무에서 기능을 확장할 때는 반드시 읽기 권한과 변경 권한을 분리해야 합니다. 특히 삭제, 중지, 정책 변경, 보안 그룹 수정 같은 작업은 별도의 승인 절차 없이 Agent가 수행하지 못하도록 제한하는 것이 좋습니다.
01
Lambda에는 최소 권한만 부여합니다.
이번 실습에서는 ec2:DescribeInstances만 필요합니다.
02
Agent Instruction에 금지 작업을 명시합니다.
EC2 생성, 중지, 삭제는 수행하지 말라고 명확히 작성합니다.
03
민감 정보가 로그에 남지 않게 합니다.
Lambda 로그에 운영 태그, IP, 계정 정보가 과도하게 남지 않도록 주의합니다.
04
Agent 호출 비용을 확인합니다.
Agent 호출, 모델 사용량, Lambda 실행, CloudWatch Logs 비용이 발생할 수 있습니다.
05
실습 후 사용하지 않는 리소스를 정리합니다.
Agent, Lambda, IAM Role, 로그 그룹을 확인합니다.
SECTION 21
실무 확장 방향
EC2 조회에서 AWS 운영 점검 Agent로 확장할 수 있다
이번 글에서는 실행 중인 EC2 조회만 다뤘습니다. 하지만 구조를 이해했다면 같은 방식으로 여러 AWS 리소스 조회 기능을 추가할 수 있습니다. Action Group에 API 경로를 추가하거나, 별도 Action Group을 만들어 기능을 분리할 수 있습니다.
| 확장 기능 |
Lambda에서 호출할 API 예시 |
Agent 질문 예시 |
| S3 버킷 목록 조회 |
s3.list_buckets() |
“S3 버킷 목록을 정리해줘” |
| S3 공개 접근 점검 |
get_public_access_block |
“공개 접근 위험이 있는 S3를 찾아줘” |
| Security Group 점검 |
ec2.describe_security_groups() |
“0.0.0.0/0으로 열린 포트를 찾아줘” |
| RDS 인스턴스 조회 |
rds.describe_db_instances() |
“운영 중인 RDS 목록을 알려줘” |
| CloudTrail 상태 확인 |
cloudtrail.describe_trails() |
“CloudTrail이 켜져 있는지 확인해줘” |
| 비용 조회 |
ce.get_cost_and_usage() |
“이번 달 EC2 비용을 요약해줘” |
i
확장 기준: 처음에는 조회 기능만 추가하는 것이 안전합니다. 수정·삭제·재시작 같은 실행 기능은 승인 흐름과 감사 로그를 먼저 설계한 뒤 추가해야 합니다.
SECTION 22
참고 자료
핵심 요약
Agent
사용자 질문을 이해하고 필요한 작업을 판단하는 역할을 한다.
Action Group
Agent가 사용할 수 있는 도구 또는 기능 묶음이다.
Lambda
실제 AWS API를 호출해 EC2 정보를 조회한다.
Schema
Agent에게 어떤 API를 호출할 수 있는지 알려주는 설명서 역할을 한다.
InvokeAgent
애플리케이션 코드에서 Bedrock Agent를 호출할 때 사용한다.
Security
Lambda에는 최소 조회 권한만 부여하고, 수정·삭제 권한은 제한해야 한다.
CONCLUSION
이번 글에서는 Bedrock Agent로 AWS 리소스 조회를 자동화하는 기본 구조를 살펴봤습니다.
핵심은 Agent가 판단하고, Action Group이 도구를 연결하고, Lambda가 실제 AWS API를 호출한다는 점입니다.
2편에서는 Python 코드가 직접 EC2와 S3를 조회했습니다. 3편에서는 그 조회 코드를 Lambda로 옮기고, Bedrock Agent가 자연어 요청에 따라 Lambda를 호출하도록 확장했습니다. 이 구조를 이해하면 AWS 운영 도우미, 보안 점검 Agent, 비용 조회 Agent 같은 실무형 도구로 확장할 수 있습니다.
다만 Agent 자동화는 권한 관리가 중요합니다. 처음에는 조회 기능만 연결하고, 생성·수정·삭제 기능은 승인 흐름과 감사 로그를 설계한 뒤 신중하게 추가하는 것이 좋습니다.
The agent decides what to do.
The action group connects the tool.
Lambda performs the actual AWS API call.