

# Lambda 함수 URL 호출
<a name="urls-invocation"></a>

함수 URL은 Lambda 함수를 위한 전용 HTTP(S) 엔드포인트입니다. Lambda 콘솔 또는 Lambda API를 통해 함수 URL을 생성하고 구성할 수 있습니다.

**작은 정보**  
Lambda는 HTTP 엔드포인트를 통해 함수를 간접적으로 호출하는 두 가지 방법, 즉 함수 URL과 Amazon API Gateway를 제공합니다. 사용 사례에 가장 적합한 방법을 잘 모르는 경우 [HTTP 요청을 사용하여 Lambda 함수를 간접 호출하는 메서드 선택](furls-http-invoke-decision.md) 섹션을 참조하세요.

함수 URL을 생성하면 Lambda가 자동으로 고유한 URL 엔드포인트를 생성합니다. 함수 URL을 생성하면 URL 엔드포인트가 변경되지 않습니다. 함수 URL 엔드포인트는 다음 형식을 취합니다.

```
https://<url-id>.lambda-url.<region>.on.aws
```

**참고**  
AWS 리전 아시아 태평양(하이데라바드)(`ap-south-2`), 아시아 태평양(멜버른)(`ap-southeast-4`), 아시아 태평양(말레이시아)(`ap-southeast-5`), 아시아 태평양(뉴질랜드)(`ap-southeast-6`), 아시아 태평양(태국)(`ap-southeast-7`), 아시아 태평양(타이페이)(`ap-east-2`),캐나다 서부(캘거리)(`ca-west-1`), 유럽(스페인)(`eu-south-2`)), 유럽(취리히)(`eu-central-2`), 이스라엘(텔아비브)(`il-central-1`) 및 중동(아랍에미리트)(`me-central-1`)에서는 함수 URL이 지원되지 않습니다.

함수 URL은 IPv4 및 IPv6을 지원하는 이중 스택을 지원합니다. 함수 URL을 구성한 후 웹 브라우저, curl, Postman 또는 모든 HTTP(S) 클라이언트를 통해 HTTP 엔드포인트에서 함수를 간접 호출할 수 있습니다. 함수 URL을 간접 호출하려면 `lambda:InvokeFunctionUrl` 및 `lambda:InvokeFunction` 권한이 있어야 합니다. 자세한 내용은 [액세스 관리](urls-auth.md) 섹션을 참조하세요.

