

# Amazon API Gateway 엔드포인트를 사용하여 간접적으로 Lambda 함수 호출
<a name="services-apigateway"></a>

Amazon API Gateway를 사용하여 웹API와 Lambda 함수의 HTTP 엔드포인트를 생성할 수 있습니다. API Gateway는 HTTP 요청을 Lambda 함수로 라우팅하는 웹 API를 생성하고 문서화하는 도구를 제공합니다. 인증 및 승인 제어를 통해 API에 대한 액세스를 보호할 수 있습니다. API는 인터넷을 통해 트래픽을 처리하거나 VPC 내에서만 액세스할 수 있습니다.

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

API의 리소스는 GET 또는 POST와 같은 하나 이상의 메서드를 정의합니다. 메서드에는 요청을 Lambda 함수 또는 다른 통합 유형으로 라우팅하는 통합이 있습니다. 각 리소스와 메서드를 개별적으로 정의하거나 특수 리소스 및 메서드 유형을 사용하여 패턴에 맞는 모든 요청을 일치시킬 수 있습니다. [프록시 리소스](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html)는 리소스 아래의 모든 경로를 포착합니다. `ANY` 메서드는 모든 HTTP 메서드를 포착합니다.

**Topics**
+ [API 유형 선택](#services-apigateway-apitypes)
+ [Lambda 함수에 엔드포인트 추가](#apigateway-add)
+ [프록시 통합](#apigateway-proxy)
+ [이벤트 형식](#apigateway-example-event)
+ [응답 형식](#apigateway-types-transforms)
+ [권한](#apigateway-permissions)
+ [샘플 애플리케이션](#services-apigateway-samples)
+ [Powertools for AWS Lambda의 이벤트 핸들러](#services-apigateway-powertools)
+ [자습서: API Gateway에서 Lambda 사용](services-apigateway-tutorial.md)
+ [API Gateway API를 사용한 Lambda 오류 처리](services-apigateway-errors.md)
+ [HTTP 요청을 사용하여 Lambda 함수를 간접 호출하는 메서드 선택](apig-http-invoke-decision.md)

## API 유형 선택
<a name="services-apigateway-apitypes"></a>

API Gateway는 Lambda 함수를 간접 호출하는 세 가지 유형의 API를 지원합니다.
+ [HTTP API](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html): 가볍고 대기 시간이 짧은 RESTful API입니다.
+ [REST API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-rest-api.html): 사용자 지정 가능하고 기능이 풍부한 RESTful API입니다.
+ [WebSocket API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html): 전이중 통신을 위해 클라이언트와의 지속적인 연결을 유지하는 웹 API입니다.

HTTP API와 REST API는 모두 HTTP 요청을 처리하고 응답을 반환하는 RESTful API입니다. HTTP API는 최신 버전이며 API Gateway 버전 2 API로 빌드되었습니다. HTTP API의 새로운 기능은 다음과 같습니다.

**HTTP API 기능**
+ **자동 배포** – 경로 또는 통합을 수정하면 자동 배포가 활성화된 단계에 변경 내용이 자동으로 배포됩니다.
+ **기본 단계** – API URL의 루트 경로에서 요청을 처리하는 기본 단계(`$default`)를 만들 수 있습니다. 명명된 단계의 경우 경로 시작 부분에 단계 이름을 포함해야 합니다.
+ **CORS 구성** – CORS 헤더를 함수 코드에 수동으로 추가하는 대신 발신 응답에 추가하도록 API를 구성할 수 있습니다.

REST API는 출시 이후 API Gateway가 지원한 클래식 RESTful API입니다. REST API에는 현재 더 많은 사용자 지정, 통합 및 관리 기능이 있습니다.

**REST API 기능**
+ **통합 유형** – REST API는 사용자 지정 Lambda 통합을 지원합니다. 사용자 지정 통합을 사용하면 요청 본문만 함수로 전송하거나 변환 템플릿을 요청 본문에 적용한 후에 함수로 전송할 수 있습니다.
+ **액세스 제어** – REST API는 인증 및 승인에 대한 더 많은 옵션을 지원합니다.
+ **모니터링 및 추적** – REST API는 AWS X-Ray 추적 및 추가 로깅 옵션을 지원합니다.

자세한 비교는 *API Gateway 개발자 안내서*의 [HTTP API와 REST API 중에서 선택](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-vs-rest.html)을 참조하세요.

또한 WebSocket API는 API Gateway 버전 2 API를 사용하고 유사한 기능 세트를 지원합니다. 클라이언트와 API 간의 지속적인 연결을 활용하는 애플리케이션에 대해 WebSocket API를 사용합니다. WebSocket API는 전이중 통신을 제공하므로 클라이언트와 API 모두 응답을 기다리지 않고 지속적으로 메시지를 전송할 수 있습니다.

HTTP API는 간소화된 이벤트 형식(버전 2.0)을 지원합니다. HTTP API의 이벤트 예제는 [API Gateway에서 HTTP API에 대한 AWS Lambda 프록시 통합 생성](https://docs.aws.amazon.com//apigateway/latest/developerguide/http-api-develop-integrations-lambda.html)을 참조하세요.

자세한 내용은 [API Gateway에서 HTTP API에 대한 AWS Lambda 프록시 통합 생성](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html)을 참조하세요.

## Lambda 함수에 엔드포인트 추가
<a name="apigateway-add"></a>

**Lambda 함수에 퍼블릭 엔드포인트를 추가하려면**

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

1. 함수를 선택합니다.

1. **함수 개요(Function overview)**에서 **트리거 추가(Add trigger)**를 선택합니다.

1. **API 게이트웨이(API Gateway)**를 선택합니다.

1. **API 생성(Create an API)** 혹은 **기존 API 사용(Use an existing API)**을 선택합니다.

   1. **새 API:****API 유형**에서 **HTTP API**를 선택합니다. 자세한 내용은 [API 유형 선택](#services-apigateway-apitypes) 섹션을 참조하세요.

   1. **기존 API:** 드롭다운 목록에서 API를 선택하거나 API ID(예: r3pmxmplak)를 입력합니다.

1. **Security(보안)**에서 **Open(열기)**을 선택합니다.

1. **추가**를 선택합니다.

## 프록시 통합
<a name="apigateway-proxy"></a>

API Gateway API는 스테이지, 리소스, 메서드 및 통합으로 구성됩니다. 스테이지와 리소스가 엔드포인트의 경로를 결정합니다.

**API 경로 형식**
+ `/prod/` – `prod` 스테이지 및 루트 리소스입니다.
+ `/prod/user` – `prod` 스테이지 및 `user` 리소스입니다.
+ `/dev/{proxy+}` – `dev` 스테이지의 모든 경로입니다.
+ `/` – (HTTP API) 기본 스테이지 및 루트 리소스입니다.

Lambda 통합은 경로와 HTTP 메서드 조합을 Lambda 함수에 매핑합니다. HTTP 요청의 본문을 있는 그대로 전달하거나(사용자 지정 통합) 헤더, 리소스, 경로 및 메서드를 비롯한 모든 요청 정보가 포함된 문서에 요청 본문을 캡슐화하도록 API Gateway를 구성할 수 있습니다.

자세한 내용은 [API Gateway의 Lambda 프록시 통합](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html)을 참조하세요.

## 이벤트 형식
<a name="apigateway-example-event"></a>

Amazon API Gateway는 HTTP 요청의 JSON 표현을 포함하는 이벤트와 [동기적으로](invocation-sync.md) 함수를 간접 호출합니다. 사용자 지정 통합의 경우 이벤트는 요청 본문입니다. 프록시 통합의 경우 이벤트의 구조가 정의되어 있습니다. API Gateway REST API의 프록시 이벤트 예제는 *API Gateway 개발자 안내서*의 [프록시 통합에 대한 Lambda 함수의 입력 형식](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format)을 참조하세요.

## 응답 형식
<a name="apigateway-types-transforms"></a>

API Gateway는 함수의 응답을 기다렸다가 결과를 호출자에게 중계합니다. 사용자 지정 통합의 경우 함수의 출력을 HTTP 응답으로 변환하는 통합 응답 및 메서드 응답을 정의합니다. 프록시 통합의 경우 함수는 특정 형식의 응답 표현으로 응답해야 합니다.

다음 예제는 Node.js 함수의 응답 객체를 보여줍니다. 응답 객체는 JSON 문서를 포함하는 성공적인 HTTP 응답을 나타냅니다.

**Example index.mjs – 프록시 통합 응답 객체(Node.js)**  

```
var response = {
      "statusCode": 200,
      "headers": {
        "Content-Type": "application/json"
      },
      "isBase64Encoded": false,
      "multiValueHeaders": { 
        "X-Custom-Header": ["My value", "My other value"],
      },
      "body": "{\n  \"TotalCodeSize\": 104330022,\n  \"FunctionCount\": 26\n}"
    }
```

Lambda 런타임은 응답 객체를 JSON으로 직렬화하여 API로 전송합니다. API는 응답을 구문 분석하고 이를 사용하여 HTTP 응답을 만든 다음 원래 요청을 한 클라이언트로 보냅니다.

**Example HTTP 응답**  

```
< HTTP/1.1 200 OK
  < Content-Type: application/json
  < Content-Length: 55
  < Connection: keep-alive
  < x-amzn-RequestId: 32998fea-xmpl-4268-8c72-16138d629356
  < X-Custom-Header: My value
  < X-Custom-Header: My other value
  < X-Amzn-Trace-Id: Root=1-5e6aa925-ccecxmplbae116148e52f036
  <
  {
    "TotalCodeSize": 104330022,
    "FunctionCount": 26
  }
```

## 권한
<a name="apigateway-permissions"></a>

Amazon API Gateway는 함수의 [리소스 기반 정책](access-control-resource-based.md)에서 함수를 간접 호출하는 권한을 가져옵니다. 전체 API에 간접 호출 권한을 부여하거나 스테이지, 리소스 또는 메서드에 제한된 액세스 권한을 부여할 수 있습니다.

Lambda 콘솔, API Gateway 콘솔 또는 AWS SAM 템플릿을 사용하여 API를 함수에 추가할 때 함수의 리소스 기반 정책이 자동으로 업데이트됩니다. 다음은 함수 정책의 예입니다.

**Example 함수 정책**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "default",
  "Statement": [
    {
      "Sid": "nodejs-apig-functiongetEndpointPermissionProd-BWDBXMPLXE2F",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:111122223333:function:nodejs-apig-function-1G3MXMPLXVXYI",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "111122223333"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:execute-api:us-east-2:111122223333:ktyvxmpls1/*/GET/"
        }
      }
    }
  ]
}
```

다음 API 작업을 사용하여 함수 정책 권한을 수동으로 관리할 수 있습니다.
+ [AddPermission](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html)
+ [RemovePermission](https://docs.aws.amazon.com/lambda/latest/api/API_RemovePermission.html)
+ [GetPolicy](https://docs.aws.amazon.com/lambda/latest/api/API_GetPolicy.html)

기존 API에 호출 권한을 부여하려면 `add-permission` 명령을 사용합니다. 예제:

```
aws lambda add-permission \
  --function-name my-function \
  --statement-id apigateway-get --action lambda:InvokeFunction \
  --principal apigateway.amazonaws.com \
  --source-arn "arn:aws:execute-api:us-east-2:123456789012:mnh1xmpli7/default/GET/"
```

다음 결과가 표시됩니다.

```
{
    "Statement": "{\"Sid\":\"apigateway-test-2\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-2:123456789012:function:my-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:us-east-2:123456789012:mnh1xmpli7/default/GET\"}}}"
}
```

**참고**  
함수와 API가 다른 AWS 리전에 있는 경우 소스 ARN의 리전 식별자는 API의 리전이 아닌 함수의 리전과 일치해야 합니다. API Gateway에서 함수를 간접적으로 간접 호출하면 API의 ARN을 기반으로 하지만 함수의 리전과 일치하도록 수정된 리소스 ARN을 사용합니다.

이 예제의 소스 ARN은 ID `mnh1xmpli7`과 함께 API의 기본 단계에서 루트 리소스의 GET 메서드에 대한 통합 권한을 부여합니다. 소스 ARN에 별표를 사용하여 여러 단계, 메서드 또는 리소스에 권한을 부여할 수 있습니다.

**리소스 패턴**
+ `mnh1xmpli7/*/GET/*` – 모든 단계의 모든 리소스에 대한 GET 메서드.
+ `mnh1xmpli7/prod/ANY/user` – `prod` 스테이지의 `user` 리소스에 대한 ANY 메서드.
+ `mnh1xmpli7/*/*/*` – 모든 단계의 모든 리소스에 대한 모든 메서드.

정책 보기 및 명령문 제거에 대한 자세한 내용은 [Lambda에서 리소스 기반 IAM 정책 보기](access-control-resource-based.md) 단원을 참조하세요.

## 샘플 애플리케이션
<a name="services-apigateway-samples"></a>

[Node.js를 사용하는 API Gateway](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/nodejs-apig) 샘플 앱에는 AWS X-Ray 추적이 활성화된 REST API를 생성하는 AWS SAM 템플릿이 포함된 함수가 포함되어 있습니다. 여기에는 배포, 함수 간접 호출, API 테스트 및 정리를 위한 스크립트도 포함됩니다.

## Powertools for AWS Lambda의 이벤트 핸들러
<a name="services-apigateway-powertools"></a>

Powertools for AWS Lambda 도구 키트의 이벤트 핸들러는 API Gateway 엔드포인트(HTTP 또는 REST)에서 간접 호출한 Lambda 함수를 작성할 때 라우팅, 미들웨어, CORS 구성, OpenAPI 사양 생성, 요청 검증, 오류 처리 및 기타 유용한 기능을 제공합니다. 이벤트 핸들러 유틸리티는 Python 및 TypeScript/JavaScript에서 사용할 수 있습니다. 자세한 내용은 *Powertools for AWS Lambda(Python) 설명서*의 [이벤트 핸들러 REST API](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/api_gateway/) 및 *Powertools for AWS Lambda(TypeScript) 설명서*의 [이벤트 핸들러 HTTP API](https://docs.aws.amazon.com/powertools/typescript/latest/features/event-handler/http/)를 참조하세요.

### Python
<a name="services-apigateway-powertools-python"></a>

```
from aws_lambda_powertools import Logger
from aws_lambda_powertools.event_handler import APIGatewayRestResolver
from aws_lambda_powertools.logging import correlation_paths
from aws_lambda_powertools.utilities.typing.lambda_context import LambdaContext

app = APIGatewayRestResolver()
logger = Logger()

@app.get("/healthz")
def ping():
    return {"message": "health status ok"}

@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST)  
def lambda_handler(event: dict, context: LambdaContext) -> dict:
    return app.resolve(event, context)
```

### Typescript
<a name="services-apigateway-powertools-typescript"></a>

```
import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest';
import { Logger } from '@aws-lambda-powertools/logger';
import {
  correlationPaths,
  search,
} from '@aws-lambda-powertools/logger/correlationId';
import type { Context } from 'aws-lambda/handler';

const logger = new Logger({
  correlationIdSearchFn: search,
});

const app = new Router({ logger });

app.get("/healthz", async () => {
  return { message: "health status ok" };
});

export const handler = async (event: unknown, context: Context) => {
  // You can continue using other utilities just as before
  logger.addContext(context);
  logger.setCorrelationId(event, correlationPaths.API_GATEWAY_REST);
  return app.resolve(event, context);
};
```

# 자습서: API Gateway에서 Lambda 사용
<a name="services-apigateway-tutorial"></a>

이 자습서에서는 HTTP 요청을 사용하여 Lambda 함수를 간접 호출하는 REST API를 생성합니다. Lambda 함수는 DynamoDB 테이블에서 생성, 읽기, 업데이트 및 삭제(CRUD) 작업을 수행합니다. 이 함수는 여기서 데모용으로 제공되지만, 모든 Lambda 함수를 간접 호출할 수 있는 API Gateway REST API를 구성하는 방법을 배울 수 있습니다.

![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/APIG_tut_resources.png)


API Gateway를 사용하면 Lambda 함수를 간접 호출할 수 있는 안전한 HTTP 엔드포인트가 사용자에게 제공되며, 트래픽을 스로틀링하고 API 간접 호출을 자동으로 검증 및 승인하여 함수에 대한 대량의 간접 호출을 관리할 수 있습니다. 또한 API Gateway는 AWS Identity and Access Management(IAM) 및 Amazon Cognito를 사용하여 유연한 보안 제어 기능을 제공합니다. 이는 애플리케이션을 호출하기 위해 사전 승인이 필요한 사용 사례에 유용합니다.

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

이 자습서를 완료하는 과정에서 다음 단계를 거치게 됩니다.

1. Python 또는 Node.js 언어로 Lambda 함수를 생성하고 구성하여 DynamoDB 테이블에 대해 작업을 수행합니다.

1. API Gateway에서 REST API를 생성하여 Lambda 함수에 연결합니다.

1. DynamoDB 테이블을 정의한 후 콘솔에서 Lambda 함수를 사용하여 테스트합니다.

1. 터미널에서 curl을 사용하여 API를 배포하고 전체 설정을 테스트합니다.

이 단계를 완료하면 API Gateway를 사용하여 어떤 규모에서든 Lambda 함수를 안전하게 간접 호출할 수 있는 HTTP 엔드포인트를 생성하는 방법을 배우게 됩니다. 또한 API를 배포하는 방법과 콘솔에서 API를 테스트하는 방법, 그리고 터미널에서 HTTP 요청을 보내 AI를 테스트하는 방법을 배우게 됩니다.

## 권한 정책 생성
<a name="services-apigateway-tutorial-policy"></a>

Lambda 함수의 [실행 역할](lambda-intro-execution-role.md)을 생성하려면 먼저 권한 정책을 생성하여 필요한 AWS 리소스에 액세스할 권한을 함수에 부여해야 합니다. 이 자습서에서는 이 정책을 통해 Lambda가 DynamoDB 테이블에서 CRUD 작업을 수행하고 Amazon CloudWatch Logs 로그에 쓸 수 있도록 합니다.

**정책 생성**

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

1. **정책 생성**을 선택하세요.

1. **JSON** 탭에서 다음과 같은 사용자 지정 정책을 JSON 편집기에 붙여 넣습니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "Stmt1428341300017",
         "Action": [
           "dynamodb:DeleteItem",
           "dynamodb:GetItem",
           "dynamodb:PutItem",
           "dynamodb:Query",
           "dynamodb:Scan",
           "dynamodb:UpdateItem"
         ],
         "Effect": "Allow",
         "Resource": "*"
       },
       {
         "Sid": "",
         "Resource": "*",
         "Action": [
           "logs:CreateLogGroup",
           "logs:CreateLogStream",
           "logs:PutLogEvents"
         ],
         "Effect": "Allow"
       }
     ]
   }
   ```

------

1. **다음: 태그**를 선택합니다.

1. **다음: 검토(Next: Review)**를 선택합니다.

1. **정책 검토**의 **이름**에 **lambda-apigateway-policy**를 입력합니다.

1. **정책 생성**을 선택합니다.

## 실행 역할 만들기
<a name="services-apigateway-tutorial-role"></a>

[실행 역할](lambda-intro-execution-role.md)은 AWS 서비스 및 리소스에 액세스할 수 있는 권한을 Lambda 함수에 부여하는 AWS Identity and Access Management(IAM) 역할입니다. 함수가 DynamoDB 테이블에 대해 작업을 수행할 수 있도록 하려면 이전 단계에서 생성한 권한 정책을 연결합니다.

**실행 역할을 생성하고 사용자 지정 권한 정책을 연결하려면**

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

1. **역할 생성**을 선택합니다.

1. 신뢰할 수 있는 엔터티의 유형으로 **AWS 서비스**를 선택한 다음 사용 사례로 **Lambda**를 선택합니다.

1. **다음**을 선택합니다.

1. 정책 검색 상자에 **lambda-apigateway-policy**를 입력합니다.

1. 검색 결과에서 생성한 정책(`lambda-apigateway-policy`)을 선택한 후, **다음(Next)**을 선택합니다.

1. **Role details**(역할 세부 정보)에서 **Role name**(역할 이름)에 **lambda-apigateway-role**을 입력한 다음 **Create role**(역할 생성)을 선택합니다.

## Lambda 함수 생성
<a name="services-apigateway-tutorial-function"></a>

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 열고 **함수 생성**을 선택합니다.

1. **새로 작성**을 선택합니다.

1. [**함수 이름**]에 `LambdaFunctionOverHttps`을 입력합니다.

1. **런타임**에서 최신 Node.js 또는 Python 런타임을 선택합니다.

1. **권한(Permissions)**에서 **기본 실행 역할 변경(Change default execution role)**을 확장합니다.

1. **기존 역할 사용**을 선택하고 이전에 생성한 **lambda-apigateway-role** 역할을 선택합니다.

1. **함수 생성**을 선택합니다.

1. **코드 소스** 창에서 기본 코드를 다음 Node.js 또는 Python 코드로 바꿉니다.

------
#### [ Node.js ]

   함수를 배포하고 [DynamoDB 테이블을 생성](#services-apigateway-tutorial-table)할 때 `region` 설정이 AWS 리전과 일치해야 합니다.

**Example index.mjs**  

   ```
   import { DynamoDBDocumentClient, PutCommand, GetCommand, 
            UpdateCommand, DeleteCommand} from "@aws-sdk/lib-dynamodb";
   import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
   
   const ddbClient = new DynamoDBClient({ region: "us-east-2" });
   const ddbDocClient = DynamoDBDocumentClient.from(ddbClient);
   
   // Define the name of the DDB table to perform the CRUD operations on
   const tablename = "lambda-apigateway";
   
   /**
    * Provide an event that contains the following keys:
    *
    *   - operation: one of 'create,' 'read,' 'update,' 'delete,' or 'echo'
    *   - payload: a JSON object containing the parameters for the table item
    *     to perform the operation on
    */
   export const handler = async (event, context) => {
      
        const operation = event.operation;
      
        if (operation == 'echo'){
             return(event.payload);
        }
        
       else { 
           event.payload.TableName = tablename;
           let response;
           
           switch (operation) {
             case 'create':
                  response = await ddbDocClient.send(new PutCommand(event.payload));
                  break;
             case 'read':
                  response = await ddbDocClient.send(new GetCommand(event.payload));
                  break;
             case 'update':
                  response = ddbDocClient.send(new UpdateCommand(event.payload));
                  break;
             case 'delete':
                  response = ddbDocClient.send(new DeleteCommand(event.payload));
                  break;
             default:
               response = 'Unknown operation: ${operation}';
             }
           console.log(response);
           return response;
       }
   };
   ```

------
#### [ Python ]

**Example lambda\$1function.py**  

   ```
   import boto3
   
   # Define the DynamoDB table that Lambda will connect to
   table_name = "lambda-apigateway"
   
   # Create the DynamoDB resource
   dynamo = boto3.resource('dynamodb').Table(table_name)
   
   # Define some functions to perform the CRUD operations
   def create(payload):
       return dynamo.put_item(Item=payload['Item'])
   
   def read(payload):
       return dynamo.get_item(Key=payload['Key'])
   
   def update(payload):
       return dynamo.update_item(**{k: payload[k] for k in ['Key', 'UpdateExpression', 
       'ExpressionAttributeNames', 'ExpressionAttributeValues'] if k in payload})
   
   def delete(payload):
       return dynamo.delete_item(Key=payload['Key'])
   
   def echo(payload):
       return payload
   
   operations = {
       'create': create,
       'read': read,
       'update': update,
       'delete': delete,
       'echo': echo,
   }
   
   def lambda_handler(event, context):
       '''Provide an event that contains the following keys:
         - operation: one of the operations in the operations dict below
         - payload: a JSON object containing parameters to pass to the 
           operation being performed
       '''
       
       operation = event['operation']
       payload = event['payload']
       
       if operation in operations:
           return operations[operation](payload)
           
       else:
           raise ValueError(f'Unrecognized operation "{operation}"')
   ```

------
**참고**  
이 예제에서는 DynamoDB 테이블의 이름이 함수 코드에 변수로 정의됩니다. 실제 애플리케이션에서는 이 파라미터를 환경 변수로 전달하고 테이블 이름을 하드 코딩하지 않는 것이 좋습니다. 자세한 내용은 [AWS Lambda 환경 변수 사용](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html) 섹션을 참조하세요.

1. **배포** 섹션에서 **배포**를 선택하여 함수의 코드를 업데이트하세요.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

## 함수 테스트
<a name="services-apigateway-tutorial-test-function"></a>

함수를 API Gateway와 통합하기 전에 함수를 성공적으로 배포했는지 확인합니다. Lambda 콘솔을 사용하여 함수에 테스트 이벤트를 전송합니다.

1. 함수의 Lambda 콘솔 페이지에서 **테스트** 탭을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/test-tab.png)

1. **이벤트 JSON** 섹션까지 아래로 스크롤하고 기본 이벤트를 다음으로 바꿉니다. 이 이벤트는 Lambda 함수에서 예상되는 구조와 일치합니다.

   ```
   {
       "operation": "echo",
       "payload": {
           "somekey1": "somevalue1",
           "somekey2": "somevalue2"
       }
   }
   ```

1. **테스트**를 선택합니다.

1. **함수 실행: 성공**에서 **세부 정보**를 확장합니다. 다음과 같은 응답이 표시되어야 합니다.

   ```
   {
     "somekey1": "somevalue1",
     "somekey2": "somevalue2"
   }
   ```

## API Gateway를 사용하여 REST API 생성
<a name="services-apigateway-tutorial-api"></a>

이 단계에서는 Lambda 함수를 간접 호출하는 데 사용할 API Gateway REST API를 생성합니다.

**API를 생성하려면**

1. [API Gateway 콘솔](https://console.aws.amazon.com/apigateway)을 엽니다.

1. **API 생성**을 선택합니다.

1. **REST API** 상자에서 **빌드**를 선택합니다.

1. **API 세부 정보**에서 **새 API**를 선택한 상태로 두고 **API 이름**에 **DynamoDBOperations**를 입력합니다.

1. **API 생성**을 선택합니다.

## REST API에서 리소스 생성
<a name="services-apigateway-tutorial-resource"></a>

API에 HTTP 메서드를 추가하려면 먼저 해당 메서드가 작동하는 데 필요한 리소스를 생성해야 합니다. 여기서는 DynamoDB 테이블을 관리하기 위한 리소스를 생성합니다.

**리소스를 생성하려면**

1. [API Gateway 콘솔](https://console.aws.amazon.com/apigateway)의 사용하는 API에 대한 **리소스** 페이지에서 **리소스 생성**을 선택합니다.

1. **리소스 세부 정보**에서 **리소스 이름**에 **DynamoDBManager**를 입력합니다.

1. **리소스 생성**을 선택합니다.

## HTTP POST 메서드 생성
<a name="services-apigateway-tutorial-method"></a>

이 단계에서는 `DynamoDBManager` 리소스의 메서드(`POST`)를 생성합니다. 이 `POST` 메서드를 Lambda 함수에 연결하여 이 메서드가 HTTP 요청을 수신하면 API Gateway가 Lambda 함수를 간접 호출하도록 합니다.

**참고**  
 이 자습서에서는 HTTP 메서드(`POST`)를 하나 사용하여 DynamoDB 테이블에 대해 모든 작업을 수행하는 단일 Lambda 함수를 간접 호출합니다. 실제 애플리케이션에서는 각 작업마다 서로 다른 Lambda 함수와 HTTP 메서드를 사용하는 것이 좋습니다. 자세한 내용은 Serverless Land의 [The Lambda monolith](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/monolith)를 참조하세요.

**POST 메서드를 생성하려면**

1. API의 **리소스** 페이지에서 `/DynamoDBManager` 리소스가 강조 표시되어 있는지 확인합니다. 그런 다음, **메서드** 창에서 **메서드 생성**을 선택하세요.

1. **메서드 유형**에서 **POST**를 선택합니다.

1. **통합 유형**에서 **Lambda 함수**를 선택한 상태로 둡니다.

1. **Lambda 함수**에서 함수의 Amazon 리소스 이름(ARN)(`LambdaFunctionOverHttps`)을 선택합니다.

1. **메서드 생성**을 선택합니다.

## DynamoDB 테이블 생성
<a name="services-apigateway-tutorial-table"></a>

Lambda 함수가 CRUD 작업을 수행할 빈 DynamoDB 테이블을 생성합니다.

**DynamoDB 테이블을 생성하려면**

1. [DynamoDB 콘솔의 테이블 페이지](https://console.aws.amazon.com/dynamodbv2#tables)를 엽니다.

1. **테이블 생성**을 선택합니다.

1. **테이블 세부 정보**에서 다음을 수행합니다.

   1. **테이블 이름**에 **lambda-apigateway**을(를) 입력합니다.

   1. **파티션 키**에서 **id**를 입력하고 데이터 유형을 **문자열**로 설정합니다.

1. **Table settings**(테이블 설정)에서 **Default settings**(기본 설정)을 그대로 둡니다.

1. **테이블 생성**을 선택합니다.

## API Gateway, Lambda 및 DynamoDB의 통합 테스트
<a name="services-apigateway-tutorial-test-setup"></a>

이제 API Gateway API 메서드와 Lambda 함수 및 DynamoDB 테이블의 통합을 테스트할 준비가 되었습니다. API Gateway 콘솔을 사용하여 콘솔의 테스트 함수를 통해 `POST` 메서드에 직접 요청을 보냅니다. 이 단계에서는 먼저 `create` 작업을 사용하여 DynamoDB 테이블에 새 항목을 추가한 다음 `update` 작업을 사용하여 해당 항목을 수정합니다.

**테스트 1: DynamoDB 테이블에 새 항목을 생성하려면**

1. [API Gateway 콘솔](https://console.aws.amazon.com/apigateway)에서 API(`DynamoDBOperations`)를 선택합니다.

1. `DynamoDBManager` 리소스에서 **POST** 메서드를 선택합니다.

1. **테스트** 탭을 선택합니다. 탭을 표시하려면 오른쪽 화살표 버튼을 선택해야 할 수도 있습니다.

1. **메서드 테스트**에서 **쿼리 문자열**과 **헤더**는 비워 둡니다. **요청 본문**에 다음 JSON을 붙여넣습니다.

   ```
   {
     "operation": "create",
     "payload": {
       "Item": {
         "id": "1234ABCD",
         "number": 5
       }
     }
   }
   ```

1. **테스트**를 선택합니다.

   테스트가 완료될 때 표시되는 결과에 `200` 상태가 표시되어야 합니다. 이 상태 코드는 `create` 작업이 성공했음을 나타냅니다.

    이를 확인하려면 DynamoDB 테이블에 새 항목이 포함되어 있는지 확인합니다.

1. DynamoDB 콘솔의 [Tables](https://console.aws.amazon.com/dynamodbv2#tables)(테이블) 페이지를 열고 `lambda-apigateway` 테이블을 선택합니다.

1. **Explore table items**(테이블 항목 탐색)를 선택합니다. **Items returned**(반환된 항목) 창에 **ID**가 `1234ABCD`이고 **number**(번호)가 `5`인 항목이 하나 표시되어야 합니다. 예제:  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/items-returned.png)

**테스트 2: DynamoDB 테이블의 항목을 업데이트하려면**

1. [API Gateway 콘솔](https://console.aws.amazon.com/apigateway)에서 POST 메서드의 **테스트** 탭으로 돌아갑니다.

1. **메서드 테스트**에서 **쿼리 문자열**과 **헤더**는 비워 둡니다. **요청 본문**에 다음 JSON을 붙여넣습니다.

   ```
   {
       "operation": "update",
       "payload": {
           "Key": {
               "id": "1234ABCD"
           },
           "UpdateExpression": "SET #num = :newNum",
           "ExpressionAttributeNames": {
               "#num": "number"
           },
           "ExpressionAttributeValues": {
               ":newNum": 10
           }
       }
   }
   ```

1. **테스트**를 선택합니다.

   테스트가 완료될 때 표시되는 결과에 `200` 상태가 표시되어야 합니다. 이 상태 코드는 `update` 작업이 성공했음을 나타냅니다.

    이를 확인하려면 DynamoDB 테이블의 항목이 수정되었는지 확인하세요.

1. DynamoDB 콘솔의 [Tables](https://console.aws.amazon.com/dynamodbv2#tables)(테이블) 페이지를 열고 `lambda-apigateway` 테이블을 선택합니다.

1. **Explore table items**(테이블 항목 탐색)를 선택합니다. **Items returned**(반환된 항목) 창에 **ID**가 `1234ABCD`이고 **number**(번호)가 `10`인 항목이 하나 표시되어야 합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/items-returned-2.png)

## API 배포
<a name="services-apigateway-tutorial-deploy-api"></a>

클라이언트가 API를 호출하기 위해서는 배포 및 연결된 단계를 생성해야 합니다. 단계는 메서드와 통합을 포함한 API의 스냅샷을 나타냅니다.

**API를 배포하려면**

1. [API Gateway 콘솔](https://console.aws.amazon.com/apigateway)의 **APIs**(API) 페이지를 열고 `DynamoDBOperations` API를 선택합니다.

1. API의 **리소스** 페이지에서 **API 배포**를 선택합니다.

1. **단계**에서 **\$1새 단계\$1**를 선택하고 **단계 이름**에 **test**를 입력합니다.

1. **배포(Deploy)**를 선택합니다.

1. **단계 세부 정보** 창에서 **간접 호출 URL**을 복사합니다. 다음 단계에서는 이 URL을 사용하여 HTTP 요청을 통해 함수를 간접 호출합니다.

## curl을 사용하여 HTTP 요청을 통해 함수 간접 호출
<a name="services-apigateway-tutorial-invoke-function"></a>

이제 API에 HTTP 요청을 전송하여 Lambda 함수를 간접 호출할 수 있습니다. 이 단계에서는 DynamoDB 테이블에 새 항목을 생성한 다음, 해당 항목에 대한 읽기, 업데이트 및 삭제 작업을 수행합니다.

**curl을 사용하여 DynamoDB 테이블에 항목을 생성하려면**

1. 로컬 머신에서 터미널 또는 명령 프롬프트를 열고 이전 단계에서 복사한 간접 호출 URL을 사용하여 다음 `curl` 명령을 실행합니다. 이 명령은 다음 옵션을 사용합니다.
   + `-H`: 요청에 사용자 지정 헤더를 추가합니다. 여기서 이는 콘텐츠 유형을 JSON으로 지정합니다.
   + `-d`: 요청 본문에서 데이터를 전송합니다. 이 옵션은 기본적으로 HTTP POST 메서드를 사용합니다.

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "create", "payload": {"Item": {"id": "5678EFGH", "number": 15}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"create\", \"payload\": {\"Item\": {\"id\": \"5678EFGH\", \"number\": 15}}}'
   ```

------

   작업이 성공했다면 HTTP 상태 코드 200이 포함된 응답이 반환되어야 합니다.

1. 또한 다음 작업을 수행하여 새 항목이 테이블에 있는지 확인하기 위해 DynamoDB 콘솔을 사용할 수도 있습니다.

   1. DynamoDB 콘솔의 [Tables](https://console.aws.amazon.com/dynamodbv2#tables)(테이블) 페이지를 열고 `lambda-apigateway` 테이블을 선택합니다.

   1. **Explore table items**(테이블 항목 탐색)를 선택합니다. **Items returned**(반환된 항목) 창에 **ID**가 `5678EFGH`이고 **번호**가 `15`인 항목이 표시되어야 합니다.

**curl을 사용하여 DynamoDB 테이블에서 항목을 읽으려면**
+ 터미널 또는 명령 프롬프트에서 다음 `curl` 명령을 실행하여 방금 생성한 항목의 값을 읽습니다. 실제 간접 호출 URL을 사용하세요.

------
#### [ Linux/macOS ]

  ```
  curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
  -H "Content-Type: application/json" \
  -d '{"operation": "read", "payload": {"Key": {"id": "5678EFGH"}}}'
  ```

------
#### [ PowerShell ]

  ```
  curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"read\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}}}'
  ```

------

  Node.js 또는 Python 함수 코드 중 무엇을 선택했는지에 따라 다음 중 하나와 같은 출력이 표시되어야 합니다.

------
#### [ Node.js ]

  ```
  {"$metadata":{"httpStatusCode":200,"requestId":"7BP3G5Q0C0O1E50FBQI9NS099JVV4KQNSO5AEMVJF66Q9ASUAAJG",
  "attempts":1,"totalRetryDelay":0},"Item":{"id":"5678EFGH","number":15}}
  ```

------
#### [ Python ]

  ```
  {"Item":{"id":"5678EFGH","number":15},"ResponseMetadata":{"RequestId":"QNDJICE52E86B82VETR6RKBE5BVV4KQNSO5AEMVJF66Q9ASUAAJG",
  "HTTPStatusCode":200,"HTTPHeaders":{"server":"Server","date":"Wed, 31 Jul 2024 00:37:01 GMT","content-type":"application/x-amz-json-1.0",
  "content-length":"52","connection":"keep-alive","x-amzn-requestid":"QNDJICE52E86B82VETR6RKBE5BVV4KQNSO5AEMVJF66Q9ASUAAJG","x-amz-crc32":"2589610852"},
  "RetryAttempts":0}}
  ```

------

**curl을 사용하여 DynamoDB 테이블의 항목을 업데이트하려면**

1. 터미널 또는 명령 프롬프트에서 다음 `curl` 명령을 실행하여 `number` 값을 변경해 방금 생성한 항목을 업데이트합니다. 실제 간접 호출 URL을 사용하세요.

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "update", "payload": {"Key": {"id": "5678EFGH"}, "UpdateExpression": "SET #num = :new_value", "ExpressionAttributeNames": {"#num": "number"}, "ExpressionAttributeValues": {":new_value": 42}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"update\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}, \"UpdateExpression\": \"SET #num = :new_value\", \"ExpressionAttributeNames\": {\"#num\": \"number\"}, \"ExpressionAttributeValues\": {\":new_value\": 42}}}'
   ```

------

1. 항목의 `number` 값이 업데이트되었는지 확인하려면, 다음과 같이 다른 읽기 명령을 실행합니다.

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "read", "payload": {"Key": {"id": "5678EFGH"}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"read\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}}}'
   ```

------

**curl을 사용하여 DynamoDB 테이블의 항목을 삭제하려면**

1. 터미널 또는 명령 프롬프트에서 다음 `curl` 명령을 실행하여 방금 생성한 항목을 삭제합니다. 실제 간접 호출 URL을 사용하세요.

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "delete", "payload": {"Key": {"id": "5678EFGH"}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"delete\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}}}'
   ```

------

1. 삭제 작업이 성공했는지 확인합니다. DynamoDB 콘솔 **항목 탐색** 페이지의 **반환된 항목** 창에서 **ID**가 `5678EFGH`인 항목이 더 이상 테이블에 없는지 확인합니다.

## 리소스 정리(선택 사항)
<a name="cleanup"></a>

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

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

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

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

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

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

**집행 역할 삭제**

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

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

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

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

**API를 삭제하려면**

1. API Gateway 콘솔의 [API 페이지](https://console.aws.amazon.com/apigateway/main/apis)를 엽니다.

1. 생성한 API를 선택합니다.

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

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

**DynamoDB 테이블을 삭제하려면**

1. DynamoDB 콘솔의 [테이블 페이지](https://console.aws.amazon.com//dynamodb/home#tables:)를 엽니다.

1. 생성한 테이블을 선택합니다.

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

1. 텍스트 상자에 **delete**를 입력합니다.

1. **테이블 삭제**를 선택합니다.

# API Gateway API를 사용한 Lambda 오류 처리
<a name="services-apigateway-errors"></a>

API Gateway는 모든 호출 및 함수 오류를 내부 오류로 처리합니다. Lambda API가 호출 요청을 거부하면 API Gateway는 500 오류 코드를 반환합니다. 함수가 실행되지만 오류를 반환하거나 잘못된 형식으로 응답을 반환하는 경우 API Gateway에서 502를 반환합니다. 두 경우 모두 API Gateway의 응답 본문은 `{"message": "Internal server error"}`입니다.

**참고**  
API Gateway는 Lambda 호출을 다시 시도하지 않습니다. Lambda가 오류를 반환하면 API Gateway는 클라이언트에 오류 응답을 반환합니다.

다음 예제에서는 함수 오류가 발생해 API Gateway에서 502가 반환된 요청에 대한 X-Ray 추적 맵을 보여 줍니다. 클라이언트는 제네릭 오류 메시지를 수신합니다.

![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/tracemap-apig-502.png)


오류 응답을 사용자 지정하려면 코드에서 오류를 포착하고 필요한 형식으로 응답을 지정해야 합니다.

**Example [index.mjs](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/nodejs-apig/function/index.mjs) – 오류 형식 지정**  

```
var formatError = function(error){
  var response = {
    "statusCode": error.statusCode,
    "headers": {
      "Content-Type": "text/plain",
      "x-amzn-ErrorType": error.code
    },
    "isBase64Encoded": false,
    "body": error.code + ": " + error.message
  }
  return response
}
```

API Gateway는 이 응답을 사용자 지정 상태 코드 및 본문을 사용한 HTTP 오류로 변환합니다. 오류를 처리했기 때문에 추적 맵에서 함수 노드는 녹색입니다.

![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/tracemap-apig-404.png)


# HTTP 요청을 사용하여 Lambda 함수를 간접 호출하는 메서드 선택
<a name="apig-http-invoke-decision"></a>

Lambda에 대한 많은 일반적인 사용 사례는 HTTP 요청을 사용하여 함수를 간접 호출하는 작업과 관련이 있습니다. 예를 들어 웹 애플리케이션이 브라우저 요청을 통해 함수를 간접적으로 호출하도록 할 수 있습니다. Lambda 함수를 사용하여 전체 REST API를 생성하거나, 모바일 앱에서 사용자 상호 작용을 처리하거나, HTTP 호출을 통해 외부 서비스의 데이터를 처리하거나, 사용자 지정 웹후크를 생성할 수도 있습니다.

다음 섹션에서는 HTTP를 통해 Lambda를 간접 호출할 때 선택하는 항목을 설명하고 특정 사용 사례에 맞는 올바른 결정을 내리는 데 도움이 되는 정보를 제공합니다.

## HTTP 간접 호출 메서드를 선택할 때 선택할 수 있는 항목은 무엇인가요?
<a name="w2aad101c29c46b9"></a>

Lambda는 HTTP 요청을 사용하여 함수를 간접 호출하는 두 가지 주요 방법인 [함수 URL](urls-configuration.md) 및 [API Gateway](services-apigateway.md)를 제공합니다. 이 두 옵션의 주요 차이는 다음과 같습니다.
+ **Lambda 함수 URL**에서는 Lambda 함수에 대한 간단한 직접 HTTP 엔드포인트를 제공합니다. 단순성과 비용 효율성에 최적화되어 있으며 HTTP를 통해 Lambda 함수를 공개할 수 있는 가장 빠른 경로를 제공합니다.
+ **API Gateway**는 완전한 기능을 갖춘 API 빌드를 위한 보다 고급 서비스입니다. API Gateway는 대규모로 프로덕션 API를 빌드 및 관리하는 데 최적화되어 있으며 보안, 모니터링 및 트래픽 관리를 위한 포괄적인 도구를 제공합니다.

## 권장 사항(요구 사항을 이미 알고 있는 경우)
<a name="w2aad101c29c46c11"></a>

요구 사항을 이미 명확히 알고 있는 경우 기본 권장 사항은 다음과 같습니다.

기본 인증 방법 및 요청/응답 처리만 필요하고 비용과 복잡성을 최소화하려는 간단한 애플리케이션 또는 프로토타이프 제작에는 **[함수 URL](urls-configuration.md)**을 사용하는 것이 좋습니다.

**[API게이트웨이](services-apigateway.md)**는 대규모 프로덕션 애플리케이션 또는 [OpenAPI 설명](https://www.openapis.org/) 지원, 인증 옵션 선택 항목, 사용자 지정 도메인 이름 또는 스로틀링, 캐싱, 요청/응답 변환을 포함한 다양한 요청/응답 처리와 같은 고급 기능이 필요한 경우에 더 적합한 선택 항목입니다.

## Lambda 함수를 간접 호출하는 방법을 선택할 때 고려할 사항
<a name="w2aad101c29c46c13"></a>

함수 URL 및 API Gateway 중에서 선택할 때는 다음 요소를 고려해야 합니다.
+ OAuth 또는 Amazon Cognito에서 사용자를 인증해야 하는지 여부와 같은 인증 요구 사항
+ 규모 조정 요구 사항 및 구현하려는 API의 복잡성
+ 요청 검증 및 요청/응답 형식 지정과 같은 고급 기능이 필요한지 여부
+ 모니터링 요구 사항
+ 비용 목표

이러한 요소를 이해하면 보안, 복잡성 및 비용 요구 사항의 균형을 가장 잘 맞추는 옵션을 선택할 수 있습니다.

다음은 두 옵션 간 주요 차이를 요약한 정보입니다.

### Authentication
<a name="w2aad101c29c46c13c11b1"></a>
+ **함수 URL**에서는 AWS Identity and Access Management(IAM)를 통해 기본 인증 옵션을 제공합니다. 엔드포인트를 퍼블릭(인증 없음) 또는 IAM 인증을 요구하도록 구성할 수 있습니다. IAM 인증을 사용하면 표준 AWS 자격 증명 또는 IAM 역할을 사용하여 액세스를 제어할 수 있습니다. 간단하게 설정할 수 있지만 이 접근 방식에서는 다른 인증 방법에 비해 제한된 옵션을 제공합니다.
+ **API Gateway**는 보다 포괄적인 인증 옵션에 대한 액세스를 제공합니다. IAM 인증 외에도 [Lambda 권한 부여자](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html)(사용자 지정 인증 로직), [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) 사용자 풀 및 OAuth2.0 흐름을 사용할 수 있습니다. 이러한 유연성을 통해 서드파티 인증 제공업체, 토큰 기반 인증 및 다중 인증 등 복잡한 인증 체계를 구현할 수 있습니다.

### 요청/응답 처리
<a name="w2aad101c29c46c13c11b3"></a>
+ **함수 URL**에서는 기본 HTTP 요청 및 응답 처리를 제공합니다. 이때 표준 HTTP 메서드를 지원하며 기본 제공 교차 오리진 리소스 공유(CORS) 지원을 포함합니다. 기본적으로 JSON 페이로드 및 쿼리 파라미터를 처리할 수 있지만 요청 변환 또는 검증 기능은 제공하지 않습니다. 응답 처리도 마찬가지로 간단합니다. 클라이언트는 Lambda에서 반환하는 대로 정확히 Lambda 함수로부터 응답을 수신합니다.
+ **API Gateway**에서는 정교한 요청 및 응답 처리 기능을 제공합니다. 요청 검증기를 정의하고, 매핑 템플릿을 사용하여 요청 및 응답을 변환하며, 요청/응답 헤더를 설정하고, 응답 캐싱을 구현할 수 있습니다. 또한 API Gateway는 바이너리 페이로드 및 사용자 지정 도메인 이름을 지원하며 클라이언트에 도달하기 전에 응답을 수정할 수 있습니다. JSON 스키마를 사용하여 요청/응답 검증 및 변환을 위한 모델을 설정할 수 있습니다.

### 규모 조정
<a name="w2aad101c29c46c13c11b5"></a>
+ **함수 URL**에서는 Lambda 함수의 동시성 제한에 따라 직접 조정하며 구성된 최대 동시성 제한까지 함수를 조정하여 트래픽 급증을 처리합니다. 제한에 도달하면 Lambda는 HTTP 429 응답과 함께 추가 요청에 응답합니다. 기본 제공 대기열 메커니즘이 없으므로 규모 조정 처리는 전적으로 Lambda 함수의 구성에 따라 달라집니다. 기본적으로 Lambda 함수는 AWS 리전당 동시 실행이 1,000개로 제한됩니다.
+ **API Gateway**에서는 Lambda의 자체 규모 조정 외에도 추가 규모 조정 기능을 제공합니다. 여기에는 기본 제공 요청 대기열 및 스로틀링 제어가 포함되어 있어 트래픽 급증을 보다 점진적으로 관리할 수 있습니다. API Gateway에서는 기본적으로 리전당 1초에 최대 10,000건의 요청을 처리할 수 있으며 버스트 용량에서는 1초에 5,000건의 요청을 처리할 수 있습니다. 또한 백엔드를 보호하기 위해 여러 수준(API, 단계 또는 방법)에서 요청을 스로틀링하는 도구를 제공합니다.

### 모니터링
<a name="w2aad101c29c46c13c11b7"></a>
+ **함수 URL**에서는 요청 수, 지연 시간 및 오류 비율을 포함하여 Amazon CloudWatch 지표를 통한 기본 모니터링을 제공합니다. 함수에 들어오는 원시 요청을 보여주는 표준 Lambda 지표 및 로그에 액세스할 수 있습니다. 이를 통해 핵심적인 운영 가시성을 제공하지만 지표는 주로 함수 실행에 중점을 둡니다.
+ **API Gateway**에서는 세부 지표, 로깅 및 추적 옵션을 포함한 포괄적인 모니터링 기능을 제공합니다. CloudWatch를 통해 API 직접 호출, 지연 시간, 오류 비율 및 캐시 적중/누락 비율을 모니터링할 수 있습니다. 또한 API Gateway는 분산 추적을 위해 AWS X-Ray와 통합되며 사용자 지정 가능한 로깅 형식을 제공합니다.

### 비용
<a name="w2aad101c29c46c13c11b9"></a>
+ **함수 URL**은 표준 Lambda 요금 모델을 따르므로, 함수 간접 호출 및 컴퓨팅 시간에 대한 비용만 지불하면 됩니다. URL 엔드포인트 자체에는 추가 요금이 부과되지 않습니다. 따라서 API Gateway의 추가 기능이 필요하지 않은 경우 간단한 API 또는 트래픽이 적은 애플리케이션에 비용 효율적인 선택이 됩니다.
+ **API Gateway**는 REST API에 대해 수신된 백만 개의 API 직접 호출 및 HTTP API에 대해 수신된 백만 개의 API 직접 호출을 포함하는 [프리 티어](https://aws.amazon.com/api-gateway/pricing/#Free_Tier)를 제공합니다. 프리 티어 이후에 API Gateway에서는 API 직접 호출, 데이터 전송 및 캐싱(활성화된 경우)에 대해 요금을 청구합니다. 자체 사용 사례의 비용을 파악하기 위해 API Gateway [요금 페이지](https://aws.amazon.com/api-gateway/pricing/)를 참조하세요.

### 기타 기능
<a name="w2aad101c29c46c13c11c11"></a>
+ **함수 URL**은 단순성과 직접적인 Lambda 통합을 위해 설계되었습니다. 여기에서는 HTTP 및 HTTPS 엔드포인트를 모두 지원하고, 기본 제공 CORS 지원을 제공하며, 듀얼 스택(IPv4 및 IPv6) 엔드포인트를 제공합니다. 고급 기능은 부족하지만 HTTP를 통해 Lambda 함수를 공개하는 빠르고 간단한 방법이 필요한 시나리오에서 적합합니다.
+ **API Gateway**에는 API 버전 관리, 단계 관리, 사용 계획을 위한 API 키, Swagger/OpenAPI에 관한 API 설명서, WebSocket API, VPC 내 프라이빗 API, 추가 보안을 위한 WAF 통합과 같은 많은 추가 기능이 포함되어 있습니다. 또한 카나리 배포, 테스트를 위한 모의 통합 및 Lambda 외 다른 AWS 서비스와의 통합을 지원합니다.

## Lambda 함수를 간접 호출할 메서드 선택
<a name="w2aad101c29c46c15"></a>

이제 Lambda 함수 URL 및 API Gateway 중 하나를 선택하는 기준과 이들 간의 주요 차이에 대해 알아보았으니, 요구 사항에 가장 적합한 옵션을 선택하고 다음 리소스를 사용하여 사용을 시작할 수 있습니다.

------
#### [ Function URLs ]

**다음 리소스를 사용하여 함수 URL 시작하기**
+ 자습서 [함수 URL을 사용하여 Lambda 함수 생성](urls-webhook-tutorial.md) 수행
+ 이 설명서의 [Lambda 함수 URL 생성 및 관리](urls-configuration.md) 장에서 함수 URL에 대해 자세히 알아보기
+ 다음을 수행하여 콘솔 내 안내식 자습서 **간단한 웹 앱 생성**을 시도해 보세요.

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

1. 화면의 오른쪽 상단에 있는 아이콘을 선택하여 도움말 패널을 여세요.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/console_help_screenshot.png)

1. **자습서**를 선택하세요.

1. **간단한 웹 앱 생성**에서 **자습서 시작**을 선택하세요.

------
#### [ API Gateway ]

**다음 리소스를 사용하여 Lambda 및 API Gateway 시작하기**
+ 자습서 [API Gateway와 함께 Lambda 사용](services-apigateway-tutorial.md)에 따라 백엔드 Lambda 함수와 통합된 REST API를 생성합니다.
+ *Amazon API Gateway 개발자 안내서*의 다음 섹션에서 API Gateway가 제공하는 여러 API 유형에 대해 자세히 알아보세요.
  + [API Gateway REST API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-rest-api.html)
  + [API Gateway HTTP API](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html)
  + [API Gateway WebSocket API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html)
+ *Amazon API Gateway 개발자 안내서*의 [자습서 및 워크숍](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-tutorials.html) 섹션에서 하나 이상의 예제를 시도해 보세요.

------