튜토리얼: 함수 URL로 응답 스트리밍 Lambda 함수 만들기

튜토리얼: 함수 URL로 응답 스트리밍 Lambda 함수 만들기 (Creating a response streaming Lambda function with a function URL)

이 튜토리얼에서는 응답 스트림을 반환하는 함수 URL 엔드포인트가 있는 .zip 파일 아카이브로 정의된 Lambda 함수를 만들니다. 함수 URL 구성에 대한 자세한 내용은 함수 URL을 참조하세요.

출처: AWS Lambda 개발자 안내서

본문

사전 조건

이 튜토리얼은 기본 Lambda 작업과 Lambda 콘솔에 대한 지식이 있다고 가정합니다. 아직 하지 않았다면 콘솔로 Lambda 함수 만들기의 지침에 따라 첫 번째 Lambda 함수를 만드세요.

다음 단계를 완료하려면 AWS CLI 버전 2가 필요합니다. 명령과 예상 출력은 별도 블록으로 나열됩니다:

aws --version

다음과 같은 출력이 표시되어야 합니다:

aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2

긴 명령에는 이스케이프 문자(\)를 사용해 명령을 여러 줄로 나눕니다.

Linux와 macOS에서는 선호하는 셸과 패키지 관리자를 사용하세요.

참고

Windows에서는 운영 체제에 내장된 터미널에서 Lambda와 함께 흔히 사용하는 일부 Bash CLI 명령(예: zip)이 지원되지 않습니다. Windows 통합 버전의 Ubuntu와 Bash를 얻으려면 Windows Subsystem for Linux를 설치하세요. 이 안내서의 예제 CLI 명령은 Linux 형식을 사용합니다. 인라인 JSON 문서를 포함하는 명령은 Windows CLI를 사용하는 경우 다시 형식화해야 합니다.

실행 역할 만들기

Lambda 함수가 AWS 리소스에 액세스할 수 있는 권한을 부여하는 실행 역할을 만듭니다.

실행 역할을 만들려면:

  1. AWS Identity and Access Management(IAM) 콘솔의 Roles(역할) 페이지를 엽니다.
  2. Create role(역할 생성) 을 선택합니다.
  3. 다음 속성으로 역할을 만듭니다:
    • Trusted entity type(신뢰할 수 있는 엔터티 유형) – AWS service
    • Use case(사용 사례) – Lambda
    • Permissions(권한) – AWSLambdaBasicExecutionRole
    • Role name(역할 이름) – response-streaming-role

AWSLambdaBasicExecutionRole 정책에는 함수가 Amazon CloudWatch Logs에 로그를 쓰는 데 필요한 권한이 있습니다. 역할을 만든 후 그 Amazon 리소스 이름(ARN)을 적어두세요. 다음 단계에서 필요합니다.

응답 스트리밍 함수 만들기 (AWS CLI)

AWS Command Line Interface(AWS CLI)를 사용해 함수 URL 엔드포인트가 있는 응답 스트리밍 Lambda 함수를 만듭니다.

응답을 스트리밍할 수 있는 함수를 만들려면:

  1. 다음 코드 예제를 index.js라는 파일에 복사합니다. 이 함수는 1초 간격으로 세 개의 응답을 스트리밍합니다.
exports.handler = awslambda.streamifyResponse(
	async (event, responseStream, _context) => {
		// Metadata is a JSON serializable JS object. Its shape is not defined here.
		const metadata = {
			statusCode: 200,
			headers: {
				"Content-Type": "application/json",
				"CustomHeader": "outerspace"
			}
		};

		// Assign to the responseStream parameter to prevent accidental reuse of the non-wrapped stream.
		responseStream = awslambda.HttpResponseStream.from(responseStream, metadata);

		responseStream.write("Streaming with Helper \n");
		await new Promise(r => setTimeout(r, 1000));
		responseStream.write("Hello 0 \n");
		await new Promise(r => setTimeout(r, 1000));
		responseStream.write("Hello 1 \n");
		await new Promise(r => setTimeout(r, 1000));
		responseStream.write("Hello 2 \n");
		await new Promise(r => setTimeout(r, 1000));
		responseStream.end();
		await responseStream.finished();
	}
);
  1. 배포 패키지를 만듭니다.
