JSON 이벤트로 Lambda 함수 실행

AWSBeginner
지금 연습하기

소개

결제 팀에는 주문 합계를 계산하는 함수가 필요합니다. 짧은 Python 핸들러를 배포하고 두 JSON 입력을 보낸 다음 취급 수수료를 추가하도록 계산을 수정합니다. 간단한 산술을 위해 정수 센트를 사용하고, 이후 자신의 함수와 로그를 제거합니다.

LabEx에서 AWS 시작, IAM 역할로 임시 자격 증명 사용, CloudWatch Logs에서 실패한 요청 찾기를 먼저 완료하세요. 이 새 환경에는 CLI, 작업 공간, 실행 역할이 제공됩니다.

인증 시험 관련 주제

이 실습은 다음 시험 주제에 대한 실습 경험을 제공합니다.

주문 계산 배포

이 단계에서는 미완성 핸들러를 교체하고 함수를 배포합니다. AWS Lambda는 함수를 호출할 때 코드를 실행합니다. 이벤트는 해당 호출에 제공되는 입력이며, 핸들러는 Lambda가 그 입력으로 호출하는 Python 함수입니다. 설정 app.handler는 app.py 안의 handler라는 함수를 뜻합니다.

준비된 작업 공간으로 이동해 기본 코드를 검사하세요. 현재는 빈 객체를 반환하므로 주문을 계산할 수 없습니다.

cd /home/labex/project
cat app.py

Python은 들여쓰기로 함수 안의 문장들을 묶습니다. event["quantity"]는 들어오는 JSON 객체에서 값을 읽습니다. *는 수량과 단가를 곱하고 return은 계산된 객체를 호출자에게 보냅니다. context는 호출 정보를 제공하지만 이 계산에서는 아직 필요하지 않습니다.

기본 코드를 이 완전한 핸들러로 교체하세요. cat > app.py는 <<'PY'와 닫는 PY 사이의 줄을 파일에 기록합니다. 닫는 줄은 단독으로 있어야 합니다.

cat > app.py <<'PY'
import json

def handler(event, context):
    order_id = event["order_id"]
    quantity = event["quantity"]
    unit_price = event["unit_price_cents"]
    total = quantity * unit_price
    print("EVENT " + json.dumps(event))
    return {"order_id": order_id, "total_cents": total}
PY

print 문은 입력을 실행 로그에 기록하며 응답을 반환하지는 않습니다. 고객의 비밀 정보를 로그에 넣지 마세요. 이 이벤트에는 가상 식별자와 숫자만 포함됩니다.

Lambda가 배포하는 압축 파일인 Zip 패키지를 생성하세요. 핸들러를 찾을 수 있도록 app.py를 최상위에 넣으세요. 실행 역할은 Lambda가 코드를 실행할 때 사용하는 신원입니다. 준비된 역할은 로깅을 지원합니다. 데이터 접근은 이후 실습에서 설정합니다. 역할 ARN을 셸 변수로 읽으세요. ARN은 특정 리소스를 식별하며 변수를 사용하면 직접 복사하지 않아도 됩니다.

zip -q function.zip app.py
ROLE_ARN=$(aws iam get-role --role-name labex-fn01-execution --query 'Role.Arn' --output text)

Python 3.12 런타임과 5초 시간 제한으로 배포하세요. fileb://는 압축 파일을 바이트로 읽습니다. 런타임은 언어 환경을 선택하고 시간 제한은 호출 하나의 실행 시간을 제한합니다.

aws lambda create-function --function-name labex-fn01-quote --runtime python3.12 --handler app.handler --role "$ROLE_ARN" --zip-file fileb://function.zip --timeout 5 --query '{Name:FunctionName,Runtime:Runtime,Handler:Handler,Timeout:Timeout,CodeSize:CodeSize}'

Name labex-fn01-quote, Runtime python3.12, Handler app.handler, Timeout 5, 양수인 CodeSize를 확인하세요. 함수 생성은 코드를 배포하며 핸들러를 호출하지는 않습니다.

AWS View는 함수, 핸들러, 코드 지문을 표시합니다. 호출 로그는 아직 비어 있습니다. 참조 로그 그룹은 관련 없는 플랫폼 데이터이므로 변경 없이 유지해야 합니다.

두 JSON 이벤트 호출

이 단계에서는 서로 다른 주문 두 개로 배포된 함수를 호출하고 응답을 해석합니다. JSON은 이름이 있는 필드로 객체를 표현합니다. 숫자에는 따옴표가 없고 문자열에는 따옴표가 있습니다. 각 호출은 자체 이벤트를 받습니다.

배포는 코드 패키지를 저장하고 호출은 이벤트를 제공해 핸들러를 실행합니다.

첫 이벤트를 작성하세요. 각 375센트인 상품 두 개입니다.

cat > small.json <<'JSON'
{"order_id":"fn01-small","quantity":2,"unit_price_cents":375}
JSON

함수를 호출하고 응답을 저장하세요. --cli-binary-format raw-in-base64-out은 CLI가 일반적인 JSON을 페이로드로 받을 수 있게 합니다. file://는 이벤트 텍스트를 읽고 마지막 파일 이름은 반환된 페이로드를 저장합니다.

aws lambda invoke --function-name labex-fn01-quote --cli-binary-format raw-in-base64-out --payload file://small.json small-response.json
cat small-response.json

명령은 StatusCode 200을 표시합니다. 응답 파일에는 {"order_id":"fn01-small","total_cents":750}이 있어야 합니다. 서비스 요청 상태와 핸들러가 반환한 데이터는 서로 다른 증거이므로 페이로드도 검사하세요.

