를 사용한 테스트 소개 sam local invoke - AWS Serverless Application Model

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

를 사용한 테스트 소개 sam local invoke

AWS Serverless Application Model 명령줄 인터페이스 (AWS SAMCLI) sam local invoke 하위 명령을 사용하여 로컬에서 함수의 일회성 호출을 시작할 수 있습니다. AWS Lambda

sam local invoke를 사용하려면 다음을 완료하여 AWS SAM CLI를 설치합니다.

sam local invoke를 사용하기 전에 다음 사항에 대한 기본적인 이해를 하는 것이 좋습니다.

Lambda 함수를 호출합니다.

sam local invoke를 실행하면 AWS SAMCLI는 현재 작업 디렉터리가 프로젝트의 루트 디렉터리라고 가정합니다. AWS SAMCLI는 먼저 .aws-sam 하위 폴더에서 template.[yaml|yml] 파일을 찾습니다. 찾을 수 없는 경우 AWS SAMCLI는 현재 작업 디렉터리 내에서 template.[yaml|yml] 파일을 찾습니다.

Lambda 함수를 로컬에서 호출하려면
  1. 프로젝트 디렉터리에서 다음 명령을 실행합니다.

    $ sam local invoke <options>
  2. 애플리케이션에 둘 이상의 함수가 포함된 경우 함수의 논리적 ID를 제공합니다. 다음은 그 예제입니다.

    $ sam local invoke HelloWorldFunction
  3. AWS SAMCLI는 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 SAMCLI가 참조할 템플릿을 지정하려면 --template 옵션을 사용합니다. AWS SAMCLI그러면 해당 AWS SAM 템플릿과 해당 템플릿이 가리키는 리소스만 로드됩니다.

중첩된 애플리케이션 또는 스택의 함수를 호출하려면 함수 논리적 ID와 함께 애플리케이션 또는 스택 논리 ID를 제공합니다. 다음은 그 예제입니다.

$ sam local invoke StackLogicalId/FunctionLogicalId

Terraform 프로젝트에서 Lambda 함수 테스트

--hook-name 옵션을 사용하여 Terraform 프로젝트에서 Lambda 함수를 로컬에서 테스트할 수 있습니다. 자세한 내용은 로컬 디버깅 및 테스트에 Terraform과 함께 AWS SAMCLI 사용하기 섹션을 참조하세요.

다음은 그 예제입니다.

$ 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 events/apigateway_event.json 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\"}"}%

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 getAllItemsFunction --env-vars locals.json 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":"{}"}

자세히 알아보기

sam local invoke 옵션 목록은 sam local invoke 섹션을 참조하세요.

sam local 사용 데모는 로컬 개발용AWS SAM 섹션을 참조하세요. SAM 시리즈를 사용한 서버리스 랜드 세션에서 로컬 개발 환경의 AWS 클라우드 리소스를 테스트합니다. YouTube