zip function.zip index.js
  1. create-function 명령으로 Lambda 함수를 만듭니다. --role 값을 이전 단계의 역할 ARN으로 교체하세요. 이 명령은 함수 타임아웃을 10초로 설정해 함수가 세 개의 응답을 스트리밍할 수 있게 합니다.
aws lambda create-function \
  --function-name my-streaming-function \
  --runtime nodejs24.x \
  --zip-file fileb://function.zip \
  --handler index.handler \
  --timeout 10 \
  --role arn:aws:iam::123456789012:role/response-streaming-role

함수 URL을 만들려면:

  1. lambda:InvokeFunctionUrl 및 lambda:InvokeFunction 권한을 부여하는 리소스 기반 정책을 함수에 추가합니다. 각 문은 별도 명령으로 추가해야 합니다. --principal 값을 AWS 계정 ID로 교체하세요.
aws lambda add-permission \
  --function-name my-streaming-function \
  --action lambda:InvokeFunctionUrl \
  --statement-id UrlPolicyInvokeURL \
  --principal 123456789012 \
  --function-url-auth-type AWS_IAM
aws lambda add-permission \
    --function-name my-streaming-function \
    --action lambda:InvokeFunction \
    --statement-id UrlPolicyInvokeFunction \
    --principal 123456789012
  1. create-function-url-config 명령으로 함수의 URL 엔드포인트를 만듭니다.
aws lambda create-function-url-config \
  --function-name my-streaming-function \
  --auth-type AWS_IAM \
  --invoke-mode RESPONSE_STREAM

참고

--invoke-mode에 대한 오류가 발생하면 더 새로운 버전의 AWS CLI로 업그레이드해야 할 수 있습니다.

함수 URL 엔드포인트 테스트

함수를 호출해 통합을 테스트합니다. 브라우저에서 함수의 URL을 열거나 curl을 사용할 수 있습니다.

curl --request GET "https://abcdefghijklm7nop7qrs740abcd.lambda-url.us-east-1.on.aws/" --user "«redacted:AKIA…»" --aws-sigv4 "aws:amz:us-east-1:lambda" --no-buffer

함수 URL은 IAM_AUTH 인증 유형을 사용합니다. 즉 AWS 액세스 키와 시크릿 키로 요청에 서명해야 합니다. 이전 명령에서 «redacted:AKIA…»를 AWS 액세스 키 ID로 교체하세요. 메시지가 표시되면 AWS 시크릿 키를 입력합니다. AWS 시크릿 키가 없으면 임시 AWS 자격 증명을 대신 사용할 수 있습니다.

다음과 같은 응답이 표시되어야 합니다:

Streaming with Helper
Hello 0
Hello 1
Hello 2

리소스 정리

보관하려는 경우가 아니라면 이 튜토리얼에서 만든 리소스를 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.

실행 역할을 삭제하려면:

  1. IAM 콘솔의 Roles(역할) 페이지를 엽니다.
  2. 만든 실행 역할을 선택합니다.
  3. Delete(삭제) 를 선택합니다.
  4. 텍스트 입력 필드에 역할 이름을 입력하고 Delete 를 선택합니다.

Lambda 함수를 삭제하려면:

  1. Lambda 콘솔의 Functions(함수) 페이지를 엽니다.
  2. 만든 함수를 선택합니다.
  3. Actions(작업), Delete(삭제) 를 선택합니다.
  4. 텍스트 입력 필드에 confirm을 입력하고 Delete 를 선택합니다.

더 알아보기 (Learn more)

  • Lambda 함수 URL
  • Lambda 응답 스트리밍
  • Lambda 호출 모드