

# 자습서: 함수 URL을 사용하여 응답 스트리밍 Lambda 함수 생성
<a name="response-streaming-tutorial"></a>

이 자습서에서는 응답 스트림을 반환하는 함수 URL 엔드포인트를 사용하여 .zip 파일 아카이브로 정의된 Lambda 함수를 생성합니다. 함수 구성에 대한 자세한 내용은 [함수 URL](urls-configuration.md) 섹션을 참조하세요.

## 사전 조건
<a name="response-streaming-prepare"></a>

이 자습서에서는 사용자가 기본 Lambda 작업과 Lambda 콘솔에 대해 어느 정도 알고 있다고 가정합니다. 그렇지 않은 경우 [콘솔로 Lambda 함수 생성](getting-started.md#getting-started-create-function)의 지침에 따라 첫 Lambda 함수를 생성합니다.

다음 단계를 완료하려면 [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)가 필요합니다. 명령과 예상 결과는 별도의 블록에 나열됩니다.

```
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`)은 운영 체제의 기본 제공 터미널에서 지원되지 않습니다. Ubuntu와 Bash의 Windows 통합 버전을 가져오려면 [Linux용 Windows Subsystem을 설치](https://docs.microsoft.com/en-us/windows/wsl/install-win10)합니다. 이 안내서의 예제 CLI 명령은 Linux 형식을 사용합니다. Windows CLI를 사용하는 경우 인라인 JSON 문서를 포함하는 명령의 형식을 다시 지정해야 합니다.

## 실행 역할 만들기
<a name="response-streaming-create-iam-role"></a>

Lambda 함수에 AWS 리소스에 액세스할 수 있는 권한을 제공하는 [실행 역할](lambda-intro-execution-role.md)을 만듭니다.

**실행 역할을 만들려면**

1. AWS Identity and Access Management(IAM) 콘솔의 [역할 페이지](https://console.aws.amazon.com/iam/home#/roles)를 엽니다.

1. **역할 생성(Create role)**을 선택합니다.

1. 다음 속성을 사용하여 역할을 만듭니다.
   + **신뢰할 수 있는 엔티티 유형** — **AWS서비스**
   + **사용 사례** — **Lambda**
   + **권한** – **AWSLambdaBasicExecutionRole**
   + **역할 이름** – **response-streaming-role**

**AWSLambdaBasicExecutionRole** 정책은 함수가 Amazon CloudWatch Logs에 로그를 쓰는 데 필요한 권한을 가집니다. 역할을 생성한 후 Amazon 리소스 이름(ARN)을 기록해 둡니다. 다음 단계에서 이 정보를 사용할 것입니다.

## 응답 스트리밍 함수 생성(AWS CLI)
<a name="response-streaming-tutorial-create-function-cli"></a>

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](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)로 업그레이드해야 할 수 있습니다.

## 함수 URL 엔드포인트 테스트
<a name="response-streaming-tutorial-test"></a>

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

```
curl --request GET "https://abcdefghijklm7nop7qrs740abcd.lambda-url.us-east-1.on.aws/" --user "AKIAIOSFODNN7EXAMPLE" --aws-sigv4 "aws:amz:us-east-1:lambda" --no-buffer
```

함수 URL은 `IAM_AUTH` 인증 유형을 사용합니다. 즉, [AWS 액세스 키와 비밀 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)를 모두 사용하여 요청에 서명해야 합니다. 이전 명령에서 `AKIAIOSFODNN7EXAMPLE`을 AWS 액세스 키 ID로 바꿉니다. 메시지가 나타나면 AWS 비밀 키를 입력합니다. AWS 비밀 키가 없으면 [임시 AWS 보안 인증을 대신 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)할 수 있습니다.

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

```
Streaming with Helper 
Hello 0 
Hello 1
Hello 2
```

## 리소스 정리
<a name="cleanup"></a>

이 자습서 용도로 생성한 리소스를 보관하고 싶지 않다면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.

**집행 역할 삭제**

1. IAM 콘솔에서 [역할 페이지](https://console.aws.amazon.com/iam/home#/roles)를 엽니다.

1. 생성한 실행 역할을 선택합니다.

1. **삭제**를 선택합니다.

1. 텍스트 입력 필드에 역할의 이름을 입력하고 **Delete**(삭제)를 선택합니다.

**Lambda 함수를 삭제하려면**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 생성한 함수를 선택합니다.

1. **작업**, **삭제**를 선택합니다.

1. 텍스트 입력 필드에 **confirm**를 입력하고 **Delete**(삭제)를 선택합니다.