기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
sam local invoke를 사용한 테스트 소개
AWS Serverless Application Model 명령줄 인터페이스(AWS SAM CLI) sam local invoke
하위 명령을 사용하여 로컬에서 AWS Lambda 함수의 일회성 호출을 시작합니다.
-
AWS SAM CLI에 대한 소개는 AWS SAMCLI란 무엇인가요? 섹션을 참조하세요.
-
sam local invoke
명령 옵션 목록은 sam local invoke 섹션을 참조하세요. -
일반적인 개발 워크플로 중
sam local invoke
를 사용하는 예는 7단계: (선택 사항) 로컬에서 애플리케이션 테스트 섹션을 참조하세요.
sam local invoke
를 사용하려면 다음을 완료하여 AWS SAM CLI를 설치합니다.
sam local invoke
를 사용하기 전에 다음 사항에 대한 기본적인 이해를 하는 것이 좋습니다.
Lambda 함수를 호출합니다.
sam local invoke
를 실행하면 AWS SAM CLI는 현재 작업 디렉터리가 프로젝트의 루트 디렉터리라고 가정합니다. AWS SAM CLI는 먼저 .aws-sam
하위 폴더에서 template.[yaml|yml]
파일을 찾습니다. 찾을 수 없는 경우 AWS SAM CLI는 현재 작업 디렉터리 내에서 template.[yaml|yml]
파일을 찾습니다.
Lambda 함수를 로컬에서 호출하려면
-
프로젝트 디렉터리에서 다음 명령을 실행합니다.
$
sam local invoke
<options>
-
애플리케이션에 둘 이상의 함수가 포함된 경우 함수의 논리적 ID를 제공합니다. 다음은 그 예제입니다.
$
sam local invoke
HelloWorldFunction
-
AWS SAM CLI는 Docker를 사용하여 로컬 컨테이너에 함수를 빌드합니다. 그런 다음 함수를 호출하고 함수의 응답을 출력합니다.
다음은 그 예제입니다.
$
sam local invoke
Invoking app.lambda_handler (python3.9) Local image is out of date and will be updated to the latest runtime. To skip this, pass in the parameter --skip-pull-image Building image.................................................................................................................... Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64. Mounting /Users/.../sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df Version: $LATEST END RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df REPORT RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df Init Duration: 1.09 ms Duration: 608.42 ms Billed Duration: 609 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode": 200, "body": "{\"message\": \"hello world\"}"}%
로그 관리
sam local invoke
를 사용하면 Lambda 함수 런타임 출력(예: 로그)이 stderr
로 출력되고, Lambda 함수 결과는 stdout
로 출력됩니다.
다음은 기본 Lambda 함수 출력의 예제입니다.
def handler(event, context): print("some log") # this goes to stderr return "hello world" # this goes to stdout
이러한 표준 출력을 저장할 수 있습니다. 다음은 그 예제입니다.
$
sam local invoke 1> stdout.log
...$
cat stdout.log
"hello world"$
sam local invoke 2> stderr.log
...$
cat stderr.log
Invoking app.lambda_handler (python3.9) Local image is up-to-date Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64. Mounting /Users/.../sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46 Version: $LATEST some log END RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46 REPORT RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46 Init Duration: 0.91 ms Duration: 589.19 ms Billed Duration: 590 ms Memory Size: 128 MB Max Memory Used: 128 MB
이러한 표준 출력을 사용하여 로컬 개발 프로세스를 더욱 자동화할 수 있습니다.
옵션
사용자 지정 이벤트를 전달하여 Lambda 함수 호출
Lambda 함수에 이벤트를 전달하려면 --event
옵션을 사용합니다. 다음은 그 예제입니다.
$
sam local invoke --event
events/s3.json S3JsonLoggerFunction
sam local generate-event
하위 명령으로 이벤트를 생성할 수 있습니다. 자세한 내용은 를 사용한 테스트 소개 sam local generate-event 섹션을 참조하세요.
Lambda 함수를 호출할 때 환경 변수 전달
Lambda 함수가 환경 변수를 사용하는 경우 --env-vars
옵션을 사용하여 로컬 테스트 중에 환경 변수를 전달할 수 있습니다. 이는 클라우드에 이미 배포된 애플리케이션의 서비스를 사용하여 Lambda 함수를 로컬에서 테스트할 수 있는 좋은 방법입니다. 다음은 그 예제입니다.
$
sam local invoke --env-vars
locals.json
템플릿 또는 함수 지정
AWS SAM CLI가 참조할 템플릿을 지정하려면 --template
옵션을 사용합니다. AWS SAM CLI가 해당 AWS SAM 템플릿과 해당 템플릿이 가리키는 리소스만 로드합니다.
중첩된 애플리케이션 또는 스택의 함수를 호출하려면 함수 논리적 ID와 함께 애플리케이션 또는 스택 논리 ID를 제공합니다. 다음은 그 예제입니다.
$
sam local invoke
StackLogicalId/FunctionLogicalId
Terraform 프로젝트에서 Lambda 함수 테스트
--hook-name
옵션을 사용하여 Terraform 프로젝트에서 Lambda 함수를 로컬에서 테스트할 수 있습니다. 자세한 내용은 사용 AWS SAM CLI with Terraform 로컬 디버깅 및 테스트용을 참조하십시오.
다음은 그 예제입니다.
$
sam local invoke --hook-name terraform --beta-features
모범 사례
애플리케이션에 실행 중인 sam build
의 .aws-sam
디렉터리가 있는 경우 함수 코드를 업데이트할 때마다 sam build
를 실행해야 합니다. 그런 다음 sam local invoke
를 실행하여 업데이트된 함수 코드를 로컬에서 테스트합니다.
로컬 테스트는 클라우드에 배포하기 전에 빠르게 개발하고 테스트할 수 있는 훌륭한 솔루션입니다. 하지만 로컬 테스트는 클라우드의 리소스 간 권한 등 모든 것을 검증하지는 않습니다. 가능한 한 클라우드에서 애플리케이션을 테스트하세요. 클라우드 테스트 워크플로의 속도를 높이려면 sam sync를 사용하는 것이 좋습니다.
예시
Amazon API Gateway 샘플 이벤트를 생성하고 이를 사용하여 Lambda 함수를 로컬에서 호출합니다.
먼저 API Gateway HTTP API 이벤트 페이로드를 생성하여 events
폴더에 저장합니다.
$
sam local generate-event
apigateway http-api-proxy > events/apigateway_event.json
다음으로 이벤트에서 파라미터 값을 반환하도록 Lambda 함수를 수정합니다.
def lambda_handler(event, context): print("HelloWorldFunction invoked") return { "statusCode": 200, "body": json.dumps({ "message": event['queryStringParameters']['parameter2'], }), }
다음으로 Lambda 함수를 로컬에서 호출하고 사용자 지정 이벤트를 제공합니다.
$
sam local invoke --event
Invoking app.lambda_handler (python3.9) Local image is up-to-date Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64. Mounting /Users/...sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Version: $LATEST some log END RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 REPORT RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Init Duration: 1.63 ms Duration: 564.07 ms Billed Duration: 565 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode": 200, "body": "{\"message\": \"value\"}"}%events/apigateway_event.json
Lambda 함수를 로컬에서 호출할 때 환경 변수 전달
이 애플리케이션에는 Amazon DynamoDB 테이블 이름에 환경 변수를 사용하는 Lambda 함수가 있습니다. 다음은 AWS SAM 템플릿에 정의된 함수의 예입니다.
AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 ... Resources: getAllItemsFunction: Type: AWS::Serverless::Function Properties: Handler: src/get-all-items.getAllItemsHandler Description: get all items Policies: - DynamoDBReadPolicy: TableName: !Ref SampleTable Environment: Variables: SAMPLE_TABLE: !Ref SampleTable ...
Lambda 함수를 클라우드의 DynamoDB 테이블과 상호 작용하도록 하면서 로컬에서 테스트하려고 합니다. 이를 위해 환경 변수 파일을 만들고 프로젝트의 루트 디렉터리에 locals.json
로 저장합니다. 여기 SAMPLE_TABLE
에 제공된 값은 클라우드의 DynamoDB 테이블을 참조합니다.
{ "getAllItemsFunction": { "SAMPLE_TABLE": "dev-demo-SampleTable-1U991234LD5UM98" } }
다음으로 sam local invoke
를 실행하고, --env-vars
옵션과 함께 환경 변수로 전달합니다.
$
sam local invoke
Mounting /Users/...sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Version: $LATEST some log END RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 REPORT RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Init Duration: 1.63 ms Duration: 564.07 ms Billed Duration: 565 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode":200,"body":"{}"}getAllItemsFunction
--env-varslocals.json
자세히 알아보기
sam local invoke
옵션 목록은 sam local invoke 섹션을 참조하세요.
sam local
사용 데모는 로컬 개발용 AWS SAM 섹션을 참조하세요. YouTube의 SAM 시리즈를 사용한 서버리스 랜드 세션의 로컬 개발 환경의 AWS 클라우드 리소스를 테스트합니다