Lambda 함수 URL 호출 - AWS Lambda

Lambda 함수 URL 호출

함수 URL은 Lambda 함수를 위한 전용 HTTP(S) 엔드포인트입니다. Lambda 콘솔 또는 Lambda API를 통해 함수 URL을 생성하고 구성할 수 있습니다. 함수 URL을 생성하면 Lambda가 자동으로 고유한 URL 엔드포인트를 생성합니다. 함수 URL을 생성하면 URL 엔드포인트가 변경되지 않습니다. 함수 URL 엔드포인트는 다음 형식을 취합니다.

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

AWS 리전 아시아 태평양(하이데라바드)(ap-south-2), 아시아 태평양(멜버른)(ap-southeast-4), 아시아 태평양(말레이시아)(ap-southeast-5), 캐나다 서부(캘거리)(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 권한이 있어야 합니다. 자세한 정보는 액세스 제어 섹션을 참조하세요.

함수 URL 호출 기본 사항

함수 URL에서 AWS_IAM 인증 유형을 사용하는 경우 AWS서명 버전 4(SigV4)를 사용하여 각 HTTP 요청에 서명해야 합니다. awscurl, Postman, AWS SigV4 Proxy와 같은 도구는 SigV4를 사용하여 요청에 서명할 수 있는 방법을 기본으로 제공합니다.

도구를 사용하여 함수 URL에 대한 HTTP 요청에 서명하지 않으면 SigV4를 사용하여 각 요청에 수동으로 서명해야 합니다. 함수 URL이 요청을 수신하면 Lambda는 SigV4 서명도 계산합니다. 서명이 일치하는 경우 Lambda가 요청을 처리합니다. SigV4를 사용하여 요청에 수동으로 서명하는 방법에 대한 지침은 Amazon Web Services 일반 참조 일반 참조 가이드서명 버전 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 등의 도구를 사용할 수 있습니다. 예를 들어 함수 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" }'

요청 및 응답 페이로드

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

요청 및 응답 이벤트 형식은 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인 경우 원시 경로 값은 /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, PATCHDELETE가 있습니다.

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

응답 페이로드 형식

함수가 응답을 반환하면 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가 다음과 같은 가정을 합니다.

  • statusCode200입니다.

  • content-typeapplication/json입니다.

  • body는 함수의 응답입니다.

  • isBase64Encodedfalse입니다.

다음 예제에서는 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!" }