코드를 다시 배포하지 않고 두 번째 주문을 보내세요. 각 120센트인 상품 다섯 개는 다른 합계를 만들어야 합니다.

cat > large.json <<'JSON'
{"order_id":"fn01-large","quantity":5,"unit_price_cents":120}
JSON
aws lambda invoke --function-name labex-fn01-quote --cli-binary-format raw-in-base64-out --payload file://large.json large-response.json
cat large-response.json

{"order_id":"fn01-large","total_cents":600}을 확인하세요. 입력 값이 같은 함수의 계산을 결정합니다.

AWS View에서 주문 ID, 수량, 가격, 합계를 비교하세요. 함수 설정은 같지만 호출 기록은 바뀝니다. 어느 주문에서든 Show logs를 열어 입력과 반환된 결과를 확인하세요.

코드 수정 및 결과 추적

이 단계에서는 100센트의 취급 수수료를 추가하고 새 호출이 수정된 계산을 실행하는지 확인합니다. 로컬 app.py 편집은 배포된 코드를 변경하지 않습니다. 패키지를 갱신하고 Lambda에 보내세요.

핸들러를 이 수정본으로 교체하세요. 계산만 바뀝니다. + 100은 곱셈 후 수수료를 더합니다.

cat > app.py <<'PY'
import json

def handler(event, context):
    order_id = event["order_id"]
    quantity = event["quantity"]
    unit_price = event["unit_price_cents"]
    total = quantity * unit_price + 100
    print("EVENT " + json.dumps(event))
    return {"order_id": order_id, "total_cents": total}
PY
zip -q function.zip app.py
aws lambda update-function-code --function-name labex-fn01-quote --zip-file fileb://function.zip --query '{Name:FunctionName,CodeSHA:CodeSha256}'

배포는 이름과 코드 SHA 지문을 반환합니다. AWS View에는 변경된 지문이 표시됩니다. 이전 호출 결과는 로그에 남습니다.

Console과 비교할 수 있도록 공식 예제는 Python 파일 옆의 Deploy와 Test 컨트롤을 보여 줍니다. lambda_function.py와 lambda_handler는 이 실습의 app.py와 handler에 해당합니다. 여기서는 Terminal 작업 흐름을 계속 사용하세요.

Python 파일과 배포 컨트롤을 보여 주는 공식 Lambda Console 예제.

출처: AWS Lambda 가이드.

첫 주문의 수량을 새 연관 ID와 함께 사용하세요.

cat > revised.json <<'JSON'
{"order_id":"fn01-revised","quantity":2,"unit_price_cents":375}
JSON
aws lambda invoke --function-name labex-fn01-quote --cli-binary-format raw-in-base64-out --payload file://revised.json revised-response.json
cat revised-response.json

{"order_id":"fn01-revised","total_cents":850}을 확인하세요. 상품 750센트에 수수료 100센트를 더한 값입니다. 첫 응답은 750으로 남습니다. 코드 수정은 이력을 다시 쓰지 않습니다.

실행 로그는 /aws/lambda/<function-name>에 저장됩니다. 이 주문 ID를 포함한 메시지를 조회해 이벤트와 계산된 응답을 연결하세요.

aws logs filter-log-events --log-group-name /aws/lambda/labex-fn01-quote --filter-pattern '"fn01-revised"' --query 'events[].message'

EVENT 입력과 합계 850인 반환 객체를 확인하세요. 전체 스트림에는 주문 응답과 별도로 호출 시작, 종료, 런타임 보고서도 포함됩니다.

AWS View로 돌아가세요. 실제 기록 세 개를 비교하고 fn01-revised의 Show logs를 열어 입력과 850센트 결과를 연결하세요. 참조는 변경되지 않습니다.

배포된 수정본은 850센트를 반환하며 이전 계산 합계와 참조 로그는 그대로 유지됩니다.

함수 제거 및 참조 로그 보존

이 단계에서는 함수와 그 실행 로그 그룹만 삭제한 다음 관련 없는 참조가 남아 있는지 확인합니다. 함수와 로그 그룹은 별도 리소스입니다. 함수만 삭제해도 저장된 로그는 제거되지 않습니다.

정확한 함수를 삭제한 다음 성공한 목록 조회 결과를 읽으세요.

aws lambda delete-function --function-name labex-fn01-quote
aws lambda list-functions --query 'Functions[].FunctionName'

빈 목록을 확인하세요. 인증 또는 연결 오류는 삭제를 입증하지 못합니다.

소유한 실행 로그를 제거하고 남은 그룹을 조회하세요.

aws logs delete-log-group --log-group-name /aws/lambda/labex-fn01-quote
aws logs describe-log-groups --query 'logGroups[].logGroupName'

/labex/labex-fn01-reference만 남아 있어야 합니다. 메시지를 읽어 정리가 관련 없는 데이터를 보존했음을 입증하세요.

aws logs get-log-events --log-group-name /labex/labex-fn01-reference --log-stream-name platform --query 'events[].message'

INFO platform reference keep unchanged를 확인하세요. AWS View에는 배포된 함수나 호출 로그가 없고 참조는 남아 있습니다. 준비된 역할과 신원은 환경의 준비 리소스입니다. 자격 증명 철회와 종료는 리소스 확인 후에 이루어집니다.

요약

Python 핸들러를 작성하고 Zip 패키지를 배포했으며 두 JSON 이벤트로 합계를 계산했습니다. 배포된 계산을 수정하고 새 결과를 실행 로그와 연결했으며, 참조 데이터를 보존하면서 함수와 그 로그 그룹만 삭제했습니다.