소개
상태 페이지에는 애플리케이션이 정상인지 알려 주는 HTTP 엔드포인트가 필요합니다. 제공된 Lambda 핸들러를 HTTP API에 연결하고 요청을 보내며 호출 권한을 진단한 뒤 자신의 리소스를 제거합니다.
역할 및 로그 선수 지식을 포함한 JSON 이벤트로 Lambda 함수 실행과 Lambda 함수 설정 및 진단을 완료하세요. 이 새 환경에는 핸들러와 실행 역할이 제공됩니다.
인증 시험 관련 주제
이 실습은 다음 시험 주제에 대한 실습 경험을 제공합니다.
- Solutions Architect – Associate (SAA-C03) · 태스크 2.1: HTTP API 라우트, Lambda 통합과 호출 권한.
- Developer – Associate (DVA-C02) · 태스크 1.1, 태스크 1.2: HTTP API 라우트, Lambda 통합과 호출 권한.
- DevOps Engineer – Professional (DOP-C02) · 태스크 3.2: 기초 실습: HTTP API 라우트, Lambda 통합과 호출 권한.
상태 확인 함수 배포
이 단계에서는 제공된 상태 확인 핸들러를 패키징하고 HTTP 이벤트에 응답할 수 있는 함수를 배포합니다.
준비된 작업 공간으로 이동하세요.
cd /home/labex/project
Terminal 옆의 AWS View를 열어 명령과 같은 함수, API, 로그 상태를 확인하세요. 처음에는 관련 없는 참조 로그만 존재합니다. 이를 보존하세요.
패키징 전에 제공된 애플리케이션을 읽으세요.
cat app.py
핸들러는 이벤트를 받아 입력을 기록하고 statusCode, headers, body의 JSON 문자열을 포함한 프록시 응답을 반환합니다. HTTP 페이로드 형식 2.0은 URL 쿼리 파라미터를 queryStringParameters에 넣습니다. 선택적 name 파라미터는 인사말을 변경합니다. RELEASE_LABEL은 함께 반환되는 환경 설정입니다.
zip으로 app.py를 배포 압축 파일의 최상위에 넣으세요.
zip health.zip app.py
준비된 역할 ARN을 셸 변수로 읽으세요. --query는 응답 필드 하나를 선택하고 --output text는 다음 명령에서 사용할 수 있게 합니다.
ROLE_ARN=$(aws iam get-role --role-name labex-a01-execution --query 'Role.Arn' --output text)
Python 3.12와 준비된 실행 역할로 app.handler를 배포하세요. fileb://는 Zip 바이트를 업로드합니다. JSON Variables 맵은 Lambda 설정 실습과 같은 형식입니다. 문자열 값은 첫 릴리스를 표시합니다.
aws lambda create-function \
--function-name labex-a01-health \
--runtime python3.12 \
--role "$ROLE_ARN" \
--handler app.handler \
--timeout 5 \
--environment '{"Variables":{"RELEASE_LABEL":"initial"}}' \
--zip-file fileb://health.zip \
--query '{Name:FunctionName,Handler:Handler,Runtime:Runtime}'
응답은 labex-a01-health, app.handler, python3.12를 나타내야 합니다. AWS View를 열어 Function 카드를 검사하세요. 함수 배포만으로는 아직 HTTP 경로가 제공되지 않습니다. HTTP APIs 카드는 비어 있습니다.
HTTP 경로 연결 및 요청 전송
이 단계에서는 HTTP 요청을 배포된 함수에 연결합니다. Amazon API Gateway는 HTTP 진입점을 제공합니다. 경로는 GET /health처럼 메서드와 경로에 따라 백엔드 통합을 선택합니다.
HTTP API를 생성하고 생성된 ID를 셸 변수에 저장하세요. 명령 치환 $(...)는 선택한 API ID를 표시하는 대신 저장합니다.
API_ID=$(aws apigatewayv2 create-api --name labex-a01 --protocol-type HTTP --query ApiId --output text)
리소스 목록을 위해 ID를 기록하세요. 리디렉션 >는 값을 파일에 씁니다.
printf '%s\n' "$API_ID" > api-id.txt
스테이지는 API의 배포 진입점입니다. $default 스테이지에는 스테이지 이름 URL 구간이 없습니다. --auto-deploy는 변경을 자동으로 적용합니다. 작은따옴표는 달러 기호를 그대로 유지합니다.
aws apigatewayv2 create-stage --api-id "$API_ID" --stage-name '$default' --auto-deploy --query '{Stage:StageName,AutoDeploy:AutoDeploy}'
배포된 함수 ARN을 읽은 다음 AWS_PROXY 통합을 생성하세요. Lambda 통합은 아래의 클라이언트 경로가 GET을 사용하더라도 백엔드 호출에 POST를 사용합니다. 페이로드 형식 2.0은 제공된 핸들러와 일치합니다.
FUNCTION_ARN=$(aws lambda get-function-configuration --function-name labex-a01-health --query FunctionArn --output text)
INTEGRATION_ID=$(aws apigatewayv2 create-integration --api-id "$API_ID" --integration-type AWS_PROXY --integration-method POST --integration-uri "$FUNCTION_ARN" --payload-format-version 2.0 --query IntegrationId --output text)
경로 키는 클라이언트 HTTP 메서드와 경로를 결합합니다. 대상은 방금 생성한 통합을 가리킵니다.
aws apigatewayv2 create-route \
--api-id "$API_ID" \
--route-key 'GET /health' \
--target "integrations/$INTEGRATION_ID" \
--authorization-type NONE \
--query '{Route:RouteKey,Authorization:AuthorizationType}'
이 공개 상태 확인 경로는 NONE을 사용합니다. 애플리케이션 로그인은 나중에 소개합니다. 실행 역할은 함수 코드가 무엇을 할 수 있는지 제어하고 함수의 리소스 정책은 누가 호출할 수 있는지 제어합니다. API Gateway에는 여전히 정확한 호출 권한이 필요합니다.
선택된 계정 ID를 읽고 이 API의 기본 스테이지 GET /health 경로를 위한 소스 ARN을 구성하세요. 이스케이프된 달러 기호는 치환되는 문자열 안에서 $default를 그대로 유지합니다.
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
SOURCE_ARN="arn:aws:execute-api:us-east-1:$ACCOUNT_ID:$API_ID/\$default/GET/health"
이 API 경로에만 함수 호출 권한을 부여하세요.
aws lambda add-permission \
--function-name labex-a01-health \
--statement-id ApiHealth \
--action lambda:InvokeFunction \
--principal apigateway.amazonaws.com \
--source-account "$ACCOUNT_ID" \
--source-arn "$SOURCE_ARN" \
--query Statement \
--output text
이 작업 공간의 HTTP 요청에는 생성된 API ID와 함께 준비된 API 주소를 사용하세요. 이는 작업 공간의 API 진입점이며 AWS 공개 호스트 이름은 아닙니다.
API_URL="http://127.0.0.1:8081/api/$API_ID"
공식 Console은 같은 API ID, $default 스테이지, Auto deploy 설정을 보여 줍니다. Invoke URL은 AWS 엔드포인트입니다. 이 실습에서는 위의 작업 공간 API_URL을 계속 사용하세요.