**Topics**
+ [함수 URL 호출 기본 사항](#urls-invocation-basics)
+ [요청 및 응답 페이로드](#urls-payloads)

## 함수 URL 호출 기본 사항
<a name="urls-invocation-basics"></a>

함수 URL에서 `AWS_IAM` 인증 유형을 사용하는 경우 [AWS서명 버전 4(SigV4)](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)를 사용하여 각 HTTP 요청에 서명해야 합니다. [Postman](https://quickstarts.postman.com/guide/aws/index.html?index=..%2F..index#2)과 같은 도구는 SigV4를 사용하여 요청에 서명할 수 있는 방법을 기본으로 제공합니다.

도구를 사용하여 함수 URL에 대한 HTTP 요청에 서명하지 않으면 SigV4를 사용하여 각 요청에 수동으로 서명해야 합니다. 함수 URL이 요청을 수신하면 Lambda는 SigV4 서명도 계산합니다. 서명이 일치하는 경우 Lambda가 요청을 처리합니다. SigV4를 사용하여 요청에 수동으로 서명하는 방법에 대한 지침은 *Amazon Web Services 일반 참조 일반 참조 가이드*의 [서명 버전 4를 사용하여 AWS 요청에 서명](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)을 참조하세요.

함수 URL에서 `NONE` 인증 유형을 사용하는 경우 SigV4를 사용하여 요청에 서명할 필요가 없습니다. 웹 브라우저, curl, Postman 또는 HTTP 클라이언트를 사용하여 함수를 간접 호출할 수 있습니다.

함수에 대한 간단한 `GET` 요청을 테스트하려면 웹 브라우저를 사용합니다. 예를 들어 함수 URL이 `https://abcdefg.lambda-url.us-east-1.on.aws`이며 문자열 파라미터 `message`에서 사용되는 경우 요청 URL은 다음과 같을 수 있습니다.

```
https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld
```

`POST` 요청과 같은 다른 HTTP 요청을 테스트하려면 curl 등의 도구를 사용할 수 있습니다. 예를 들어 함수 URL에 대한 `POST` 요청에 일부 JSON 데이터를 포함하려면 다음 curl 명령을 사용할 수 있습니다.

```
curl -v 'https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld' \
-H 'content-type: application/json' \
-d '{ "example": "test" }'
```

## 요청 및 응답 페이로드
<a name="urls-payloads"></a>

클라이언트가 함수 URL을 호출하면 Lambda는 요청을 함수에 전달하기 전에 이벤트 객체에 매핑합니다. 그러면 함수의 응답이 HTTP 응답에 매핑되고, Lambda는 해당 HTTP 응답을 함수 URL을 통해 클라이언트로 다시 전송합니다.

요청 및 응답 이벤트 형식은 [Amazon API Gateway 페이로드 포맷 버전 2.0](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#http-api-develop-integrations-lambda.proxy-format)과 동일한 스키마를 따릅니다.

### 요청 페이로드 형식
<a name="urls-request-payload"></a>

요청 페이로드는 다음 구조를 취합니다.

```
{
  "version": "2.0",
  "routeKey": "$default",
  "rawPath": "/my/path",
  "rawQueryString": "parameter1=value1&parameter1=value2&parameter2=value",
  "cookies": [
    "cookie1",
    "cookie2"
  ],
  "headers": {
    "header1": "value1",
    "header2": "value1,value2"
  },
  "queryStringParameters": {
    "parameter1": "value1,value2",
    "parameter2": "value"
  },
  "requestContext": {
    "accountId": "123456789012",
    "apiId": "<urlid>",
    "authentication": null,
    "authorizer": {
        "iam": {
                "accessKey": "AKIA...",
                "accountId": "111122223333",
                "callerId": "AIDA...",
                "cognitoIdentity": null,
                "principalOrgId": null,
                "userArn": "arn:aws:iam::111122223333:user/example-user",
                "userId": "AIDA..."
        }
    },
    "domainName": "<url-id>.lambda-url.us-west-2.on.aws",
    "domainPrefix": "<url-id>",
    "http": {
      "method": "POST",
      "path": "/my/path",
      "protocol": "HTTP/1.1",
      "sourceIp": "123.123.123.123",
      "userAgent": "agent"
    },
    "requestId": "id",
    "routeKey": "$default",
    "stage": "$default",
    "time": "12/Mar/2020:19:03:58 +0000",
    "timeEpoch": 1583348638390
  },
  "body": "Hello from client!",
  "pathParameters": null,
  "isBase64Encoded": false,
  "stageVariables": null
}
```


| 파라미터 | 설명 | 예시 | 
| --- | --- | --- | 
|  `version`  |  이 이벤트에 대한 페이로드 포맷 버전입니다. Lambda 함수 URL은 현재 [페이로드 포맷 버전 2.0](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#http-api-develop-integrations-lambda.proxy-format)을 지원합니다.  |  `2.0`  | 
|  `routeKey`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 자리표시자를 의미하는 `$default`로 설정합니다.  |  `$default`  | 
|  `rawPath`  |  요청 경로입니다. 예를 들어, 요청 URL이 `https://{url-id}.lambda-url.{region}.on.aws/example/test/demo`인 경우 원시 경로 값은 `/example/test/demo`입니다.  |  `/example/test/demo`  | 
|  `rawQueryString`  |  요청의 쿼리 문자열 파라미터를 포함하는 원시 문자열입니다. 지원되는 문자에는 `a-z`, `A-Z`, `0-9`, `.`, `_`, `-`, `%`, `&`, `=` 및 `+`가 포함됩니다.  |  `"?parameter1=value1&parameter2=value2"`  | 
|  `cookies`  |  요청의 일부로 전송되는 모든 쿠키를 포함하는 배열입니다.  |  `["Cookie_1=Value_1", "Cookie_2=Value_2"]`  | 
|  `headers`  |  요청 헤더 목록으로, 키-값 페어로 표시됩니다.  |  `{"header1": "value1", "header2": "value2"}`  | 
|  `queryStringParameters`  |  요청의 쿼리 파라미터입니다. 예를 들어, 요청 URL이 `https://{url-id}.lambda-url.{region}.on.aws/example?name=Jane`인 경우 `queryStringParameters` 값은 키가 `name`이고 값이 `Jane`인 JSON 객체입니다.  |  `{"name": "Jane"}`  | 
|  `requestContext`  |  요청에 대한 추가 정보를 포함하는 객체입니다(예: `requestId`, 요청 시간, AWS Identity and Access Management(IAM)를 통해 승인된 호출자의 ID).  |   | 
|  `requestContext.accountId`  |  함수 소유자의 AWS 계정 ID입니다.  |  `"123456789012"`  | 
|  `requestContext.apiId`  |  함수 URL의 ID입니다.  |  `"33anwqw8fj"`  | 
|  `requestContext.authentication`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 `null`로 설정합니다.  |  `null`  | 
|  `requestContext.authorizer`  |  함수 URL에서 `AWS_IAM` 인증 유형을 사용하는 경우 호출자 자격 증명에 관한 정보를 포함하는 객체입니다. 그렇지 않으면 Lambda가 이 파라미터를 `null`로 설정합니다.  |   | 
|  `requestContext.authorizer.iam.accessKey`  |  호출자 자격 증명의 액세스 키입니다.  |  `"AKIAIOSFODNN7EXAMPLE"`  | 
|  `requestContext.authorizer.iam.accountId`  |  호출자 자격 증명의 AWS 계정 ID입니다.  |  `"111122223333"`  | 
|  `requestContext.authorizer.iam.callerId`  |  호출자의 ID(사용자 ID)입니다.  |  `"AIDACKCEVSQ6C2EXAMPLE"`  | 
|  `requestContext.authorizer.iam.cognitoIdentity`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 `null`로 설정하거나 JSON에서 제외합니다.  |  `null`  | 
|  `requestContext.authorizer.iam.principalOrgId`  |  호출자 자격 증명과 연결된 위탁자 조직 ID입니다.  |  `"AIDACKCEVSQORGEXAMPLE"`  | 
|  `requestContext.authorizer.iam.userArn`  |  호출자 자격 증명의 사용자 Amazon 리소스 이름(ARN)입니다.  |  `"arn:aws:iam::111122223333:user/example-user"`  | 
|  `requestContext.authorizer.iam.userId`  |  호출자 자격 증명의 사용자 ID입니다.  |  `"AIDACOSFODNN7EXAMPLE2"`  | 
|  `requestContext.domainName`  |  함수 URL의 도메인 이름입니다.  |  `"<url-id>.lambda-url.us-west-2.on.aws"`  | 
|  `requestContext.domainPrefix`  |  함수 URL의 도메인 접두사입니다.  |  `"<url-id>"`  | 
|  `requestContext.http`  |  HTTP 요청에 대한 세부 정보를 포함하는 객체입니다.  |   | 
|  `requestContext.http.method`  |  이 요청에 사용되는 HTTP 메서드입니다. 유효한 값에는 `GET`, `POST`, `PUT`, `HEAD`, `OPTIONS`, `PATCH` 및 `DELETE`가 있습니다.  |  `GET`  | 
|  `requestContext.http.path`  |  요청 경로입니다. 예를 들어, 요청 URL이 `https://{url-id}.lambda-url.{region}.on.aws/example/test/demo`인 경우 경로 값은 `/example/test/demo`입니다.  |  `/example/test/demo`  | 
|  `requestContext.http.protocol`  |  요청의 프로토콜입니다.  |  `HTTP/1.1`  | 
|  `requestContext.http.sourceIp`  |  요청하는 즉시 TCP 연결의 소스 IP 주소입니다.  |  `123.123.123.123`  | 
|  `requestContext.http.userAgent`  |  사용자 에이전트 요청 헤더 값입니다.  |  `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Gecko/20100101 Firefox/42.0`  | 
|  `requestContext.requestId`  |  호출 요청의 ID입니다. 이 ID를 사용하여 함수와 관련된 호출 로그를 추적할 수 있습니다.  |  `e1506fd5-9e7b-434f-bd42-4f8fa224b599`  | 
|  `requestContext.routeKey`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 자리표시자를 의미하는 `$default`로 설정합니다.  |  `$default`  | 
|  `requestContext.stage`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 자리표시자를 의미하는 `$default`로 설정합니다.  |  `$default`  | 
|  `requestContext.time`  |  요청의 타임스탬프입니다.  |  `"07/Sep/2021:22:50:22 +0000"`  | 
|  `requestContext.timeEpoch`  |  Unix Epoch 시간으로 표시된 요청의 타임스탬프입니다.  |  `"1631055022677"`  | 
|  `body`  |  요청의 본문입니다. 요청의 콘텐츠 유형이 바이너리인 경우 본문은 base64로 인코딩됩니다.  |  `{"key1": "value1", "key2": "value2"}`  | 
|  `pathParameters`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 `null`로 설정하거나 JSON에서 제외합니다.  |  `null`  | 
|  `isBase64Encoded`  |  본문이 이진 페이로드이고 base64로 인코딩되는 경우 `TRUE`입니다. 그렇지 않으면 `FALSE`입니다.  |  `FALSE`  | 
|  `stageVariables`  |  함수 URL은 이 파라미터를 사용하지 않습니다. Lambda는 이 파라미터를 `null`로 설정하거나 JSON에서 제외합니다.  |  `null`  | 

### 응답 페이로드 형식
<a name="urls-response-payload"></a>

함수가 응답을 반환하면 Lambda는 응답을 구문 분석하여 HTTP 응답으로 변환합니다. 함수 응답 페이로드는 다음 형식을 취합니다.

```
{
   "statusCode": 201,
    "headers": {
        "Content-Type": "application/json",
        "My-Custom-Header": "Custom Value"
    },
    "body": "{ \"message\": \"Hello, world!\" }",
    "cookies": [
        "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT",
        "Cookie_2=Value2; Max-Age=78000"
    ],
    "isBase64Encoded": false
}
```

Lambda는 응답 형식을 추론합니다. 함수가 유효한 JSON을 반환하고 `statusCode`을 반환하지 않는 경우 Lambda가 다음과 같은 가정을 합니다.
+ `statusCode`는 입니다.`200`
**참고**  
유효한 `statusCode`는 100\$1599 범위 내에 있습니다.
+ `content-type`은 입니다.`application/json`
+ `body`는 함수의 응답입니다.
+ `isBase64Encoded`is(`false` )

다음 예제에서는 Lambda 함수의 출력이 응답 페이로드에 매핑되는 방법과 응답 페이로드가 최종 HTTP 응답에 매핑되는 방법을 보여 줍니다. 클라이언트가 함수 URL을 간접 호출하면 HTTP 응답이 표시됩니다.

**문자열 응답에 대한 출력 예**


| Lambda 함수 출력 | 해석된 응답 출력 | HTTP 응답(클라이언트에게 표시되는 내용) | 
| --- | --- | --- | 
|  <pre>"Hello, world!"</pre>  |  <pre>{<br />  "statusCode": 200,<br />  "body": "Hello, world!",<br />  "headers": {<br />    "content-type": "application/json"<br />  },<br />  "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 200<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 15<br /><br />"Hello, world!"</pre>  | 

**JSON 응답에 대한 출력 예**


| Lambda 함수 출력 | 해석된 응답 출력 | HTTP 응답(클라이언트에게 표시되는 내용) | 
| --- | --- | --- | 
|  <pre>{<br />  "message": "Hello, world!"<br />}</pre>  |  <pre>{<br />  "statusCode": 200,<br />  "body": {<br />    "message": "Hello, world!"<br />  },<br />  "headers": {<br />    "content-type": "application/json"<br />  },<br />  "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 200<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 34<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

**사용자 지정 응답에 대한 출력 예**


| Lambda 함수 출력 | 해석된 응답 출력 | HTTP 응답(클라이언트에게 표시되는 내용) | 
| --- | --- | --- | 
|  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 201<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 27<br />my-custom-header: Custom Value<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

### Cookies
<a name="urls-cookies"></a>

함수에서 쿠키를 반환하려면 수동으로 `set-cookie` 헤더를 추가하지 않습니다. 대신 응답 페이로드 객체에 쿠키를 포함합니다. Lambda는 이를 자동으로 해석하고 다음 예제와 같이 HTTP 응답의 `set-cookie` 헤더로서 추가합니다.


| Lambda 함수 출력 | HTTP 응답(클라이언트에게 표시되는 내용) | 
| --- | --- | 
|  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "cookies": [<br />        "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT",<br />        "Cookie_2=Value2; Max-Age=78000"<br />    ],<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 201<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 27<br />my-custom-header: Custom Value<br />set-cookie: Cookie_1=Value2; Expires=21 Oct 2021 07:48 GMT<br />set-cookie: Cookie_2=Value2; Max-Age=78000<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 