Lambda 함수 URL 호출
Lambda 함수 URL 호출
함수 URL(Function URL)은 Lambda 함수를 위한 전용 HTTP(S) 엔드포인트예요. Lambda 콘솔이나 Lambda API를 통해 함수 URL을 만들고 구성할 수 있죠.
팁
Lambda는 HTTP 엔드포인트로 함수를 호출하는 두 가지 방법을 제공해요: 함수 URL과 Amazon API Gateway. 어떤 방법이 여러분의 사용 사례에 가장 좋은지 잘 모르겠다면 HTTP 요청으로 Lambda 함수를 호출할 방법 선택을 참고하세요.
함수 URL을 만들면 Lambda가 고유한 URL 엔드포인트를 자동으로 생성해요. 함수 URL을 만든 후에는 URL 엔드포인트가 절대 바뀌지 않아요. 함수 URL 엔드포인트 형식은 다음과 같아요:
https://<url-id>.lambda-url.<region>.on.aws
참고
함수 URL은 모든 AWS 리전에서 지원되지는 않아요. 가용성을 확인하려면 AWS Regional Services에서 Feature Name = Function URLs로 필터링하세요.
함수 URL은 IPv4와 IPv6를 지원하는 듀얼 스택(dual stack)이에요. 함수 URL을 구성한 뒤에는 웹 브라우저, curl, Postman, 또는 어떤 HTTP 클라이언트로든 함수의 HTTP(S) 엔드포인트를 통해 함수를 호출할 수 있어요. 함수 URL을 호출하려면 lambda:InvokeFunctionUrl과 lambda:InvokeFunction 권한이 필요해요. 자세한 내용은 접근 제어를 참고하세요.
본문
Topics(주제)
함수 URL 호출 기본
함수 URL이 AWS_IAM 인증 유형을 사용한다면 AWS Signature Version 4(SigV4)로 각 HTTP 요청에 서명해야 해요. Postman 같은 도구는 SigV4로 요청에 서명하는 내장 기능을 제공하죠.
함수 URL에 대한 HTTP 요청 서명 도구를 사용하지 않는다면 각 요청을 SigV4로 수동 서명해야 해요. 함수 URL이 요청을 받으면 Lambda도 SigV4 서명을 계산해요. Lambda는 서명이 일치할 때만 요청을 처리하죠. SigV4로 요청을 수동 서명하는 방법은 Amazon Web Services General Reference Guide의 Signature Version 4로 AWS 요청 서명을 참고하세요.
함수 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 같은 도구를 사용할 수 있어요. 예를 들어 POST 요청에 JSON 데이터를 포함하고 싶다면 다음 curl 명령을 쓸 수 있어요:
curl -v 'https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld' \
-H 'content-type: application/json' \
-d '{ "example": "test" }'
요청 및 응답 페이로드
클라이언트가 함수 URL을 호출하면 Lambda는 함수에 전달하기 전에 요청을 이벤트 객체로 매핑해요. 그러면 함수의 응답은 Lambda가 함수 URL을 통해 클라이언트에게 다시 보내는 HTTP 응답으로 매핑되죠.
요청과 응답 이벤트 형식은 Amazon API Gateway 페이로드 형식 버전 2.0과 동일한 스키마를 따릅니다.
요청 페이로드 형식
요청 페이로드는 다음 구조를 가져요:
{
"version": "2.0",
"routeKey": "$default",
"rawPath": "/my/path",
"rawQueryString": "parameter1=value1¶meter1=value2¶meter2=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을 지원해요. | 2.0 |
routeKey |
함수 URL은 이 매개변수를 사용하지 않아요. Lambda는 이를 자리 표시자로서 $default로 설정해요. |
$default |
rawPath |
요청 경로예요. 예를 들어 요청 URL이 https://{url-id}.lambda-url.{region}.on.aws/example/test/demo라면 raw path 값은 /example/test/demo이에요. |
/example/test/demo |
rawQueryString |
요청의 쿼리 문자열 매개변수를 담은 원시 문자열이에요. 지원되는 문자에는 a-z, A-Z, 0-9, ., _, -, %, &, =, +가 있어요. |
"?parameter1=value1¶meter2=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)로 인증된 경우 호출자 신원 같은 요청에 대한 추가 정보를 담은 객체예요. |
|
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 |
호출자 신원의 접근 키예요. | "«redacted:AKIA…»" |
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 |
호출자 신원과 연결된 principal org ID예요. | "AIDACKCEVSQORGEXAMPLE" |
requestContext.authorizer.iam.userArn |
호출자 신원의 사용자 Amazon Resource Name(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라면 path 값은 /example/test/demo이에요. |
/example/test/demo |
requestContext.http.protocol |
요청의 프로토콜이에요. | HTTP/1.1 |
requestContext.http.sourceIp |
요청을 하는 즉시 TCP 연결의 소스 IP 주소예요. | 123.123.123.123 |
requestContext.http.userAgent |
User-Agent 요청 헤더 값이에요. | 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 |
요청의 본문이에요. 요청의 콘텐츠 유형이 이진(binary)이면 본문은 base64로 인코딩돼요. | {"key1": "value1", "key2": "value2"} |
pathParameters |
함수 URL은 이 매개변수를 사용하지 않아요. Lambda는 이를 null로 설정하거나 JSON에서 제외해요. |
null |
isBase64Encoded |
본문이 이진 페이로드이고 base64로 인코딩되었으면 TRUE, 그렇지 않으면 FALSE예요. |
FALSE |
stageVariables |
함수 URL은 이 매개변수를 사용하지 않아요. Lambda는 이를 null로 설정하거나 JSON에서 제외해요. |
null |
응답 페이로드 형식
함수가 응답을 반환하면 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에서 599 사이의 범위예요.content-type은application/json이다.body는 함수 응답이다.isBase64Encoded는false이다.
다음 예제는 Lambda 함수 출력이 응답 페이로드로 매핑되는 방식과 응답 페이로드가 최종 HTTP 응답으로 매핑되는 방식을 보여줘요. 클라이언트가 함수 URL을 호출하면 HTTP 응답을 보게 됩니다.
문자열 응답 출력 예제
| Lambda 함수 출력 | 해석된 응답 출력 | HTTP 응답(클라이언트가 보는 것) |
|---|---|---|
"Hello, world!" |
{ "statusCode": 200, "body": "Hello, world!", "headers": { "content-type": "application/json" }, "isBase64Encoded": false } |
HTTP/2 200, date: Wed, 08 Sep 2021 18:02:24 GMT, content-type: application/json, content-length: 15, "Hello, world!" |
JSON 응답 출력 예제
| Lambda 함수 출력 | 해석된 응답 출력 | HTTP 응답(클라이언트가 보는 것) |
|---|---|---|
{ "message": "Hello, world!" } |
{ "statusCode": 200, "body": { "message": "Hello, world!" }, "headers": { "content-type": "application/json" }, "isBase64Encoded": false } |
HTTP/2 200, date: Wed, 08 Sep 2021 18:02:24 GMT, content-type: application/json, content-length: 34, { "message": "Hello, world!" } |
커스텀 응답 출력 예제
| Lambda 함수 출력 | 해석된 응답 출력 | HTTP 응답(클라이언트가 보는 것) |
|---|---|---|
{ "statusCode": 201, "headers": { "Content-Type": "application/json", "My-Custom-Header": "Custom Value" }, "body": JSON.stringify({ "message": "Hello, world!" }), "isBase64Encoded": false } |
{ "statusCode": 201, "headers": { "Content-Type": "application/json", "My-Custom-Header": "Custom Value" }, "body": JSON.stringify({ "message": "Hello, world!" }), "isBase64Encoded": false } |
HTTP/2 201, date: Wed, 08 Sep 2021 18:02:24 GMT, content-type: application/json, content-length: 27, my-custom-header: Custom Value, { "message": "Hello, world!" } |
쿠키
함수에서 쿠키를 반환하려면 set-cookie 헤더를 수동으로 추가하지 마세요. 대신 쿠키를 응답 페이로드 객체에 포함하세요. Lambda가 이를 자동으로 해석해 다음 예제처럼 HTTP 응답의 set-cookie 헤더로 추가해요.
| Lambda 함수 출력 | HTTP 응답(클라이언트가 보는 것) |
|---|---|
{ "statusCode": 201, "headers": { "Content-Type": "application/json", "My-Custom-Header": "Custom Value" }, "body": JSON.stringify({ "message": "Hello, world!" }), "cookies": [ "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT", "Cookie_2=Value2; Max-Age=78000" ], "isBase64Encoded": false } |
HTTP/2 201, date: Wed, 08 Sep 2021 18:02:24 GMT, content-type: application/json, content-length: 27, my-custom-header: Custom Value, set-cookie: Cookie_1=Value2; Expires=21 Oct 2021 07:48 GMT, set-cookie: Cookie_2=Value2; Max-Age=78000, { "message": "Hello, world!" } |
더 알아보기 (Learn more)
- SigV4 서명 방식과 인증 유형에 따른 호출 차이, 함수 URL 요청·응답 페이로드 형식(API Gateway 페이로드 2.0 스키마)을 이어서 살펴보세요.