출처: AWS API Gateway.
curl -i는 HTTP 헤더와 응답 본문을 모두 보여 줍니다. URL 쿼리 파라미터는 실제 Lambda 이벤트의 일부가 됩니다.
curl -i "$API_URL/health?name=Maya"
HTTP 200과 다음 JSON 본문을 확인하세요.
{"healthy": true, "message": "Hello, Maya", "release": "initial"}
AWS View로 돌아가세요. HTTP APIs 카드에는 GET /health, NONE, $default · AutoDeploy true가 표시되어야 합니다. CloudWatch Logs 카드에는 실제 경로, 상태, 응답이 표시되어야 합니다. Show logs를 클릭하고 name: Maya가 있는 queryStringParameters를 찾으세요. 이 수동 관찰은 HTTP 요청과 배포된 함수의 입력을 연결합니다. 검증은 원격 설정과 실제 실행을 확인합니다.

이 예시는 설정된 경로와 성공한 Maya / initial 응답을 보여 줍니다. 생성된 API ID와 코드 지문은 달라집니다.

호출 권한 진단 및 새 릴리스 게시
이 단계에서는 끊어진 호출 경계를 관찰하고 정확한 권한을 복원한 뒤 변경된 함수 설정을 테스트합니다.
ID로 정책 문을 제거하세요. API, 통합, 실행 역할은 그대로 남습니다.
aws lambda remove-permission --function-name labex-a01-health --statement-id ApiHealth
권한이 없는 동안 다른 요청을 보내세요.
curl -i "$API_URL/health?name=Noah"
Invocation permission denied와 함께 HTTP 502를 확인하세요. API 배포와 경로 설정 자체는 Lambda 호출 권한을 부여하지 않습니다. AWS View에는 기존 성공한 호출이 남습니다. 이 거부된 요청은 핸들러를 실행하지 않았습니다. 요청 전후의 로그를 수동으로 비교하세요. 자동 검사는 최종 복원된 정책에서 과거의 거부를 추론하지 않습니다.
같은 계정 및 경로로 제한된 권한을 복원하세요.
aws lambda add-permission \
--function-name labex-a01-health \
--statement-id ApiHealth \
--action lambda:InvokeFunction \
--principal apigateway.amazonaws.com \
--source-account "$ACCOUNT_ID" \
--source-arn "$SOURCE_ARN" \
--query Statement \
--output text
준비된 릴리스를 표시하도록 함수 환경을 변경하세요. 핸들러는 실행할 때 이 설정을 읽습니다.
aws lambda update-function-configuration --function-name labex-a01-health --environment '{"Variables":{"RELEASE_LABEL":"ready"}}' --query 'Environment.Variables'
경로는 여전히 같은 함수를 가리킵니다. 다른 쿼리 값으로 요청을 보내세요.
curl -i "$API_URL/health?name=Noah"
HTTP 200과 새 쿼리 및 환경에서 계산된 응답을 확인하세요.
{"healthy": true, "message": "Hello, Noah", "release": "ready"}
AWS View에서 최신 응답을 검사하고 로그를 펼치세요. 입력은 Noah, 본문은 ready인지 확인하세요. 이전 Maya 응답도 계속 사용할 수 있어야 합니다. 서로 다른 결과는 통합이 고정된 상태 메시지 하나를 반환하는 것이 아니라 배포된 함수를 실행함을 보여 줍니다.
자신의 API 및 함수 삭제
이 단계에서는 생성한 리소스를 제거하고 관련 없는 참조 로그가 남아 있음을 입증합니다.
리소스 목록은 api-id.txt의 API ID, labex-a01-health, /aws/lambda/labex-a01-health로 구성됩니다. API는 경로, 통합, 기본 스테이지를 소유합니다. 더 이상 요청을 받지 않도록 API부터 삭제하세요.
aws apigatewayv2 delete-api --api-id "$API_ID"
함수와 그 소유 호출 정책을 제거하세요.
aws lambda delete-function --function-name labex-a01-health
Lambda 로그 그룹에는 자체 수명 주기가 있습니다. 이 함수의 그룹만 삭제하세요.
aws logs delete-log-group --log-group-name /aws/lambda/labex-a01-health
기본 서비스 목록을 성공적으로 읽으세요. 요청 오류는 삭제를 입증하지 않습니다.
aws apigatewayv2 get-apis --query 'Items[].Name'
aws lambda list-functions --query 'Functions[].FunctionName'
두 목록은 모두 비어 있어야 합니다. 남은 로그 그룹을 읽으세요.
aws logs describe-log-groups --query 'logGroups[].logGroupName'
/labex/labex-a01-reference만 남아 있어야 합니다. 이 그룹과 준비된 실행 역할을 보존하세요. AWS View에서 API, Function, 호출 카드가 비어 있고 Reference logs에는 여전히 INFO platform reference keep unchanged가 표시되는지 확인하세요.
요약
Python 상태 확인 핸들러를 배포하고 페이로드 2.0 통합으로 HTTP API 경로를 연결했으며 기본 스테이지를 활성화했습니다. API의 Lambda 호출 권한 범위를 제한하고 권한 제거를 진단했으며 실제 쿼리 값과 함수 설정에 따른 서로 다른 응답을 관찰했습니다. 마지막으로 관련 없는 리소스를 보존하면서 자신의 API, 함수, 로그 그룹을 제거했습니다.



