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 권한이 필요해요. 자세한 내용은 접근 제어를 참고하세요.

출처: AWS Lambda 개발자 안내서

본문

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&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을 지원해요. 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&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)로 인증된 경우 호출자 신원 같은 요청에 대한 추가 정보를 담은 객체예요.
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 스키마)을 이어서 살펴보세요.