

# S3 객체 Lambda를 사용하여 객체 변환
<a name="transforming-objects"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

Amazon S3 객체 Lambda를 통해 자체 코드를 Amazon S3 `GET`, `LIST`, `HEAD` 요청에 추가하여 애플리케이션으로 데이터가 반환될 때 데이터를 수정 및 처리할 수 있습니다. 사용자 지정 코드를 사용하여 행을 필터링하고 동적으로 이미지 크기를 조정하고 워터마크를 삽입하고 기밀 데이터를 교정하는 등 S3 `GET` 요청에서 반환한 데이터를 수정할 수 있습니다. 또한, S3 객체 Lambda를 사용하여 S3 `LIST` 요청의 출력을 수정하여 버킷 내 모든 객체의 사용자 지정 보기를 생성하고, S3 `HEAD` 요청의 출력을 수정하여 객체 이름 및 크기와 같은 객체 메타데이터를 수정할 수 있습니다. S3 객체 Lambda를 Amazon CloudFront 배포의 오리진으로 사용하여 이미지 크기 자동 조정, 이전 형식 트랜스코딩(예: JPEG에서 WebP로), 메타데이터 스트리핑과 같이 최종 사용자를 위해 데이터를 조정할 수 있습니다. 자세한 내용은 [Amazon CloudFront와 함께 Amazon S3 객체 Lambda 사용하기](https://aws.amazon.com/blogs/aws/new-use-amazon-s3-object-lambda-with-amazon-cloudfront-to-tailor-content-for-end-users/) AWS 블로그 게시물을 참조하십시오. AWS Lambda 함수로 구동되는 코드는 AWS에서 완전히 관리되는 인프라에서 실행됩니다. S3 객체 Lambda를 사용하면 데이터의 파생 사본을 생성 및 저장하거나 프록시를 실행하지 않아도 되며, 애플리케이션을 변경하지 않아도 됩니다.

**S3 객체 Lambda 작동 방식**  
S3 객체 Lambda는 AWS Lambda 함수를 사용하여 표준 S3 `GET`, `LIST` 또는 `HEAD` 요청의 출력을 자동으로 처리합니다. AWS Lambda는 기본 컴퓨팅 리소스를 관리할 필요 없이 고객 정의 코드를 실행하는 서버리스 컴퓨팅 서비스입니다. 자체 사용자 지정 Lambda 함수를 작성 및 실행하여 특정 사용 사례에 맞게 데이터 변환을 조정할 수 있습니다.

Lambda 함수를 구성한 후에 객체 Lambda 액세스 포인트**라고도 하는 S3 객체 Lambda 서비스 엔드포인트에 연결합니다. Object Lambda 액세스 포인트는 *지원 액세스 포인트*라고도 하는 표준 S3 액세스 포인트를 사용하여 데이터에 액세스합니다.

객체 Lambda 액세스 포인트로 요청을 보낼 때 Amazon S3가 자동으로 Lambda 함수를 호출합니다. 객체 Lambda 액세스 포인트를 통해 S3 `GET`, `LIST` 또는 `HEAD` 요청을 사용하여 검색되는 모든 데이터는 변환된 결과를 다시 애플리케이션으로 반환합니다. 다른 모든 요청은 다음 다이어그램과 같이 일반적으로 처리됩니다.



![\[S3 객체 Lambda의 작동 방식을 보여 주는 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/ObjectLamdaDiagram.png)


이 섹션의 주제에서는 S3 객체 Lambda를 사용한 작업 방법에 대해 설명합니다.

**Topics**
+ [객체 Lambda 액세스 포인트 생성](olap-create.md)
+ [Amazon S3 객체 Lambda 액세스 포인트 사용](olap-use.md)
+ [S3 객체 Lambda 액세스 포인트에 대한 보안 고려 사항](olap-security.md)
+ [S3 객체 Lambda 액세스 포인트에 대한 Lambda 함수 작성](olap-writing-lambda.md)
+ [AWS 빌드 Lambda 함수 사용](olap-examples.md)
+ [S3 객체 Lambda에 대한 모범 사례 및 지침](olap-best-practices.md)
+ [S3 객체 Lambda 자습서](olap-tutorials.md)
+ [S3 Object Lambda 디버깅 및 문제 해결](olap-debugging-lambda.md)

# 객체 Lambda 액세스 포인트 생성
<a name="olap-create"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

Object Lambda 액세스 포인트는 생성 중에 지정하는 정확히 하나의 표준 액세스 포인트와 연결됩니다. 객체 Lambda 액세스 포인트를 생성하려면 다음 리소스가 필요합니다.
+ **표준 S3 액세스 지점.** Object Lambda 액세스 포인트를 사용할 때 이 표준 액세스 포인트를 *지원 액세스 포인트*라고 하며, S3 버킷 또는 Amazon FSx for OpenZFS 볼륨에 연결됩니다. 표준 액세스 지점 생성에 대한 자세한 내용은 [액세스 포인트 생성](creating-access-points.md) 섹션을 참조하세요.
+ ** AWS Lambda 함수.** 직접 Lambda 함수를 만들 수도 있고 사전 빌드된 함수를 사용할 수도 있습니다. Lambda 함수 생성에 대한 자세한 내용은 [S3 객체 Lambda 액세스 포인트에 대한 Lambda 함수 작성](olap-writing-lambda.md) 섹션을 참조하세요. 미리 빌드된 함수에 대한 자세한 내용은 [AWS 빌드 Lambda 함수 사용](olap-examples.md) 섹션을 참조하십시오.
+ **(선택 사항) AWS Identity and Access Management (IAM) 정책.** Amazon S3 액세스 지점은 리소스, 사용자 또는 기타 조건별로 액세스 지점 사용을 제어할 수 있는 IAM 리소스 정책을 지원합니다. 이러한 정책 생성에 대한 자세한 내용은 [객체 Lambda 액세스 포인트에 대한 IAM 정책 구성](olap-policies.md) 섹션을 참조하십시오.

다음 섹션에서는 다음을 사용하여 객체 Lambda 액세스 포인트를 생성하는 방법에 대해 설명합니다.
+ AWS Management Console은
+ AWS Command Line Interface(AWS CLI)
+ AWS CloudFormation 템플릿
+ AWS Cloud Development Kit (AWS CDK)은

REST API를 사용하여 객체 Lambda 액세스 포인트를 생성하는 방법에 대한 자세한 내용은 **Amazon Simple Storage Service API 참조의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPointForObjectLambda.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPointForObjectLambda.html) 섹션을 참조하십시오.

## Object Lambda 액세스 포인트 생성
<a name="create-olap"></a>

다음 절차 중 하나를 사용하여 객체 Lambda 액세스 포인트를 생성합니다.

### S3 콘솔 사용
<a name="olap-create-console"></a>

**콘솔을 사용하여 객체 Lambda 액세스 포인트 생성**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 탐색 모음에서 현재 표시된 AWS 리전의 이름을 선택합니다. 그런 다음 전환하려는 리전을 선택합니다.

1. 왼쪽 탐색 창에서 **객체 Lambda 액세스 포인트(Object Lambda Access Points)**를 선택합니다.

1. **객체 Lambda 액세스 포인트(Object Lambda Access Points)** 페이지에서 **객체 Lambda 액세스 포인트 생성(Create Object Lambda Access Point)**을 선택합니다.

1. **Object Lambda access point name**(객체 Lambda 액세스 지점 이름)에 액세스 지점에 사용할 이름을 입력합니다.

   표준 액세스 포인트와 마찬가지로 객체 Lambda 액세스 포인트에 대한 명명 규칙이 있습니다. 자세한 내용은 [액세스 포인트 이름 지정 규칙](access-points-restrictions-limitations-naming-rules.md#access-points-names) 섹션을 참조하세요.

1. **Supporting Access Point**(지원 액세스 지점)에 사용하려는 표준 액세스 지점을 입력하거나 찾아봅니다. 액세스 포인트는 변환하려는 객체와 동일한 AWS 리전에 있어야 합니다. 표준 액세스 지점 생성에 대한 자세한 내용은 [액세스 포인트 생성](creating-access-points.md) 섹션을 참조하세요.

1. **변환 구성**에서 객체 Lambda 액세스 포인트의 데이터를 변환하는 함수를 추가할 수 있습니다. 다음 중 하나를 수행하세요.
   + 계정에 이미 AWS Lambda 함수가 있는 경우 **Invoke Lambda function**(Lambda 함수 호출)에서 해당 함수를 선택할 수 있습니다. 여기에서 AWS 계정에 있는 Lambda 함수의 Amazon 리소스 이름(ARN)을 입력하거나 드롭다운 메뉴에서 Lambda 함수를 선택할 수 있습니다.
   + AWS에서 빌드한 함수를 사용하려면 **AWS built function**( 빌드 함수)에서 함수 이름을 선택하고 **Create Lambda function**(Lambda 함수 생성)을 선택합니다. 그러면 빌드된 함수를 AWS 계정에 배포할 수 있는 Lambda 콘솔로 이동합니다. 빌드된 함수에 대한 자세한 내용은 [AWS 빌드 Lambda 함수 사용](olap-examples.md) 섹션을 참조하십시오.

   **S3 APIs**(S3 API)에서 호출할 API 작업을 하나 이상 선택합니다. 선택한 각 API에 대해 호출할 Lambda 함수를 지정해야 합니다.

1. (선택 사항) **Payload**(페이로드) 아래에서 Lambda 함수에 입력으로 제공할 JSON 텍스트를 추가합니다. 동일한 Lambda 함수를 호출하는 여러 객체 Lambda 액세스 포인트에 대해 서로 다른 파라미터를 사용하여 페이로드를 구성할 수 있으므로 Lambda 함수의 유연성을 높일 수 있습니다.
**중요**  
객체 Lambda 액세스 포인트를 사용할 때 페이로드에는 기밀 정보를 포함하지 않아야 합니다.

1. (선택 사항) **Range and part number**(범위 및 부분 번호)의 경우 범위 및 부분 번호 헤더가 있는 `GET` 및 `HEAD` 요청을 처리하려면 이 옵션을 활성화해야 합니다. 이 옵션을 사용하면 Lambda 함수로 이러한 요청을 인식하고 처리할 수 있음을 확인하는 것입니다. 범위 헤더 및 부분 번호에 대한 자세한 내용은 [Range 및 partNumber 헤더 작업](range-get-olap.md) 섹션을 참조하십시오.

1. (선택 사항) **요청 지표**에서 **활성화** 또는 **비활성화**를 선택하여 객체 Lambda 액세스 포인트에 Amazon S3 모니터링을 추가합니다. 요청 지표는 표준 Amazon CloudWatch 요금으로 청구됩니다.

1. (선택 사항) **Object Lambda Access Point Policy**(객체 Lambda 액세스 지점 정책)에서 리소스 정책을 설정합니다. 리소스 정책은 지정된 객체 Lambda 액세스 포인트에 대한 권한을 부여하며 리소스, 사용자 또는 기타 조건별로 액세스 포인트 사용을 제어할 수 있습니다. 객체 Lambda 액세스 지점 리소스 정책에 대한 자세한 내용은 [객체 Lambda 액세스 포인트에 대한 IAM 정책 구성](olap-policies.md) 섹션을 참조하십시오.

1. **Block Public Access settings for this Object Lambda Access Point**(이 객체 Lambda 액세스 포인트에 대한 퍼블릭 액세스 차단 설정)에서, 적용할 퍼블릭 액세스 차단 설정을 선택합니다. 새 객체 Lambda 액세스 지점에는 기본적으로 모든 퍼블릭 액세스 차단 설정이 활성화되어 있으며 기본 설정을 그대로 유지하는 것이 좋습니다. Amazon S3에서는 현재 객체 Lambda 액세스 지점이 생성된 후 객체 Lambda 액세스 지점의 퍼블릭 액세스 차단 설정을 변경하도록 지원하지 않습니다.

   Amazon S3 퍼블릭 액세스 차단 사용에 대한 자세한 내용은 [범용 버킷의 액세스 포인트에 대한 퍼블릭 액세스 관리](access-points-bpa-settings.md) 섹션을 참조하십시오.

1. **Create Object Lambda Access Point**(객체 Lambda 액세스 지점 생성)를 선택합니다.

### AWS CLI 사용
<a name="olap-create-cli"></a>

**AWS CloudFormation 템플릿을 사용하여 객체 Lambda 액세스 포인트 생성**
**참고**  
다음 명령을 사용하려면 `user input placeholders`를 실제 정보로 대체합니다.

1. [S3 객체 Lambda 기본 구성](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration)에서 AWS Lambda 함수 배포 패키지 `s3objectlambda_deployment_package.zip`을 다운로드합니다.

1. 다음 `put-object` 명령을 실행하여 Amazon S3 버킷에 패키지를 업로드합니다.

   ```
   aws s3api put-object --bucket Amazon S3 bucket name --key s3objectlambda_deployment_package.zip --body release/s3objectlambda_deployment_package.zip
   ```

1. [S3 객체 Lambda 기본 구성](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration)에서 AWS CloudFormation 템플릿 `s3objectlambda_defaultconfig.yaml`을 다운로드합니다.

1. 다음 `deploy` 명령을 실행하여 템플릿을 AWS 계정에 배포합니다.

   ```
   aws cloudformation deploy --template-file s3objectlambda_defaultconfig.yaml \
    --stack-name CloudFormation stack name \ 
    --parameter-overrides ObjectLambdaAccessPointName=Object Lambda Access Point name \
     SupportingAccessPointName=Amazon S3 access point S3BucketName=Amazon S3 bucket \
     LambdaFunctionS3BucketName=Amazon S3 bucket containing your Lambda package \ 
     LambdaFunctionS3Key=Lambda object key LambdaFunctionS3ObjectVersion=Lambda object version \ 
     LambdaFunctionRuntime=Lambda function runtime --capabilities capability_IAM
   ```

`GET`, `HEAD` 및 `LIST` API 작업에 대해 Lambda를 호출하도록 이 AWS CloudFormation 템플릿을 구성할 수 있습니다. 템플릿의 기본 구성 수정에 대한 자세한 내용은 [CloudFormation 템플릿을 사용하여 S3 객체 Lambda 설정 자동화](olap-using-cfn-template.md) 섹션을 참조하십시오.<a name="olap-create-cli-specific"></a>

**AWS CLI를 사용하여 객체 Lambda 액세스 포인트 생성**
**참고**  
다음 명령을 사용하려면 `user input placeholders`를 실제 정보로 대체합니다.

다음 예시에서는 계정 *`111122223333`*의 *`amzn-s3-demo-bucket1`* 버킷에 대해 이름이 *`my-object-lambda-ap`*인 객체 Lambda 액세스 포인트를 생성합니다. 이 예제에서는 이름이 *`example-ap`*인 표준 액세스 포인트 정책이 이미 생성되어 있다고 가정합니다. 표준 액세스 포인트 생성에 대한 자세한 내용은 [액세스 포인트 생성](creating-access-points.md) 섹션을 참조하십시오.

이 예제에서는 AWS의 미리 빌드된 함수 `decompress`를 사용합니다. 미리 빌드된 함수에 대한 자세한 내용은 [AWS 빌드 Lambda 함수 사용](olap-examples.md) 섹션을 참조하십시오.

1. 버킷을 만듭니다. 이 예제에서는 *`amzn-s3-demo-bucket1`*을 사용합니다. 버킷 생성에 대한 자세한 내용은 [범용 버킷 생성](create-bucket-overview.md) 섹션을 참조하십시오.

1. 표준 액세스 포인트를 생성하여 버킷에 연결합니다. 이 예제에서는 *`example-ap`*을 사용합니다. 표준 액세스 지점 생성에 대한 자세한 내용은 [액세스 포인트 생성](creating-access-points.md) 섹션을 참조하십시오.

1. 다음 중 하나를 수행하세요.
   + 계정에 Amazon S3 객체를 변환하는 데 사용할 Lambda 함수를 생성합니다. Lambda 함수 생성에 대한 자세한 내용은 [S3 객체 Lambda 액세스 포인트에 대한 Lambda 함수 작성](olap-writing-lambda.md) 섹션을 참조하십시오. AWS CLI에서 사용자 지정 함수를 사용하려면 AWS Lambda 개발자 안내서의** [AWS CLI에서 Lambda 사용](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html)을 참조하십시오.
   + AWS의 사전 빌드된 Lambda 함수를 사용합니다. 미리 빌드된 함수에 대한 자세한 내용은 [AWS 빌드 Lambda 함수 사용](olap-examples.md) 섹션을 참조하십시오.

1. 이름이 `my-olap-configuration.json`인 JSON 구성 파일을 생성합니다. 이 구성에서는 이전 단계에서 생성한 Lambda 함수의 지원 액세스 지점과 Amazon 리소스 이름(ARN) 또는 사용 중인 사전 빌드된 함수의 ARN을 제공합니다.  
**Example**  

   

   ```
   {
       "SupportingAccessPoint" : "arn:aws:s3:us-east-1:111122223333:accesspoint/example-ap",
       "TransformationConfigurations": [{
           "Actions" : ["GetObject", "HeadObject", "ListObjects", "ListObjectsV2"],
           "ContentTransformation" : {
               "AwsLambda": {
                   "FunctionPayload" : "{\"compressionType\":\"gzip\"}",
                   "FunctionArn" : "arn:aws:lambda:us-east-1:111122223333:function/compress"
               }
           }
       }]
   }
   ```

1. `create-access-point-for-object-lambda` 명령을 실행하여 객체 Lambda 액세스 포인트를 생성합니다.

   ```
   aws s3control create-access-point-for-object-lambda --account-id 111122223333 --name my-object-lambda-ap --configuration file://my-olap-configuration.json
   ```

1. (선택 사항) 이름이 `my-olap-policy.json`인 JSON 정책 파일을 생성합니다.

   객체 Lambda 액세스 지점 리소스 정책을 추가하면 리소스, 사용자 또는 기타 조건별로 액세스 지점 사용을 제어할 수 있습니다. 이 리소스 정책은 계정 *`444455556666`*에 대한 `GetObject` 권한을 객체 Lambda 액세스 포인트에 부여합니다.  
**Example**  

   

   ```
   {
       "Version": "2008-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Grant account 444455556666 GetObject access",
               "Effect": "Allow",
               "Action": "s3-object-lambda:GetObject",
               "Principal": {
                   "AWS": "arn:aws:iam::444455556666:root"
               },
               "Resource": "your-object-lambda-access-point-arn"
           }
       ]
   }
   ```

1. (선택 사항) `put-access-point-policy-for-object-lambda` 명령을 실행하여 리소스 정책을 설정합니다.

   ```
   aws s3control put-access-point-policy-for-object-lambda --account-id 111122223333 --name my-object-lambda-ap --policy file://my-olap-policy.json
   ```

1. (선택 사항) 페이로드를 지정합니다.

   페이로드는 AWS Lambda 함수에 입력으로 제공할 수 있는 선택적 JSON입니다. 동일한 Lambda 함수를 호출하는 여러 객체 Lambda 액세스 포인트에 대해 서로 다른 파라미터를 사용하여 페이로드를 구성할 수 있으므로 Lambda 함수의 유연성을 높일 수 있습니다.

   다음 객체 Lambda 액세스 포인트 구성은 파라미터 2개가 있는 페이로드를 보여줍니다.

   ```
   {
   	"SupportingAccessPoint": "AccessPointArn",
   	"CloudWatchMetricsEnabled": false,
   	"TransformationConfigurations": [{
   		"Actions": ["GetObject", "HeadObject", "ListObjects", "ListObjectsV2"],
   		"ContentTransformation": {
   			"AwsLambda": {
   				"FunctionArn": "FunctionArn",
   				"FunctionPayload": "{\"res-x\": \"100\",\"res-y\": \"100\"}"
   			}
   		}
   	}]
   }
   ```

   다음 객체 Lambda 액세스 포인트 구성은 파라미터 1개가 있고 `GetObject-Range`, `GetObject-PartNumber`, `HeadObject-Range` 및 `HeadObject-PartNumber`가 활성화된 페이로드를 보여줍니다.

   ```
   {
       "SupportingAccessPoint":"AccessPointArn",
       "CloudWatchMetricsEnabled": false,
       "AllowedFeatures": ["GetObject-Range", "GetObject-PartNumber", "HeadObject-Range", "HeadObject-PartNumber"],        
       "TransformationConfigurations": [{
           "Action": ["GetObject", "HeadObject", "ListObjects", "ListObjectsV2"],
           "ContentTransformation": {
               "AwsLambda": {
                   "FunctionArn":"FunctionArn",
                   "FunctionPayload": "{\"compression-amount\": \"5\"}"
               }
           }
       }]
   }
   ```
**중요**  
객체 Lambda 액세스 포인트를 사용할 때 페이로드에는 기밀 정보를 포함하지 않아야 합니다.

### AWS CloudFormation 콘솔 및 템플릿 사용
<a name="olap-create-cfn-console"></a>

Amazon S3에서 제공하는 기본 구성을 사용하여 객체 Lambda 액세스 포인트를 생성할 수 있습니다. [GitHub 리포지토리](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration)에서 AWS CloudFormation 템플릿 및 Lambda 함수 소스 코드를 다운로드하고 이러한 리소스를 배포하여 기능적 객체 Lambda 액세스 포인트를 설정할 수 있습니다.

AWS CloudFormation 템플릿의 기본 구성 수정에 대한 내용은 [CloudFormation 템플릿을 사용하여 S3 객체 Lambda 설정 자동화](olap-using-cfn-template.md) 섹션을 참조하십시오.

템플릿 없이 CloudFormation을 사용하여 객체 Lambda 액세스 포인트를 구성하는 방법에 대한 자세한 내용은 **AWS CloudFormation 사용 설명서의 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3objectlambda-accesspoint.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3objectlambda-accesspoint.html)를 참조하십시오.

**Lambda 함수 배포 패키지 업로드**

1. [S3 객체 Lambda 기본 구성](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration)에서 AWS Lambda 함수 배포 패키지 `s3objectlambda_deployment_package.zip`을 다운로드합니다.

1. Amazon S3 버킷에 패키지를 업로드합니다.

**AWS CloudFormation 콘솔을 사용하여 객체 Lambda 액세스 포인트 생성**

1. [S3 객체 Lambda 기본 구성](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration)에서 AWS CloudFormation 템플릿 `s3objectlambda_defaultconfig.yaml`을 다운로드합니다.

1. AWS 관리 콘솔에 로그인하고 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)에서 AWS CloudFormation 콘솔을 엽니다.

1. 다음 중 하나를 수행하십시오.
   + AWS CloudFormation을 한 번도 사용해 본 적이 없다면 AWS CloudFormation 홈페이지에서 **Create stack**(스택 생성)을 선택합니다.
   + AWS CloudFormation을 이전에 사용한 적이 있다면 왼쪽 탐색 창에서 **Stacks**(스택)를 선택합니다. **Create stack**(스택 생성)을 선택한 다음 **With new resources (standard)**새 리소스 사용(표준)를 선택합니다.

1. **사전 조건 - 템플릿 준비(Prerequisite - Prepare template)**에서 **템플릿 준비 완료**를 선택합니다.

1. **Specify template**(템플릿 지정)에서 **Upload a template file**(템플릿 파일 업로드)를 선택하고 `s3objectlambda_defaultconfig.yaml`을 업로드합니다.

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

1. **스택 세부 정보 지정(Specify stack details)** 페이지에서 스택 이름을 입력합니다.

1. **Parameters**(파라미터) 섹션에서 스택 템플릿에 정의된 다음 파라미터를 지정합니다.

   1. **CreateNewSupportingAccessPoint**의 경우 다음 중 하나를 수행합니다.
      + 템플릿을 업로드한 S3 버킷에 대한 지원 액세스 지점이 이미 있는 경우 **false**(거짓)를 선택합니다.
      + 이 버킷에 대한 새 액세스 지점을 생성하려면 **true**(참)를 선택합니다.

   1. **EnableCloudWatchMonitoring**의 경우 Amazon CloudWatch 요청 지표 및 경보를 활성화할지 여부에 따라 **true**(참) 또는 **false**(거짓)를 선택합니다.

   1. (선택 사항) **LambdaFunctionPayload**에서 Lambda 함수에 입력으로 제공할 JSON 텍스트를 추가합니다. 동일한 Lambda 함수를 호출하는 여러 객체 Lambda 액세스 포인트에 대해 서로 다른 파라미터를 사용하여 페이로드를 구성할 수 있으므로 Lambda 함수의 유연성을 높일 수 있습니다.
**중요**  
객체 Lambda 액세스 포인트를 사용할 때 페이로드에는 기밀 정보를 포함하지 않아야 합니다.

   1. **LambdaFunctionRuntime**에 Lambda 함수의 원하는 런타임을 입력합니다. 사용 가능한 선택 항목은 `nodejs14.x`, `python3.9`, `java11`입니다.

   1. **LambdaFunctionS3BucketName**에 배포 패키지를 업로드한 Amazon S3 버킷 이름을 입력합니다.

   1. **LambdaFunctionS3Key**에 배포 패키지를 업로드한 Amazon S3 객체 키를 입력합니다.

   1. **LambdaFunctionS3ObjectVersion**에 배포 패키지를 업로드한 Amazon S3 객체 버전을 입력합니다.

   1. **ObjectLambdaAccessPointName**에 객체 Lambda 액세스 포인트의 이름을 입력합니다.

   1. **S3BucketName**에 객체 Lambda 액세스 포인트와 연결될 Amazon S3 버킷 이름을 입력합니다.

   1. **SupportingAccessPointName**에 지원 액세스 지점의 이름을 입력합니다.
**참고**  
이것이 이전 단계에서 선택한 Amazon S3 버킷과 연결된 액세스 지점입니다. Amazon S3 버킷과 연결된 액세스 지점이 없는 경우 **CreateNewSupportingAccessPoint**에서 **true**(참)를 선택하여 액세스 지점을 생성하도록 템플릿을 구성할 수 있습니다.

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

1. **스택 옵션 구성** 페이지에서 **다음**을 선택합니다.

   이 페이지의 선택적 설정에 대한 자세한 내용은 AWS CloudFormation 사용 설명서**의 [AWS CloudFormation 스택 옵션 설정](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-add-tags.html)을 참조하십시오.

1. **검토** 페이지에서 **스택 생성**을 선택합니다.

### AWS Cloud Development Kit (AWS CDK) 사용
<a name="olap-create-cdk"></a>

AWS CDK을 사용하여 객체 Lambda 액세스 포인트를 구성하는 방법에 대한 자세한 내용은 AWS Cloud Development Kit (AWS CDK) API 참조**의 [`AWS::S3ObjectLambda` 구성 라이브러리](https://docs.aws.amazon.com/cdk/api/latest/docs/aws-s3objectlambda-readme.html)를 참조하십시오.

# CloudFormation 템플릿을 사용하여 S3 객체 Lambda 설정 자동화
<a name="olap-using-cfn-template"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

AWS CloudFormation 템플릿을 사용하여 Amazon S3 객체 Lambda 액세스 포인트를 빠르게 생성할 수 있습니다. CloudFormation 템플릿은 관련 리소스를 자동으로 생성하고, AWS Identity and Access Management(IAM) 역할을 구성하고, 객체 Lambda 액세스 포인트를 통해 요청을 자동으로 처리하는 AWS Lambda 함수를 설정합니다. CloudFormation 템플릿을 사용하면 모범 사례를 구현하고 보안 태세를 개선하고 수동 프로세스로 인한 오류를 줄일 수 있습니다.

이 [GitHub 리포지토리](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration)에는 CloudFormation 템플릿 및 Lambda 함수 소스 코드가 포함되어 있습니다. 스키마 템플릿을 사용하는 방법에 대한 지침은 [객체 Lambda 액세스 포인트 생성](olap-create.md) 섹션을 참조하십시오.

템플릿에 제공된 Lambda 함수는 변환을 실행하지 않습니다. 대신 기본 데이터 소스에서 있는 그대로 객체를 반환합니다. 함수를 복제하고 고유한 변환 코드를 추가하여 애플리케이션에 반환되는 데이터를 수정하고 처리할 수 있습니다. 함수 수정에 대한 자세한 내용은 [Lambda 함수 수정](#modifying-lambda-function) 및 [S3 객체 Lambda 액세스 포인트에 대한 Lambda 함수 작성](olap-writing-lambda.md) 섹션을 참조하십시오.

## 템플릿 수정
<a name="modifying-cfn-template"></a>

**새로운 지원 액세스 지점 생성**  
S3 객체 Lambda는 객체 Lambda 액세스 포인트와 *지원 액세스 포인트*라고도 하는 표준 S3 액세스 포인트라는 두 가지 액세스 포인트를 사용합니다. 객체 Lambda 액세스 포인트에 요청을 수행할 때 S3는 S3 객체 Lambda 구성에 따라 사용자를 대신하여 Lambda를 호출하거나 지원 액세스 포인트에 요청을 위임합니다. 템플릿을 배포할 때 `aws cloudformation deploy` 명령의 일부로 다음 파라미터를 전달하여 새로운 지원 액세스 지점을 생성할 수 있습니다.

```
CreateNewSupportingAccessPoint=true
```

**함수 페이로드 구성**  
템플릿을 배포할 때 `aws cloudformation deploy` 명령의 일부로 다음 파라미터를 전달하여 Lambda 함수에 추가 데이터를 제공하도록 페이로드를 구성할 수 있습니다.

```
LambdaFunctionPayload="format=json"
```

**Amazon CloudWatch 모니터링 사용**  
템플릿을 배포할 때 `aws cloudformation deploy` 명령의 일부로 다음 파라미터를 전달하여 CloudWatch 모니터링을 사용 설정할 수 있습니다.

```
EnableCloudWatchMonitoring=true
```

이 파라미터는 Amazon S3 요청 지표에 대한 객체 Lambda 액세스 포인트를 활성화하고 클라이언트 측 오류와 서버 측 오류를 모니터링하는 2개의 CloudWatch 경보를 생성합니다.

**참고**  
Amazon CloudWatch를 사용하면 추가 비용이 발생합니다. Amazon S3 요청 지표에 대한 자세한 내용은 [액세스 포인트 모니터링 및 로깅](access-points-monitoring-logging.md) 섹션을 참조하십시오.  
요금에 대한 자세한 내용은 [CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/)을 참조하십시오.

**프로비저닝된 동시성 구성**  
지연 시간을 줄이려면 `Resources` 아래에 다음 줄을 포함하도록 템플릿을 편집하여 객체 Lambda 액세스 포인트를 지원하는 Lambda 함수에 대해 프로비저닝된 동시성을 구성합니다.

```
LambdaFunctionVersion:
      Type: AWS::Lambda::Version
      Properties:
        FunctionName: !Ref LambdaFunction
        ProvisionedConcurrencyConfig:
            ProvisionedConcurrentExecutions: Integer
```

**참고**  
동시성 프로비저닝에 대한 추가 요금이 발생합니다. 프로비저닝된 동시성에 대한 자세한 내용은 AWS Lambda 개발자 안내서**의 [Lambda 프로비저닝된 동시성 관리](https://docs.aws.amazon.com/lambda/latest/dg/provisioned-concurrency.html)를 참조하십시오.  
요금에 대한 자세한 내용은 [AWS Lambda 요금](https://aws.amazon.com/lambda/pricing/)을 참조하십시오.

## Lambda 함수 수정
<a name="modifying-lambda-function"></a>

**`GetObject` 요청의 헤더 값 변경**  
기본적으로 Lambda 함수는 미리 서명된 URL 요청에서 `GetObject` 클라이언트로 `Content-Length` 및 `ETag`를 제외한 모든 헤더를 전달합니다. Lambda 함수의 변환 코드를 기반으로 `GetObject` 클라이언트에 새 헤더 값을 보내도록 선택할 수 있습니다.

`WriteGetObjectResponse` API 작업에서 새 헤더 값을 전달하여 Lambda 함수를 업데이트하여 새 헤더 값을 보낼 수 있습니다.

예를 들어 Lambda 함수가 Amazon S3 객체의 텍스트를 다른 언어로 번역하는 경우 `Content-Language` 헤더에 새 값을 전달할 수 있습니다. 다음과 같이 `writeResponse` 함수를 수정하면 됩니다.

```
async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer,
  headers: Headers): Promise<PromiseResult<{}, AWSError>> {
  const { algorithm, digest } = getChecksum(transformedObject);

  return s3Client.writeGetObjectResponse({
    RequestRoute: requestContext.outputRoute,
    RequestToken: requestContext.outputToken,
    Body: transformedObject,
    Metadata: {
      'body-checksum-algorithm': algorithm,
      'body-checksum-digest': digest
    },
    ...headers,
    ContentLanguage: 'my-new-language'
  }).promise();
}
```

지원되는 헤더의 전체 목록은 *Amazon Simple Storage Service API Reference*의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax) 섹션을 참조하십시오.

**메타데이터 헤더 반환**  
[https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax) API 작업 요청에서 새 헤더 값을 전달하여 Lambda 함수를 업데이트하여 새 헤더 값을 보낼 수 있습니다.

```
async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer,
  headers: Headers): Promise<PromiseResult<{}, AWSError>> {
  const { algorithm, digest } = getChecksum(transformedObject);

  return s3Client.writeGetObjectResponse({
    RequestRoute: requestContext.outputRoute,
    RequestToken: requestContext.outputToken,
    Body: transformedObject,
    Metadata: {
      'body-checksum-algorithm': algorithm,
      'body-checksum-digest': digest,
      'my-new-header': 'my-new-value' 
    },
    ...headers
  }).promise();
}
```

**새 상태 코드 반환**  
사용자 정의 상태 코드를 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax) API 작업 요청에서 전달하여 `GetObject` 클라이언트에 반환할 수 있습니다.

```
async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer,
  headers: Headers): Promise<PromiseResult<{}, AWSError>> {
  const { algorithm, digest } = getChecksum(transformedObject);

  return s3Client.writeGetObjectResponse({
    RequestRoute: requestContext.outputRoute,
    RequestToken: requestContext.outputToken,
    Body: transformedObject,
    Metadata: {
      'body-checksum-algorithm': algorithm,
      'body-checksum-digest': digest
    },
    ...headers,
    StatusCode: Integer
  }).promise();
}
```

지원되는 상태 코드의 전체 목록은 [Amazon Simple Storage Service API Reference](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax)의 *`WriteGetObjectResponse`* 섹션을 참조하십시오.

**원본 객체에 `Range` 및 `partNumber` 적용**  
기본적으로 CloudFormation 템플릿에서 생성된 객체 Lambda 액세스 포인트는 `Range` 및 `partNumber` 파라미터를 처리할 수 있습니다. Lambda 함수는 요청된 범위 또는 부품 번호를 변환된 객체에 적용합니다. 이를 위해 이 함수는 전체 객체를 다운로드하고 변환을 실행해야 합니다. 경우에 따라 변환된 객체 범위가 원본 객체 범위에 정확히 매핑될 수 있습니다. 즉, 원본 객체에서 바이트 범위 A-B를 요청하고 변환을 실행하면 전체 객체를 요청하고 변환을 실행하고 변환된 객체에서 바이트 범위 A-B를 반환하는 것과 동일한 결과를 얻을 수 있습니다.

이러한 경우 Lambda 함수 구현을 변경하여 범위 또는 부품 번호를 원본 객체에 직접 적용할 수 있습니다. 이 방법을 통해 전체 함수 지연 시간과 필요한 메모리가 줄어듭니다. 자세한 내용은 [Range 및 partNumber 헤더 작업](range-get-olap.md) 섹션을 참조하세요.

**`Range` 및 `partNumber` 처리 사용 중지**  
기본적으로 CloudFormation 템플릿에서 생성된 객체 Lambda 액세스 포인트는 `Range` 및 `partNumber` 파라미터를 처리할 수 있습니다. 이 동작이 필요하지 않은 경우 템플릿에서 다음 줄을 제거하여 이를 비활성화할 수 있습니다.

```
AllowedFeatures:
  - GetObject-Range
  - GetObject-PartNumber
  - HeadObject-Range 
  - HeadObject-PartNumber
```

**대형 객체 변환**  
기본적으로 Lambda 함수는 S3 객체 Lambda에 대한 응답 스트리밍을 시작하기 전에 메모리에서 전체 객체를 처리합니다. 변환을 수행할 때 응답을 스트리밍하도록 함수를 수정할 수 있습니다. 이렇게 하면 변환 대기 시간과 Lambda 함수 메모리 크기를 줄이는 데 도움이 됩니다. 구현 예는 [압축된 콘텐츠 스트리밍 예](olap-writing-lambda.md#olap-getobject-response)를 참조하십시오.

# Amazon S3 객체 Lambda 액세스 포인트 사용
<a name="olap-use"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

S3 객체 Lambda 액세스 포인트를 통해 요청하는 것은 다른 액세스 포인트를 통해 요청하는 것과 동일하게 작동합니다. 액세스 포인트를 통해 요청하는 방법에 대한 자세한 내용은 [범용 버킷의 Amazon S3 Access Points 사용](using-access-points.md) 섹션을 참조하십시오. AWS Command Line Interface(AWS CLI), AWS SDK 또는 Amazon S3 REST API를 사용하여 객체 Lambda 액세스 포인트를 통해 요청할 수 있습니다.

**중요**  
객체 Lambda 액세스 포인트에 대한 Amazon 리소스 이름(ARN)은 `s3-object-lambda`의 서비스 이름을 사용합니다. 따라서 객체 Lambda 액세스 포인트 ARN은 다른 액세스 포인트에서 사용되는 `arn:aws::s3` 대신 `arn:aws::s3-object-lambda`로 시작됩니다.

## 객체 Lambda 액세스 포인트에 대한 ARN을 찾는 방법
<a name="olap-find-arn"></a>

AWS CLI 또는 AWS SDK에서 객체 Lambda 액세스 포인트를 사용하려면 객체 Lambda 액세스 포인트의 Amazon 리소스 이름(ARN)을 알아야 합니다. 다음 예시에서는 Amazon S3 콘솔 또는 AWS CLI를 사용하여 객체 Lambda 액세스 포인트에 대한 ARN을 찾는 방법을 보여줍니다.

### S3 콘솔 사용
<a name="olap-use-arn-console"></a>

**콘솔을 사용하여 객체 Lambda 액세스 포인트에 대한 ARN을 찾는 방법**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **객체 Lambda 액세스 포인트(Object Lambda Access Points)**를 선택합니다.

1. ARN을 복사할 객체 Lambda 액세스 포인트 옆에 있는 옵션 버튼을 선택합니다.

1. **ARN 복사(Copy ARN)**를 선택합니다.

### AWS CLI 사용
<a name="olap-use-arn-cli"></a>

**AWS CLI를 사용하여 객체 Lambda 액세스 포인트에 대한 ARN을 찾는 방법**

1. AWS 계정와 연결된 객체 Lambda 액세스 포인트의 목록을 검색하려면 다음 명령을 실행합니다. 명령을 실행하기 전에 계정 ID *`111122223333`*을 자신의 AWS 계정 ID로 바꿉니다.

   ```
   aws s3control list-access-points-for-object-lambda --account-id 111122223333
   ```

1. 명령 출력을 검토하여 사용할 객체 Lambda 액세스 포인트 ARN을 찾습니다. 이전 명령의 출력이 다음 예제와 비슷해야 합니다.

   ```
   {
       "ObjectLambdaAccessPointList": [
           {
               "Name": "my-object-lambda-ap",
               "ObjectLambdaAccessPointArn": "arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/my-object-lambda-ap"
           },
           ...
       ]
   }
   ```

## S3 버킷 객체 Lambda 액세스 포인트에 버킷 스타일 별칭을 사용하는 방법
<a name="ol-access-points-alias"></a>

객체 Lambda 액세스 포인트를 생성할 때 Amazon S3는 객체 Lambda 액세스 포인트에 대한 고유한 별칭을 자동으로 생성합니다. 액세스 포인트 데이터 영역 작업 요청에 Amazon S3 버킷 이름이나 객체 Lambda 액세스 포인트 Amazon 리소스 이름(ARN) 대신 이 별칭을 사용할 수 있습니다. 해당 작업의 목록은 [액세스 포인트 호환성](access-points-service-api-support.md)을(를) 참조하십시오.

객체 Lambda 액세스 포인트 별칭 이름은 Amazon S3 버킷과 동일한 네임스페이스 내에서 생성됩니다. 이 별칭 이름은 자동으로 생성되며 변경할 수 없습니다. 기존 객체 Lambda 액세스 포인트의 경우 사용할 별칭이 자동으로 할당됩니다. 객체 Lambda 액세스 포인트 별칭 이름은 유효한 Amazon S3 버킷 이름의 모든 요구 사항을 충족하며 다음의 파트로 구성됩니다.

`Object Lambda Access Point name prefix-metadata--ol-s3`

**참고**  
`--ol-s3` 접미사는 객체 Lambda 액세스 포인트 별칭 이름용으로 예약되어 있으며 버킷 또는 객체 Lambda 액세스 포인트 이름에는 사용할 수 없습니다. Amazon S3 버킷 이름 지정 규칙에 대한 자세한 내용은 [범용 버킷 이름 지정 규칙](bucketnamingrules.md) 섹션을 참조하십시오.

다음 예시는 이름이 `my-object-lambda-access-point`인 객체 Lambda 액세스 포인트에 대한 ARN 및 객체 Lambda 액세스 포인트 별칭을 보여줍니다.
+ **ARN**-`arn:aws:s3-object-lambda:region:account-id:accesspoint/my-object-lambda-access-point`
+ **객체 Lambda 액세스 포인트 별칭** - `my-object-lambda-acc-1a4n8yjrb3kda96f67zwrwiiuse1a--ol-s3`

객체 Lambda 액세스 포인트를 사용하면 코드를 크게 변경하지 않고도 객체 Lambda 액세스 포인트 별칭 이름을 사용할 수 있습니다.

객체 Lambda 액세스 포인트를 삭제하면 객체 Lambda 액세스 포인트 별칭 이름이 비활성화되고 프로비저닝이 해제됩니다.

### 객체 Lambda 액세스 포인트에 대한 별칭을 찾는 방법
<a name="olap-find-alias"></a>

#### S3 콘솔 사용
<a name="olap-use-alias-console"></a>

**콘솔을 사용하여 객체 Lambda 액세스 포인트에 대한 별칭을 찾는 방법**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **객체 Lambda 액세스 포인트(Object Lambda Access Points)**를 선택합니다.

1. 사용하려는 객체 Lambda 액세스 포인트를 위해 **객체 Lambda 액세스 포인트 별칭** 값을 복사합니다.

#### AWS CLI 사용
<a name="olap-use-alias-cli"></a>

객체 Lambda 액세스 포인트를 생성하면 Amazon S3는 다음 예시 명령과 같이 객체 Lambda 액세스 포인트 별칭 이름을 자동으로 생성합니다. 이 명령을 실행하려면 `user input placeholders`를 사용자의 정보로 대체합니다. AWS CLI를 사용하여 객체 Lambda 액세스 포인트를 생성하는 방법에 대한 자세한 내용은 [AWS CLI를 사용하여 객체 Lambda 액세스 포인트 생성](olap-create.md#olap-create-cli-specific) 섹션을 참조하십시오.

```
aws s3control create-access-point-for-object-lambda --account-id 111122223333 --name my-object-lambda-access-point --configuration file://my-olap-configuration.json
{
    "ObjectLambdaAccessPointArn": "arn:aws:s3:region:111122223333:accesspoint/my-access-point",
    "Alias": {
        "Value": "my-object-lambda-acc-1a4n8yjrb3kda96f67zwrwiiuse1a--ol-s3",
        "Status": "READY"
    }
}
```

생성된 객체 Lambda 액세스 포인트 별칭 이름에는 두 개의 필드가 있습니다.
+ `Value` 필드는 객체 Lambda 액세스 포인트의 별칭 값입니다.
+ `Status` 필드는 객체 Lambda 액세스 포인트 별칭의 상태입니다. 상태가 `PROVISIONING`인 경우 Amazon S3가 객체 Lambda 액세스 포인트 별칭을 프로비저닝하고 있으며 아직 별칭을 사용할 준비가 되지 않았다는 뜻입니다. 상태가 `READY`인 경우 객체 Lambda 액세스 포인트 별칭이 성공적으로 프로비저닝되어 사용할 준비가 된 것입니다.

REST API의 `ObjectLambdaAccessPointAlias` 데이터 유형에 대한 자세한 내용은 **Amazon Simple Storage Service API 참조의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPointForObjectLambda.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPointForObjectLambda.html) 및 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ObjectLambdaAccessPointAlias.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ObjectLambdaAccessPointAlias.html) 섹션을 참조하십시오.

### 객체 Lambda 액세스 포인트 별칭을 사용하는 방법
<a name="use-olap-alias"></a>

[액세스 포인트 호환성](access-points-service-api-support.md)에 나열된 작업에 Amazon S3 버킷 이름 대신 객체 Lambda 액세스 포인트 별칭을 사용할 수 있습니다.

`get-bucket-location` 명령에 대한 다음 AWS CLI 예시에서는 버킷의 액세스 포인트 별칭을 사용하여 버킷이 있는 AWS 리전을 반환합니다. 이 명령을 실행하려면 `user input placeholders`를 사용자의 정보로 대체합니다.

```
aws s3api get-bucket-location --bucket my-object-lambda-acc-w7i37nq6xuzgax3jw3oqtifiusw2a--ol-s3
            
{
    "LocationConstraint": "us-west-2"
}
```

요청의 객체 Lambda 액세스 포인트 별칭이 유효하지 않은 경우 `InvalidAccessPointAliasError` 오류 코드가 반환됩니다. `InvalidAccessPointAliasError`에 대한 자세한 내용은 **Amazon Simple Storage Service API 참조의 [오류 코드 목록](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList)을 참조하십시오.

객체 Lambda 액세스 포인트 별칭의 제한 사항은 액세스 포인트 별칭의 제한 사항과 동일합니다. 액세스 포인트 별칭의 제한 사항에 대한 자세한 내용은 [액세스 포인트 별칭 제한 사항](access-points-naming.md#use-ap-alias-limitations) 섹션을 참조하십시오.

# S3 객체 Lambda 액세스 포인트에 대한 보안 고려 사항
<a name="olap-security"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

Amazon S3 객체 Lambda를 사용하면 AWS Lambda의 규모와 유연성을 컴퓨팅 플랫폼으로 사용하여 Amazon S3에서 나오는 데이터에 대해 사용자 지정 변환을 수행할 수 있습니다. S3와 Lambda는 기본적으로 보안을 유지하지만 이 보안을 유지하기 위해 Lambda 함수 작성자가 특별히 고려해야 할 것이 있습니다. S3 객체 Lambda를 사용하려면 모든 액세스가 인증된 보안 주체(익명 액세스 불가) 및 HTTPS를 통해 이루어져야 합니다.

보안 위험을 완화하기 위해 다음 작업을 수행하는 것이 좋습니다.
+ Lambda 실행 역할의 범위를 가능한 가장 작은 권한 집합으로 한정합니다.
+ 가능하면 Lambda 함수가 제공된 미리 서명된 URL을 통해 Amazon S3에 액세스하도록 합니다.

## IAM 정책 구성
<a name="olap-iam-policies"></a>

S3 액세스 포인트는 리소스, 사용자 또는 기타 조건별로 액세스 포인트 사용을 제어할 수 있는 AWS Identity and Access Management(IAM) 리소스 정책을 지원합니다. 자세한 내용은 [객체 Lambda 액세스 포인트에 대한 IAM 정책 구성](olap-policies.md) 섹션을 참조하세요.

## 암호화 동작
<a name="olap-encryption"></a>

객체 Lambda 액세스 포인트에는 Amazon S3와 AWS Lambda가 모두 사용되기 때문에 암호화 동작에 차이가 있습니다. 기본 S3 암호화 동작에 대한 자세한 내용은 [Amazon S3 버킷에 대한 기본 서버 측 암호화 동작 설정](bucket-encryption.md) 섹션을 참조하십시오.
+ 객체 Lambda 액세스 포인트와 함께 S3 서버 측 암호화를 사용하는 경우 객체는 Lambda로 전송되기 전에 해독됩니다. Lambda로 전송된 객체는 암호화되지 않은 상태로 처리됩니다(`GET` 또는 `HEAD` 요청의 경우).
+ 암호화 키의 로깅을 방지하기 위해 S3는 고객이 제공한 키(SSE-C)를 사용하여 서버 측 암호화를 통해 암호화된 객체에 대한 `GET` 및 `HEAD` 요청을 거부합니다. 그러나 Lambda 함수에서 클라이언트가 제공한 키에 액세스할 수 있는 경우에는 여전히 이러한 객체를 검색할 수 있습니다.
+ 객체 Lambda 액세스 포인트와 함께 S3 클라이언트측 암호화를 사용하는 경우 Lambda가 객체를 해독하고 다시 암호화할 수 있도록 암호화 키에 액세스할 수 있는지 확인해야 합니다.

## 액세스 포인트
<a name="olap-access-points-security"></a>

S3 객체 Lambda는 객체 Lambda 액세스 포인트와 *지원 액세스 포인트*라고도 하는 표준 S3 액세스 포인트라는 두 가지 액세스 포인트를 사용합니다. 객체 Lambda 액세스 포인트에 요청을 수행할 때 S3는 S3 객체 Lambda 구성에 따라 사용자를 대신하여 Lambda를 호출하거나 지원 액세스 포인트에 요청을 위임합니다. 요청에 대해 Lambda가 호출되면 S3는 지원 액세스 지점을 통해 사용자를 대신하여 객체에 대해 미리 서명된 URL을 생성합니다. Lambda 함수가 호출될 때 이 URL을 입력으로 수신합니다.

S3를 직접 호출하는 대신 이 미리 서명된 URL을 사용하여 원본 객체를 검색하도록 Lambda 함수를 설정할 수 있습니다. 이 모델을 사용하면 객체에 더 나은 보안 경계를 적용할 수 있습니다. S3 버킷 또는 S3 액세스 포인트를 통해 제한된 IAM 역할 또는 사용자 집합으로 직접 객체 액세스를 제한할 수 있습니다. 이 방법은 또한 호출자와 다른 사용 권한을 가진 잘못 구성된 함수가 의도치 않게 객체에 대한 액세스를 허용 또는 거부할 수 있는 [혼동된 대리인 문제](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)의 영향을 받지 않도록 Lambda 함수를 보호합니다.

## 객체 Lambda 액세스 포인트 퍼블릭 액세스
<a name="olap-public-access"></a>

Amazon S3가 S3 객체 Lambda 요청을 완료하기 위해 사용자의 자격 증명을 인증해야 하기 때문에 S3 객체 Lambda는 익명 또는 퍼블릭 액세스를 허용하지 않습니다. 객체 Lambda 액세스 포인트를 통해 요청을 호출하는 경우, 구성된 Lambda 함수에 대한 `lambda:InvokeFunction` 권한이 필요합니다 마찬가지로 객체 Lambda 액세스 포인트를 통해 다른 API 작업을 호출할 때 필요한 `s3:*` 권한이 있어야 합니다.

이러한 권한이 없으면 Lambda를 호출하거나 S3에 위임하라는 요청이 HTTP 403(금지) 오류로 실패합니다. 모든 액세스는 인증된 보안 주체에 의해 이루어져야 합니다. 퍼블릭 액세스가 필요한 경우 Lambda@Edge를 대안으로 사용할 수 있습니다. 자세한 내용은 *Amazon CloudFront 개발자 안내서*에서 [Lambda@Edge를 사용하여 엣지에서 사용자 지정](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html)을 참조하십시오.

## 객체 Lambda 액세스 포인트 IP 주소
<a name="olap-ips"></a>

`describe-managed-prefix-lists` 서브넷은 게이트웨이 가상 프라이빗 클라우드(VPC) 엔드포인트를 지원하며, VPC 엔드포인트의 라우팅 테이블과 관련됩니다. 객체 Lambda 액세스 포인트는 게이트웨이 VPC를 지원하지 않으므로 IP 범위가 누락되었습니다. 누락된 범위는 Amazon S3에 속하지만 게이트웨이 VPC 엔드포인트에서는 지원되지 않습니다. `describe-managed-prefix-lists`에 대한 자세한 내용은 **Amazon EC2 API 참조의 [DescribeManagedPrefixLists](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeManagedPrefixLists.html) 및 **AWS 일반 참조의 [AWS IP 주소 범위](https://docs.aws.amazon.com/general/latest/gr/aws-ip-ranges.html)를 참조하십시오.

# 객체 Lambda 액세스 포인트에 대한 IAM 정책 구성
<a name="olap-policies"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

Amazon S3 액세스 포인트는 리소스, 사용자 또는 기타 조건별로 액세스 포인트 사용을 제어할 수 있는 AWS Identity and Access Management(IAM) 리소스 정책을 지원합니다. 객체 Lambda 액세스 포인트의 선택적 리소스 정책이나 지원 액세스 포인트의 리소스 정책을 통해 액세스를 제어할 수 있습니다. 단계별 예제는 [자습서: S3 객체 Lambda를 사용하여 애플리케이션의 데이터 변환](tutorial-s3-object-lambda-uppercase.md) 및 [자습서: S3 객체 Lambda 및 Amazon Comprehend를 사용하여 PII 데이터 감지 및 수정](tutorial-s3-object-lambda-redact-pii.md) 단원을 참조하십시오.

다음 4개 리소스에 객체 Lambda 액세스 포인트로 작업할 수 있는 권한을 부여해야 합니다.
+ 사용자 또는 역할과 같은 IAM 자격 증명입니다. IAM 자격 증명 및 모범 사례에 대한 자세한 내용은 **IAM 사용 설명서의 [IAM 자격 증명(사용자, 사용자 그룹 및 역할)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)을 참조하십시오.
+ S3 버킷 또는 Amazon FSx for OpenZFS 볼륨과 같은 기본 데이터 소스에 연결된 표준 액세스 포인트입니다. 객체 Lambda 액세스 포인트로 작업할 때 이 표준 액세스 포인트를 지원 액세스 포인트**라고 합니다.
+ 객체 Lambda 액세스 포인트
+ AWS Lambda 함수

**중요**  
정책을 저장하기 전에 AWS Identity and Access Management Access Analyzer의 보안 경고, 오류, 일반 경고 및 제안 사항을 해결해야 합니다. IAM Access Analyzer는 정책 확인은 실행하여 IAM [정책 문법](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html) 및 [모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)에 대해 정책을 검증합니다. 이러한 확인은 결과를 생성하고 보안 모범 사례를 준수하고 작동하는 정책을 작성하는 데 도움이 되는 실행 가능한 권장 사항을 제공합니다.  
IAM Access Analyzer를 사용한 정책 검증에 대한 자세한 내용은 **IAM 사용 설명서의 [IAM Access Analyzer 정책 검증](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)을 참조하십시오. IAM Access Analyzer에서 반환된 경고, 오류 및 제안 사항 목록을 보려면 [IAM Access Analyzer 정책 확인 참조](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-reference-policy-checks.html)를 참조하십시오.

다음 정책 예시에서는 다음과 같은 리소스가 있다고 가정합니다.
+ Amazon S3 버킷에는 다음과 같은 Amazon S3 리소스 이름(ARN)이 포함되어 있습니다.

  `arn:aws:s3:::amzn-s3-demo-bucket1`
+ 다음 ARN이 있는 이 버킷의 Amazon S3 Standard 액세스 포인트 

  `arn:aws:s3:us-east-1:111122223333:accesspoint/my-access-point`
+ 다음 ARN이 있는 객체 Lambda 액세스 포인트: 

  `arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/my-object-lambda-ap`
+ 다음 ARN을 사용하는 AWS Lambda 함수 

  `arn:aws:lambda:us-east-1:111122223333:function:MyObjectLambdaFunction`

**참고**  
계정에서 Lambda 함수를 사용하는 경우 정책 문에 특정 함수 버전을 포함해야 합니다. 다음 예시 ARN에서 버전은 *1*로 표시됩니다.  
`arn:aws:lambda:us-east-1:111122223333:function:MyObjectLambdaFunction:1`  
Lambda는 버전 `$LATEST`에 IAM 정책을 추가하는 것을 지원하지 않습니다. Lambda 함수 버전에 대한 자세한 내용은 AWS Lambda 개발자 안내서**의 [Lambda 함수 버전](https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html)을 참조하십시오.

**Example - 표준 액세스 지점에 액세스 제어를 위임하는 버킷 정책**  
다음 S3 버킷 정책 예는 버킷에 대한 액세스 제어를 버킷의 표준 액세스 지점에 위임합니다. 이 정책은 버킷 소유자의 계정이 소유한 모든 액세스 지점에 대한 전체 액세스를 허용합니다. 따라서 이 버킷에 대한 모든 액세스는 해당 액세스 지점에 연결된 정책에 의해 제어됩니다. 사용자는 액세스 지점을 통해서만 버킷에서 읽을 수 있으므로 액세스 지점을 통해서만 작업이 호출될 수 있습니다. 자세한 내용은 [액세스 포인트에 액세스 제어 위임](access-points-policies.md#access-points-delegating-control) 섹션을 참조하세요.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement" : [
    {
        "Effect": "Allow",
        "Principal" : { "AWS":"account-ARN"},
        "Action" : "*",
        "Resource" : [
            "arn:aws:s3:::amzn-s3-demo-bucket", 
            "arn:aws:s3:::amzn-s3-demo-bucket/*"
        ],
        "Condition": {
            "StringEquals" : { "s3:DataAccessPointAccount" : "Bucket owner's account ID" }
        }
    }]
}
```

**Example - 사용자에게 객체 Lambda 액세스 포인트를 사용하는 데 필요한 권한을 부여하는 IAM 정책**  
다음 IAM 정책은 사용자에게 Lambda 함수, 표준 액세스 포인트 및 객체 Lambda 액세스 포인트에 대한 권한을 부여합니다.    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowLambdaInvocation",
      "Action": [
        "lambda:InvokeFunction"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:lambda:us-east-1:111122223333:function:MyObjectLambdaFunction:1",
      "Condition": {
        "ForAnyValue:StringEquals": {
          "aws:CalledVia": [
            "s3-object-lambda.amazonaws.com"
          ]
        }
      }
    },
    {
      "Sid": "AllowStandardAccessPointAccess",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:us-east-1:111122223333:accesspoint/my-access-point/*",
      "Condition": {
        "ForAnyValue:StringEquals": {
          "aws:CalledVia": [
            "s3-object-lambda.amazonaws.com"
          ]
        }
      }
    },
    {
      "Sid": "AllowObjectLambdaAccess",
      "Action": [
        "s3-object-lambda:Get*",
        "s3-object-lambda:List*"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/my-object-lambda-ap"
    }
  ]
}
```

## Lambda 실행 역할에 대한 권한 활성화
<a name="olap-execution-role"></a>

객체 Lambda 액세스 포인트에 `GET` 요청이 있을 때 Lambda 함수는 S3 객체 Lambda 액세스 포인트에 데이터를 보낼 수 있는 권한이 필요합니다. 이 권한은 Lambda 함수의 실행 역할에 대한 `s3-object-lambda:WriteGetObjectResponse` 권한을 활성화하여 제공됩니다. 새로운 실행 역할을 생성하거나 기존 역할을 업데이트할 수 있습니다.

**참고**  
`GET` 요청인 경우에만 함수에 `s3-object-lambda:WriteGetObjectResponse` 권한이 필요합니다.

**IAM 콘솔에서 실행 역할을 생성하려면**

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 왼쪽 탐색 창에서 **역할**을 선택합니다.

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

1. **Common use cases(일반 사용 사례)**에서 **Lambda**를 선택합니다.

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

1. **Add permissions**(권한 추가) 페이지에서 AWS 관리형 정책인 [https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/service-role/AmazonS3ObjectLambdaExecutionRolePolicy$serviceLevelSummary](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/service-role/AmazonS3ObjectLambdaExecutionRolePolicy$serviceLevelSummary)를 검색한 다음 정책 이름 옆의 확인란을 선택합니다.

   이 정책에는 `s3-object-lambda:WriteGetObjectResponse` 작업이 포함되어야 합니다.

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

1. **Name, review, and create**(이름, 검토 및 생성) 페이지에서 **Role name**(역할 이름)에 **s3-object-lambda-role**을 입력합니다.

1. (선택 사항) 이 역할에 대한 설명 및 태그를 추가합니다.

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

1. 새로 생성된 **s3-object-lambda-role**을 Lambda 함수의 실행 역할로 적용합니다. 이 작업은 Lambda 콘솔에서 Lambda 함수를 생성하는 동안 또는 이후에 수행할 수 있습니다.

실행 역할에 대한 자세한 내용은 *AWS Lambda 개발자 가이드*의 [Lambda 실행 역할](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)을 참조하십시오.

## 객체 Lambda 액세스 포인트에 컨텍스트 키 사용
<a name="olap-keys"></a>

S3 객체 Lambda는 요청의 연결 서명과 관련된 `s3-object-lambda:TlsVersion` 또는 `s3-object-lambda:AuthType`과 같은 컨텍스트 키를 평가합니다. `s3:prefix`와 같은 다른 모든 컨텍스트 키는 Amazon S3에 의해 평가됩니다.

## 객체 Lambda 액세스 포인트 CORS 지원
<a name="olap-cors"></a>

브라우저로부터 요청을 받거나 요청에 `Origin` 헤더가 포함된 경우 S3 Object Lambda는 항상 `"AllowedOrigins":"*"` 헤더 필드를 추가합니다.

자세한 내용은 [교차 오리진 리소스 공유(CORS) 사용](cors.md) 섹션을 참조하세요.

# S3 객체 Lambda 액세스 포인트에 대한 Lambda 함수 작성
<a name="olap-writing-lambda"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

이 섹션에서는 Amazon S3 객체 Lambda 액세스 포인트에 사용할 AWS Lambda 함수를 작성하는 방법에 대해 자세히 설명합니다.

일부 S3 객체 Lambda 태스크 절차를 처음부터 끝까지 완전히 알아보려면 다음을 참조하십시오.
+ [자습서: S3 객체 Lambda를 사용하여 애플리케이션의 데이터 변환](tutorial-s3-object-lambda-uppercase.md)
+ [자습서: S3 객체 Lambda 및 Amazon Comprehend를 사용하여 PII 데이터 감지 및 수정](tutorial-s3-object-lambda-redact-pii.md)
+ [Tutorial: Using S3 Object Lambda to dynamically watermark images as they are retrieved(자습서: S3 객체 Lambda를 사용하여 이미지를 검색할 때 동적으로 워터마크 지정](https://aws.amazon.com/getting-started/hands-on/amazon-s3-object-lambda-to-dynamically-watermark-images/?ref=docs_gateway/amazons3/olap-writing-lambda.html)

**Topics**
+ [Lambda에서 `GetObject` 요청 작업](#olap-getobject-response)
+ [Lambda에서 `HeadObject` 요청 작업](#olap-headobject)
+ [Lambda에서 `ListObjects` 요청 작업](#olap-listobjects)
+ [Lambda에서 `ListObjectsV2` 요청 작업](#olap-listobjectsv2)
+ [이벤트 컨텍스트 형식 및 사용법](olap-event-context.md)
+ [Range 및 partNumber 헤더 작업](range-get-olap.md)

## Lambda에서 `GetObject` 요청 작업
<a name="olap-getobject-response"></a>

이 섹션에서는 객체 Lambda 액세스 포인트가 `GetObject`에 대한 Lambda 함수를 호출하도록 구성되어 있다고 가정합니다. S3 객체 Lambda에는 Lambda 함수에서 `GetObject` 호출자에게 사용자 지정된 데이터 및 응답 헤더를 제공할 수 있는 Amazon S3 API 작업인 `WriteGetObjectResponse`가 포함되어 있습니다.

`WriteGetObjectResponse`는 처리 요구 사항에 따라 상태 코드, 응답 헤더 및 응답 본문에 대한 광범위한 제어 기능을 제공합니다. `WriteGetObjectResponse`를 사용하면 변환된 전체 객체, 변환된 객체의 일부 또는 애플리케이션의 컨텍스트에 따라 다른 응답으로 응답할 수 있습니다. 다음 섹션에서는 `WriteGetObjectResponse` API 작업을 사용하는 고유한 예를 보여줍니다.
+ **예시 1:** HTTP 상태 코드 403(금지)으로 응답 
+ **예제 2:** 변환된 이미지로 응답
+ **예제 3:** 압축된 콘텐츠 스트리밍

**예시 1: HTTP 상태 코드 403(금지)으로 응답**

`WriteGetObjectResponse`를 사용하면 객체의 콘텐츠를 기반으로 HTTP 상태 코드 403(금지)으로 응답할 수 있습니다.

------
#### [ Java ]



```
package com.amazon.s3.objectlambda;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.events.S3ObjectLambdaEvent;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.WriteGetObjectResponseRequest;

import java.io.ByteArrayInputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example1 {

    public void handleRequest(S3ObjectLambdaEvent event, Context context) throws Exception {
        S3Client s3Client = S3Client.builder().build();

        // Check to see if the request contains all of the necessary information.
        // If it does not, send a 4XX response and a custom error code and message.
        // Otherwise, retrieve the object from S3 and stream it
        // to the client unchanged.
        var tokenIsNotPresent = !event.getUserRequest().getHeaders().containsKey("requiredToken");
        if (tokenIsNotPresent) {
            s3Client.writeGetObjectResponse(WriteGetObjectResponseRequest.builder()
                    .requestRoute(event.outputRoute())
                    .requestToken(event.outputToken())
                    .statusCode(403)
                    .contentLength(0L)
                    .errorCode("MissingRequiredToken")
                    .errorMessage("The required token was not present in the request.")
                    .build(),
                    RequestBody.fromInputStream(new ByteArrayInputStream(new byte[0]), 0L));
            return;
        }

        // Prepare the presigned URL for use and make the request to S3.
        HttpClient httpClient = HttpClient.newBuilder().build();
        var presignedResponse = httpClient.send(
                HttpRequest.newBuilder(new URI(event.inputS3Url())).GET().build(),
                HttpResponse.BodyHandlers.ofInputStream());

        // Stream the original bytes back to the caller.
        s3Client.writeGetObjectResponse(WriteGetObjectResponseRequest.builder()
                .requestRoute(event.outputRoute())
                .requestToken(event.outputToken())
                .build(),
                RequestBody.fromInputStream(presignedResponse.body(),
                    presignedResponse.headers().firstValueAsLong("content-length").orElse(-1L)));
    }
}
```

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



```
import boto3
import requests 

def handler(event, context):
    s3 = boto3.client('s3')

    """
    Retrieve the operation context object from the event. This object indicates where the WriteGetObjectResponse request
    should be delivered and contains a presigned URL in 'inputS3Url' where we can download the requested object from.
    The 'userRequest' object has information related to the user who made this 'GetObject' request to 
    S3 Object Lambda.
    """
    get_context = event["getObjectContext"]
    user_request_headers = event["userRequest"]["headers"]

    route = get_context["outputRoute"]
    token = get_context["outputToken"]
    s3_url = get_context["inputS3Url"]

    # Check for the presence of a 'CustomHeader' header and deny or allow based on that header.
    is_token_present = "SuperSecretToken" in user_request_headers

    if is_token_present:
        # If the user presented our custom 'SuperSecretToken' header, we send the requested object back to the user.
        response = requests.get(s3_url)
        s3.write_get_object_response(RequestRoute=route, RequestToken=token, Body=response.content)
    else:
        # If the token is not present, we send an error back to the user. 
        s3.write_get_object_response(RequestRoute=route, RequestToken=token, StatusCode=403,
        ErrorCode="NoSuperSecretTokenFound", ErrorMessage="The request was not secret enough.")

    # Gracefully exit the Lambda function.
    return { 'status_code': 200 }
```

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



```
const { S3 } = require('aws-sdk');
const axios = require('axios').default;

exports.handler = async (event) => {
    const s3 = new S3();

    // Retrieve the operation context object from the event. This object indicates where the WriteGetObjectResponse request
    // should be delivered and contains a presigned URL in 'inputS3Url' where we can download the requested object from.
    // The 'userRequest' object has information related to the user who made this 'GetObject' request to S3 Object Lambda.
    const { userRequest, getObjectContext } = event;
    const { outputRoute, outputToken, inputS3Url } = getObjectContext;

    // Check for the presence of a 'CustomHeader' header and deny or allow based on that header.
    const isTokenPresent = Object
        .keys(userRequest.headers)
        .includes("SuperSecretToken");

    if (!isTokenPresent) {
        // If the token is not present, we send an error back to the user. The 'await' in front of the request
        // indicates that we want to wait for this request to finish sending before moving on. 
        await s3.writeGetObjectResponse({
            RequestRoute: outputRoute,
            RequestToken: outputToken,
            StatusCode: 403,
            ErrorCode: "NoSuperSecretTokenFound",
            ErrorMessage: "The request was not secret enough.",
        }).promise();
    } else {
        // If the user presented our custom 'SuperSecretToken' header, we send the requested object back to the user.
        // Again, note the presence of 'await'.
        const presignedResponse = await axios.get(inputS3Url);
        await s3.writeGetObjectResponse({
            RequestRoute: outputRoute,
            RequestToken: outputToken,
            Body: presignedResponse.data,
        }).promise();
    }

    // Gracefully exit the Lambda function.
    return { statusCode: 200 };
}
```

------

**예제 2: 변환된 이미지로 응답**

이미지 변환을 수행할 때는 소스 객체의 전체 바이트가 준비되어야 처리를 시작할 수 있습니다. 이 경우 `WriteGetObjectResponse`는 요청한 애플리케이션에 전체 객체를 한 번의 호출로 반환합니다.

------
#### [ Java ]



```
package com.amazon.s3.objectlambda;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.events.S3ObjectLambdaEvent;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.WriteGetObjectResponseRequest;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.Image;
import java.io.ByteArrayOutputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example2V2 {

    private static final int HEIGHT = 250;
    private static final int WIDTH = 250;

    public void handleRequest(S3ObjectLambdaEvent event, Context context) throws Exception {
        S3Client s3Client = S3Client.builder().build();
        HttpClient httpClient = HttpClient.newBuilder().build();

        // Prepare the presigned URL for use and make the request to S3.
        var presignedResponse = httpClient.send(
                HttpRequest.newBuilder(new URI(event.inputS3Url())).GET().build(),
                HttpResponse.BodyHandlers.ofInputStream());

        // The entire image is loaded into memory here so that we can resize it.
        // Once the resizing is completed, we write the bytes into the body
        // of the WriteGetObjectResponse request.
        var originalImage = ImageIO.read(presignedResponse.body());
        var resizingImage = originalImage.getScaledInstance(WIDTH, HEIGHT, Image.SCALE_DEFAULT);
        var resizedImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        resizedImage.createGraphics().drawImage(resizingImage, 0, 0, WIDTH, HEIGHT, null);

        var baos = new ByteArrayOutputStream();
        ImageIO.write(resizedImage, "png", baos);

        // Stream the bytes back to the caller.
        s3Client.writeGetObjectResponse(WriteGetObjectResponseRequest.builder()
                .requestRoute(event.outputRoute())
                .requestToken(event.outputToken())
                .build(), RequestBody.fromBytes(baos.toByteArray()));
    }
}
```

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



```
import boto3
import requests 
import io
from PIL import Image

def handler(event, context):
    """
    Retrieve the operation context object from the event. This object indicates where the WriteGetObjectResponse request
    should be delivered and has a presigned URL in 'inputS3Url' where we can download the requested object from.
    The 'userRequest' object has information related to the user who made this 'GetObject' request to 
    S3 Object Lambda.
    """
    get_context = event["getObjectContext"]
    route = get_context["outputRoute"]
    token = get_context["outputToken"]
    s3_url = get_context["inputS3Url"]

    """
    In this case, we're resizing .png images that are stored in S3 and are accessible through the presigned URL
    'inputS3Url'.
    """
    image_request = requests.get(s3_url)
    image = Image.open(io.BytesIO(image_request.content))
    image.thumbnail((256,256), Image.ANTIALIAS)

    transformed = io.BytesIO()
    image.save(transformed, "png")

    # Send the resized image back to the client.
    s3 = boto3.client('s3')
    s3.write_get_object_response(Body=transformed.getvalue(), RequestRoute=route, RequestToken=token)

    # Gracefully exit the Lambda function.
    return { 'status_code': 200 }
```

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



```
const { S3 } = require('aws-sdk');
const axios = require('axios').default;
const sharp = require('sharp');

exports.handler = async (event) => {
    const s3 = new S3();

    // Retrieve the operation context object from the event. This object indicates where the WriteGetObjectResponse request
    // should be delivered and has a presigned URL in 'inputS3Url' where we can download the requested object from.
    const { getObjectContext } = event;
    const { outputRoute, outputToken, inputS3Url } = getObjectContext;

    // In this case, we're resizing .png images that are stored in S3 and are accessible through the presigned URL
    // 'inputS3Url'.
    const { data } = await axios.get(inputS3Url, { responseType: 'arraybuffer' });

    // Resize the image.
    const resized = await sharp(data)
        .resize({ width: 256, height: 256 })
        .toBuffer();

    // Send the resized image back to the client.
    await s3.writeGetObjectResponse({
        RequestRoute: outputRoute,
        RequestToken: outputToken,
        Body: resized,
    }).promise();

    // Gracefully exit the Lambda function.
    return { statusCode: 200 };
}
```

------

**예제 3: 압축된 콘텐츠 스트리밍**

객체를 압축할 때 압축된 데이터는 점진적으로 생성됩니다. 따라서 `WriteGetObjectResponse` 요청을 사용하여 압축된 데이터가 준비되는 즉시 압축된 데이터를 반환할 수 있습니다. 이 예제에서 볼 수 있듯이, 완료된 변환의 길이를 알아야 할 필요가 없습니다.

------
#### [ Java ]



```
package com.amazon.s3.objectlambda;

import com.amazonaws.services.lambda.runtime.events.S3ObjectLambdaEvent;
import com.amazonaws.services.lambda.runtime.Context;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.WriteGetObjectResponseRequest;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example3 {

    public void handleRequest(S3ObjectLambdaEvent event, Context context) throws Exception {
        S3Client s3Client = S3Client.builder().build();
        HttpClient httpClient = HttpClient.newBuilder().build();

        // Request the original object from S3.
        var presignedResponse = httpClient.send(
                HttpRequest.newBuilder(new URI(event.inputS3Url())).GET().build(),
                HttpResponse.BodyHandlers.ofInputStream());

        // Consume the incoming response body from the presigned request,
        // apply our transformation on that data, and emit the transformed bytes
        // into the body of the WriteGetObjectResponse request as soon as they're ready.
        // This example compresses the data from S3, but any processing pertinent
        // to your application can be performed here.
        var bodyStream = new GZIPCompressingInputStream(presignedResponse.body());

        // Stream the bytes back to the caller.
        s3Client.writeGetObjectResponse(WriteGetObjectResponseRequest.builder()
                .requestRoute(event.outputRoute())
                .requestToken(event.outputToken())
                .build(),
                RequestBody.fromInputStream(bodyStream,
                    presignedResponse.headers().firstValueAsLong("content-length").orElse(-1L)));
    }
}
```

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



```
import boto3
import requests
import zlib
from botocore.config import Config


"""
A helper class to work with content iterators. Takes an interator and compresses the bytes that come from it. It
implements 'read' and '__iter__' so that the SDK can stream the response. 
"""
class Compress:
    def __init__(self, content_iter):
        self.content = content_iter
        self.compressed_obj = zlib.compressobj()

    def read(self, _size):
        for data in self.__iter__()
            return data

    def __iter__(self):
        while True:
            data = next(self.content)
            chunk = self.compressed_obj.compress(data)
            if not chunk:
                break

            yield chunk

        yield self.compressed_obj.flush()


def handler(event, context):
    """
    Setting the 'payload_signing_enabled' property to False allows us to send a streamed response back to the client.
    in this scenario, a streamed response means that the bytes are not buffered into memory as we're compressing them,
    but instead are sent straight to the user.
    """
    my_config = Config(
        region_name='eu-west-1',
        signature_version='s3v4',
        s3={
            "payload_signing_enabled": False
        }
    )
    s3 = boto3.client('s3', config=my_config)

    """
    Retrieve the operation context object from the event. This object indicates where the WriteGetObjectResponse request
    should be delivered and has a presigned URL in 'inputS3Url' where we can download the requested object from.
    The 'userRequest' object has information related to the user who made this 'GetObject' request to S3 Object Lambda.
    """
    get_context = event["getObjectContext"]
    route = get_context["outputRoute"]
    token = get_context["outputToken"]
    s3_url = get_context["inputS3Url"]

    # Compress the 'get' request stream.
    with requests.get(s3_url, stream=True) as r:
        compressed = Compress(r.iter_content())

        # Send the stream back to the client.
        s3.write_get_object_response(Body=compressed, RequestRoute=route, RequestToken=token, ContentType="text/plain",
                                     ContentEncoding="gzip")

    # Gracefully exit the Lambda function.
    return {'status_code': 200}
```

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



```
const { S3 } = require('aws-sdk');
const axios = require('axios').default;
const zlib = require('zlib');

exports.handler = async (event) => {
    const s3 = new S3();

    // Retrieve the operation context object from the event. This object indicates where the WriteGetObjectResponse request
    // should be delivered and has a presigned URL in 'inputS3Url' where we can download the requested object from.
    const { getObjectContext } = event;
    const { outputRoute, outputToken, inputS3Url } = getObjectContext;

    // Download the object from S3 and process it as a stream, because it might be a huge object and we don't want to
    // buffer it in memory. Note the use of 'await' because we want to wait for 'writeGetObjectResponse' to finish 
    // before we can exit the Lambda function. 
    await axios({
        method: 'GET',
        url: inputS3Url,
        responseType: 'stream',
    }).then(
        // Gzip the stream.
        response => response.data.pipe(zlib.createGzip())
    ).then(
        // Finally send the gzip-ed stream back to the client.
        stream => s3.writeGetObjectResponse({
            RequestRoute: outputRoute,
            RequestToken: outputToken,
            Body: stream,
            ContentType: "text/plain",
            ContentEncoding: "gzip",
        }).promise()
    );

    // Gracefully exit the Lambda function.
    return { statusCode: 200 };
}
```

------

**참고**  
S3 객체 Lambda를 사용할 때는 `WriteGetObjectResponse` 요청을 통해 최대 60초간 호출자에게 전체 응답을 전송할 수 있지만 실제 사용 가능한 시간은 더 적을 수 있습니다. 예를 들어 Lambda 함수 제한 시간이 60초 미만일 수 있습니다. 호출자의 제한 시간이 더 엄격한 경우도 있을 수 있습니다.

원래 호출자가 HTTP 상태 코드500(내부 서버 오류) 외의 응답을 수신하려면 `WriteGetObjectResponse` 호출이 완료되어야 합니다. 예외나 다른 이유로 `WriteGetObjectResponse` API 작업이 호출되기 전에 Lambda 함수가 반환되면 원래 호출자가 500(내부 서버 오류) 응답을 수신합니다. 응답을 완료하는 데 걸리는 시간 동안 예외가 발생하면 호출자가 잘린 응답을 수신하게 됩니다. Lambda 함수가 `WriteGetObjectResponse` API 호출에서 HTTP 상태 코드 200(OK) 응답을 수신하는 경우 원래 호출자의 전체 요청이 전송된 것입니다. Lambda 함수의 응답은 예외가 발생했는지 여부에 관계없이 S3 객체 Lambda에 의해 무시됩니다.

`WriteGetObjectResponse` API 작업을 호출할 때 Amazon S3에는 이벤트 컨텍스트의 라우팅 및 요청 토큰이 필요합니다. 자세한 내용은 [이벤트 컨텍스트 형식 및 사용법](olap-event-context.md) 섹션을 참조하세요.

라우팅 및 요청 토큰 파라미터는 원래 호출자와 `WriteGetObjectResult` 응답을 연결하는 데 필요합니다. 500(내부 서버 오류) 응답이 수신되는 경우 다시 시도하는 것이 항상 적절하지만 요청 토큰은 1회 사용 토큰이기 때문에 이후 사용을 시도할 경우 HTTP 상태 코드 400(잘못된 요청) 응답이 발생할 수 있습니다. 라우팅 및 요청 토큰을 사용한 `WriteGetObjectResponse` 호출을 호출된 Lambda 함수에서 수행할 필요는 없지만 동일한 계정의 자격 증명으로 수행되어야 합니다. 또한 Lambda 함수가 실행을 완료하기 전에 호출이 완료되어야 합니다.

## Lambda에서 `HeadObject` 요청 작업
<a name="olap-headobject"></a>

이 섹션에서는 객체 Lambda 액세스 포인트가 `HeadObject`에 대한 Lambda 함수를 호출하도록 구성되어 있다고 가정합니다. Lambda는 `headObjectContext`라는 키가 포함된 JSON 페이로드를 수신합니다. 컨텍스트 내에는 `HeadObject`의 지원 액세스 지점에 대해 미리 서명된 URL인 `inputS3Url`이라는 하나의 속성이 있습니다.

미리 서명된 URL에는 지정된 경우 다음과 같은 속성이 포함됩니다.
+ `versionId`(쿼리 파라미터에 포함됨)
+ `requestPayer`(`x-amz-request-payer` 헤더에 포함됨)
+ `expectedBucketOwner`(`x-amz-expected-bucket-owner` 헤더에 포함됨)

다른 속성은 미리 서명되지 않으므로 포함되지 않습니다. `userRequest` 헤더에 없는 미리 서명된 URL을 호출할 때 헤더로 전송된 서명되지 않은 옵션을 요청에 수동으로 추가할 수 있습니다. 서버 측 암호화 옵션은 `HeadObject`에 지원되지 않습니다.

요청 구문 URI 파라미터는 Amazon Simple Storage Service API 참조의** [https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html) 섹션을 참조하세요.

다음 예는 `HeadObject`에 대한 Lambda JSON 입력 페이로드를 보여줍니다.

```
{
  "xAmzRequestId": "requestId",
  "**headObjectContext**": {
    "**inputS3Url**": "https://my-s3-ap-111122223333.s3-accesspoint.us-east-1.amazonaws.com/example?X-Amz-Security-Token=<snip>"
  },
  "configuration": {
       "accessPointArn": "arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/example-object-lambda-ap",
       "supportingAccessPointArn": "arn:aws:s3:us-east-1:111122223333:accesspoint/example-ap",
       "payload": "{}"
  },
  "userRequest": {
       "url": "https://object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com/example",
       "headers": {
           "Host": "object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com",
           "Accept-Encoding": "identity",
           "X-Amz-Content-SHA256": "e3b0c44298fc1example"
       }
   },
   "userIdentity": {
       "type": "AssumedRole",
       "principalId": "principalId",
       "arn": "arn:aws:sts::111122223333:assumed-role/Admin/example",       
       "accountId": "111122223333",
       "accessKeyId": "accessKeyId",
       "sessionContext": {
            "attributes": {
            "mfaAuthenticated": "false",
            "creationDate": "Wed Mar 10 23:41:52 UTC 2021"
       },
       "sessionIssuer": {
            "type": "Role",
            "principalId": "principalId",
            "arn": "arn:aws:iam::111122223333:role/Admin",
            "accountId": "111122223333",
            "userName": "Admin"
            }
       }
    },
  "protocolVersion": "1.00"
}
```

Lambda 함수는 `HeadObject` 호출에 대해 반환될 헤더와 값이 포함된 JSON 객체를 반환해야 합니다.

다음 예는 `HeadObject`에 대한 Lambda 응답 JSON의 구조를 보여줍니다.

```
{
    "statusCode": <number>; // Required
    "errorCode": <string>;
    "errorMessage": <string>;
    "headers": {
        "Accept-Ranges": <string>,
        "x-amz-archive-status": <string>,
        "x-amz-server-side-encryption-bucket-key-enabled": <boolean>,
        "Cache-Control": <string>,
        "Content-Disposition": <string>,
        "Content-Encoding": <string>,
        "Content-Language": <string>,
        "Content-Length": <number>, // Required
        "Content-Type": <string>,
        "x-amz-delete-marker": <boolean>,
        "ETag": <string>,
        "Expires": <string>,
        "x-amz-expiration": <string>,
        "Last-Modified": <string>,
        "x-amz-missing-meta": <number>,
        "x-amz-object-lock-mode": <string>,
        "x-amz-object-lock-legal-hold": <string>,
        "x-amz-object-lock-retain-until-date": <string>,
        "x-amz-mp-parts-count": <number>,
        "x-amz-replication-status": <string>,
        "x-amz-request-charged": <string>,
        "x-amz-restore": <string>,
        "x-amz-server-side-encryption": <string>,
        "x-amz-server-side-encryption-customer-algorithm": <string>,
        "x-amz-server-side-encryption-aws-kms-key-id": <string>,
        "x-amz-server-side-encryption-customer-key-MD5": <string>,
        "x-amz-storage-class": <string>,
        "x-amz-tagging-count": <number>,
        "x-amz-version-id": <string>,
        <x-amz-meta-headers>: <string>, // user-defined metadata 
        "x-amz-meta-meta1": <string>, // example of the user-defined metadata header, it will need the x-amz-meta prefix
        "x-amz-meta-meta2": <string>
        ...
    };
}
```

다음 예는 미리 서명된 URL을 사용하여 JSON을 반환하기 전에 필요에 따라 헤더 값을 수정하여 응답을 채우는 방법을 보여줍니다.

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



```
import requests

def lambda_handler(event, context):
    print(event)
    
    # Extract the presigned URL from the input.
    s3_url = event["headObjectContext"]["inputS3Url"]

    # Get the head of the object from S3.     
    response = requests.head(s3_url)
    
    # Return the error to S3 Object Lambda (if applicable).           
    if (response.status_code >= 400):
        return {
            "statusCode": response.status_code,
            "errorCode": "RequestFailure",                         
            "errorMessage": "Request to S3 failed"    
    }
    
    # Store the headers in a dictionary.
    response_headers = dict(response.headers)

    # This obscures Content-Type in a transformation, it is optional to add
    response_headers["Content-Type"] = "" 

    # Return the headers to S3 Object Lambda.     
    return {
        "statusCode": response.status_code,
        "headers": response_headers     
        }
```

------

## Lambda에서 `ListObjects` 요청 작업
<a name="olap-listobjects"></a>

이 섹션에서는 객체 Lambda 액세스 포인트가 `ListObjects`에 대한 Lambda 함수를 호출하도록 구성되어 있다고 가정합니다. Lambda는 `listObjectsContext`라는 새 객체가 포함된 JSON 페이로드를 수신합니다. `listObjectsContext`는 `ListObjects`에 대한 지원 액세스 지점의 미리 서명된 URL인 하나의 속성, `inputS3Url`을 포함합니다.

`GetObject` 및 `HeadObject`와는 달리 미리 서명된 URL에는 지정된 경우 다음과 같은 속성이 포함됩니다.
+ 모든 쿼리 파라미터
+ `requestPayer`(`x-amz-request-payer` 헤더에 포함됨) 
+ `expectedBucketOwner`(`x-amz-expected-bucket-owner` 헤더에 포함됨)

요청 구문 URI 파라미터는 Amazon Simple Storage Service API 참조의** [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html) 섹션을 참조하세요.

**중요**  
애플리케이션을 개발할 때 최신 버전인 [ListObjectsV2](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html)를 사용하는 것이 좋습니다. 이전 버전과의 호환성을 위해 Amazon S3는 `ListObjects`를 계속 지원합니다.

다음 예는 `ListObjects`에 대한 Lambda JSON 입력 페이로드를 보여줍니다.

```
{
    "xAmzRequestId": "requestId",
     "**listObjectsContext**": {
     "**inputS3Url**": "https://my-s3-ap-111122223333.s3-accesspoint.us-east-1.amazonaws.com/?X-Amz-Security-Token=<snip>",
     },
    "configuration": {
        "accessPointArn": "arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/example-object-lambda-ap",
        "supportingAccessPointArn": "arn:aws:s3:us-east-1:111122223333:accesspoint/example-ap",
        "payload": "{}"
    },
    "userRequest": {
        "url": "https://object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com/example",
        "headers": {
            "Host": "object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com",
            "Accept-Encoding": "identity",
            "X-Amz-Content-SHA256": "e3b0c44298fc1example"
        }
    },
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "principalId",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/example",
        "accountId": "111122223333",
        "accessKeyId": "accessKeyId",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "Wed Mar 10 23:41:52 UTC 2021"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "principalId",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin"
            }
        }
    },
  "protocolVersion": "1.00"
}
```

Lambda 함수는 S3 객체 Lambda에서 반환되는 상태 코드, 목록 XML 결과 또는 오류 정보가 포함된 JSON 객체를 반환해야 합니다.

S3 객체 Lambda는 `listResultXml`을 처리하거나 검증하지 않고, 그 대신 `ListObjects` 호출자에게 전달합니다. `listBucketResult`의 경우, 지정된 유형에 따라 특정 속성이 있을 것으로 S3 객체 Lambda가 예상하여 이를 파싱할 수 없는 경우 예외를 발생시킵니다. `listResultXml` 및 `listBucketResult`는 동시에 제공할 수 없습니다.

다음 예는 미리 서명된 URL을 사용하여 Amazon S3를 호출하고 그 결과를 사용하여 오류 검사를 비롯한 응답을 채우는 방법을 보여줍니다.

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

```
import requests 
import xmltodict

def lambda_handler(event, context):
    # Extract the presigned URL from the input.
    s3_url = event["listObjectsContext"]["inputS3Url"]


    # Get the head of the object from Amazon S3.
    response = requests.get(s3_url)

    # Return the error to S3 Object Lambda (if applicable).
    if (response.status_code >= 400):
        error = xmltodict.parse(response.content)
        return {
            "statusCode": response.status_code,
            "errorCode": error["Error"]["Code"],
            "errorMessage": error["Error"]["Message"]
        }

    # Store the XML result in a dict.
    response_dict = xmltodict.parse(response.content)

    # This obscures StorageClass in a transformation, it is optional to add
    for item in response_dict['ListBucketResult']['Contents']:
        item['StorageClass'] = ""

    # Convert back to XML.
    listResultXml = xmltodict.unparse(response_dict)
    
    # Create response with listResultXml.
    response_with_list_result_xml = {
        'statusCode': 200,
        'listResultXml': listResultXml
    }

    # Create response with listBucketResult.
    response_dict['ListBucketResult'] = sanitize_response_dict(response_dict['ListBucketResult'])
    response_with_list_bucket_result = {
        'statusCode': 200,
        'listBucketResult': response_dict['ListBucketResult']
    }

    # Return the list to S3 Object Lambda.
    # Can return response_with_list_result_xml or response_with_list_bucket_result
    return response_with_list_result_xml

# Converting the response_dict's key to correct casing
def sanitize_response_dict(response_dict: dict):
    new_response_dict = dict()
    for key, value in response_dict.items():
        new_key = key[0].lower() + key[1:] if key != "ID" else 'id'
        if type(value) == list:
            newlist = []
            for element in value:
                if type(element) == type(dict()):
                    element = sanitize_response_dict(element)
                newlist.append(element)
            value = newlist
        elif type(value) == dict:
            value = sanitize_response_dict(value)
        new_response_dict[new_key] = value
    return new_response_dict
```

------

다음 예는 `ListObjects`에 대한 Lambda 응답 JSON의 구조를 보여줍니다.

```
{ 
  "statusCode": <number>; // Required
  "errorCode": <string>;
  "errorMessage": <string>;
  "listResultXml": <string>; // This can also be Error XML string in case S3 returned error response when calling the pre-signed URL

  "listBucketResult": {  // listBucketResult can be provided instead of listResultXml, however they can not both be provided in the JSON response  
        "name": <string>,  // Required for 'listBucketResult'
        "prefix": <string>,  
        "marker": <string>, 
        "nextMarker": <string>, 
        "maxKeys": <int>,   // Required for 'listBucketResult'
        "delimiter": <string>, 
        "encodingType": <string>  
        "isTruncated": <boolean>,  // Required for 'listBucketResult'
        "contents": [  { 
            "key": <string>,  // Required for 'content'
            "lastModified": <string>,  
            "eTag": <string>,  
            "checksumAlgorithm": <string>,   // CRC32,  CRC32C,  SHA1,  SHA256
            "size": <int>,   // Required for 'content'
            "owner": {  
                "displayName": <string>,  // Required for 'owner'
                "id": <string>,  // Required for 'owner'
            },  
            "storageClass": <string>  
            },  
        ...  
        ],  
        "commonPrefixes": [  {  
            "prefix": <string>   // Required for 'commonPrefix'
        },  
        ...  
        ],  
    }
}
```

## Lambda에서 `ListObjectsV2` 요청 작업
<a name="olap-listobjectsv2"></a>

이 섹션에서는 객체 Lambda 액세스 포인트가 `ListObjectsV2`에 대한 Lambda 함수를 호출하도록 구성되어 있다고 가정합니다. Lambda는 `listObjectsV2Context`라는 새 객체가 포함된 JSON 페이로드를 수신합니다. `listObjectsV2Context`는 `ListObjectsV2`에 대한 지원 액세스 지점의 미리 서명된 URL인 하나의 속성, `inputS3Url`을 포함합니다.

`GetObject` 및 `HeadObject`와는 달리 미리 서명된 URL에는 지정된 경우 다음과 같은 속성이 포함됩니다.
+ 모든 쿼리 파라미터
+ `requestPayer`(`x-amz-request-payer` 헤더에 포함됨) 
+ `expectedBucketOwner`(`x-amz-expected-bucket-owner` 헤더에 포함됨)

요청 구문 URI 파라미터는 Amazon Simple Storage Service API 참조의** [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) 섹션을 참조하십시오.

다음 예는 `ListObjectsV2`에 대한 Lambda JSON 입력 페이로드를 보여줍니다.

```
{
    "xAmzRequestId": "requestId",
     "**listObjectsV2Context**": {
     "**inputS3Url**": "https://my-s3-ap-111122223333.s3-accesspoint.us-east-1.amazonaws.com/?list-type=2&X-Amz-Security-Token=<snip>",
     },
    "configuration": {
        "accessPointArn": "arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/example-object-lambda-ap",
        "supportingAccessPointArn": "arn:aws:s3:us-east-1:111122223333:accesspoint/example-ap",
        "payload": "{}"
    },
    "userRequest": {
        "url": "https://object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com/example",
        "headers": {
            "Host": "object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com",
            "Accept-Encoding": "identity",
            "X-Amz-Content-SHA256": "e3b0c44298fc1example"
        }
    },
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "principalId",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/example",
        "accountId": "111122223333",
        "accessKeyId": "accessKeyId",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "Wed Mar 10 23:41:52 UTC 2021"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "principalId",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin"
            }
        }
    },
  "protocolVersion": "1.00" 
}
```

Lambda 함수는 S3 객체 Lambda에서 반환되는 상태 코드, 목록 XML 결과 또는 오류 정보가 포함된 JSON 객체를 반환해야 합니다.

S3 객체 Lambda는 `listResultXml`을 처리하거나 검증하지 않고, 그 대신 `ListObjectsV2` 호출자에게 전달합니다. `listBucketResult`의 경우, 지정된 유형에 따라 특정 속성이 있을 것으로 S3 객체 Lambda가 예상하여 이를 파싱할 수 없는 경우 예외를 발생시킵니다. `listResultXml` 및 `listBucketResult`는 동시에 제공할 수 없습니다.

다음 예는 미리 서명된 URL을 사용하여 Amazon S3를 호출하고 그 결과를 사용하여 오류 검사를 비롯한 응답을 채우는 방법을 보여줍니다.

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

```
import requests 
import xmltodict

def lambda_handler(event, context):
    # Extract the presigned URL from the input.
    s3_url = event["listObjectsV2Context"]["inputS3Url"]


    # Get the head of the object from Amazon S3.
    response = requests.get(s3_url)

    # Return the error to S3 Object Lambda (if applicable).
    if (response.status_code >= 400):
        error = xmltodict.parse(response.content)
        return {
            "statusCode": response.status_code,
            "errorCode": error["Error"]["Code"],
            "errorMessage": error["Error"]["Message"]
        }

    # Store the XML result in a dict.
    response_dict = xmltodict.parse(response.content)

    # This obscures StorageClass in a transformation, it is optional to add
    for item in response_dict['ListBucketResult']['Contents']:
        item['StorageClass'] = ""

    # Convert back to XML.
    listResultXml = xmltodict.unparse(response_dict)
    
    # Create response with listResultXml.
    response_with_list_result_xml = {
        'statusCode': 200,
        'listResultXml': listResultXml
    }

    # Create response with listBucketResult.
    response_dict['ListBucketResult'] = sanitize_response_dict(response_dict['ListBucketResult'])
    response_with_list_bucket_result = {
        'statusCode': 200,
        'listBucketResult': response_dict['ListBucketResult']
    }

    # Return the list to S3 Object Lambda.
    # Can return response_with_list_result_xml or response_with_list_bucket_result
    return response_with_list_result_xml

# Converting the response_dict's key to correct casing
def sanitize_response_dict(response_dict: dict):
    new_response_dict = dict()
    for key, value in response_dict.items():
        new_key = key[0].lower() + key[1:] if key != "ID" else 'id'
        if type(value) == list:
            newlist = []
            for element in value:
                if type(element) == type(dict()):
                    element = sanitize_response_dict(element)
                newlist.append(element)
            value = newlist
        elif type(value) == dict:
            value = sanitize_response_dict(value)
        new_response_dict[new_key] = value
    return new_response_dict
```

------

다음 예는 `ListObjectsV2`에 대한 Lambda 응답 JSON의 구조를 보여줍니다.

```
{  
    "statusCode": <number>; // Required  
    "errorCode": <string>;  
    "errorMessage": <string>;  
    "listResultXml": <string>; // This can also be Error XML string in case S3 returned error response when calling the pre-signed URL  
  
    "listBucketResult": {  // listBucketResult can be provided instead of listResultXml, however they can not both be provided in the JSON response 
        "name": <string>, // Required for 'listBucketResult'  
        "prefix": <string>,  
        "startAfter": <string>,  
        "continuationToken": <string>,  
        "nextContinuationToken": <string>,
        "keyCount": <int>, // Required for 'listBucketResult'  
        "maxKeys": <int>, // Required for 'listBucketResult'  
        "delimiter": <string>,  
        "encodingType": <string>  
        "isTruncated": <boolean>, // Required for 'listBucketResult'  
        "contents": [ {  
            "key": <string>, // Required for 'content'  
            "lastModified": <string>,  
            "eTag": <string>,  
            "checksumAlgorithm": <string>, // CRC32, CRC32C, SHA1, SHA256  
            "size": <int>, // Required for 'content'  
            "owner": {  
                "displayName": <string>, // Required for 'owner'  
                "id": <string>, // Required for 'owner'  
            },  
            "storageClass": <string>  
            },  
            ...  
        ],  
        "commonPrefixes": [ {  
            "prefix": <string> // Required for 'commonPrefix'  
            },  
        ...  
        ],  
    }  
}
```

# 이벤트 컨텍스트 형식 및 사용법
<a name="olap-event-context"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

Amazon S3 객체 Lambda는 AWS Lambda 함수에 전달된 이벤트에서 수행되는 요청에 대한 컨텍스트를 제공합니다. 다음 그림에서는 요청 예시를 보여줍니다. 필드에 대한 설명은 예시 뒤에 포함되어 있습니다.

```
{
    "xAmzRequestId": "requestId",
    "getObjectContext": {
        "inputS3Url": "https://my-s3-ap-111122223333.s3-accesspoint.us-east-1.amazonaws.com/example?X-Amz-Security-Token=<snip>",
        "outputRoute": "io-use1-001",
        "outputToken": "OutputToken"
    },
    "configuration": {
        "accessPointArn": "arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/example-object-lambda-ap",
        "supportingAccessPointArn": "arn:aws:s3:us-east-1:111122223333:accesspoint/example-ap",
        "payload": "{}"
    },
    "userRequest": {
        "url": "https://object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com/example",
        "headers": {
            "Host": "object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com",
            "Accept-Encoding": "identity",
            "X-Amz-Content-SHA256": "e3b0c44298fc1example"
        }
    },
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "principalId",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/example",
        "accountId": "111122223333",
        "accessKeyId": "accessKeyId",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "Wed Mar 10 23:41:52 UTC 2021"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "principalId",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin"
            }
        }
    },
    "protocolVersion": "1.00"
}
```

요청에는 다음 필드가 포함됩니다.
+ `xAmzRequestId` – 이 요청에 대한 Amazon S3 요청 ID입니다. 디버깅에 도움이 되도록 이 값을 기록하는 것이 좋습니다.
+ `getObjectContext` – Amazon S3 및 S3 객체 Lambda 연결에 대한 입력 및 출력 세부 정보입니다.
  + `inputS3Url` – Amazon S3에서 원본 객체를 가져오는 데 사용할 수 있는 미리 서명된 URL입니다. URL은 원래 호출자의 ID를 사용하여 서명되며 URL이 사용될 때 해당 사용자의 권한이 적용됩니다. URL에 서명된 헤더가 있는 경우 Lambda 함수가 Amazon S3에 대한 호출에 이러한 헤더를 포함해야 합니다(`Host` 헤더 제외).
  + `outputRoute` - Lambda 함수에서 를 호출할 때 S3 객체 Lambda URL에 추가되는 라우팅 토큰입니다.`WriteGetObjectResponse`
  + `outputToken` – S3 객체 Lambda에서 원래 호출자와 일치하는 `WriteGetObjectResponse` 호출을 찾을 때 사용되는 불투명 토큰입니다.
+ `configuration` – 객체 Lambda 액세스 포인트에 대한 구성 정보입니다.
  + `accessPointArn` – 이 요청을 수신한 객체 Lambda 액세스 포인트의 Amazon 리소스 이름(ARN)입니다.
  + `supportingAccessPointArn` – 객체 Lambda 액세스 포인트 구성에 지정된 지원 액세스 포인트의 ARN입니다.
  + `payload` – 객체 Lambda 액세스 포인트 구성에 적용되는 사용자 지정 데이터입니다. S3 객체 Lambda는 이 데이터를 불투명 한 문자열로 취급하므로 사용하기 전에 데이터를 디코딩해야 할 수도 있습니다.
+ `userRequest` – S3 객체 Lambda에 대한 원래 호출에 대한 정보입니다.
  + `url` – 권한 부여 관련 쿼리 파라미터를 제외하고 S3 객체 Lambda에서 수신한 요청의 디코딩된 URL입니다.
  + `headers` – 권한 부여 관련 헤더를 제외하고 원래 호출의 HTTP 헤더와 해당 값을 포함하는 문자열에 대한 문자열 맵입니다. 동일한 헤더가 여러 번 나타나는 경우 동일한 헤더를 갖는 각 인스턴스의 값은 쉼표로 구분된 목록으로 결합됩니다. 이 맵에는 원래 헤더의 대/소문자가 유지됩니다.
+ `userIdentity` – S3 객체 Lambda를 호출한 ID에 대한 세부 정보입니다. 자세한 내용은 *AWS CloudTrail 사용 설명서*의 [추적을 위해 데이터 이벤트 로깅](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html)을 참조하세요.
  + `type` – 자격 증명의 유형입니다.
  + `accountId` – 자격 증명이 속한 AWS 계정 계정입니다.
  + `userName` – 호출을 수행한 자격 증명의 표시 이름입니다.
  + `principalId` – 호출을 수행한 자격 증명에 대한 고유 식별자입니다.
  + `arn` – 호출을 수행한 보안 주체의 ARN입니다. ARN의 마지막 섹션에는 호출을 수행한 사용자 또는 역할이 포함됩니다.
  + `sessionContext` – 임시 보안 자격 증명으로 요청이 이루어진 경우 이 요소는 해당 자격 증명을 위해 생성된 세션에 관한 정보를 제공합니다.
  + `invokedBy` – 요청을 수행한 AWS 서비스의 이름입니다(예: Amazon EC2 Auto Scaling 또는 AWS Elastic Beanstalk).
  + `sessionIssuer` – 임시 보안 자격 증명으로 요청이 이루어진 경우 이 요소는 자격 증명을 획득하는 방법에 관한 정보를 제공합니다.
+ `protocolVersion` – 제공된 컨텍스트의 버전 ID입니다. 이 필드의 형식은 `{Major Version}.{Minor Version}`입니다. 마이너 버전 번호는 항상 2자리 숫자입니다. 필드의 의미 체계를 제거하거나 변경하면 메이저 버전 범프가 필요하며 활성 옵트인이 요구됩니다. Amazon S3는 언제든지 새 필드를 추가할 수 있으며, 이 시점에서 마이너 버전 범프가 발생할 수 있습니다. 소프트웨어 롤아웃의 특성으로 인해 한 번에 여러 개의 마이너 버전이 표시될 수 있습니다.

# Range 및 partNumber 헤더 작업
<a name="range-get-olap"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

Amazon S3 객체 Lambda에서 대용량 객체로 작업하는 경우 `Range` HTTP 헤더를 사용하면 객체에서 지정된 바이트 범위를 다운로드할 수 있습니다. 동일한 객체 내에서 서로 다른 바이트 범위를 가져오려면 Amazon S3에 대한 동시 연결을 사용하면 됩니다. 객체에서 지정된 부분에 대해 범위가 지정된 요청을 수행하는 `partNumber` 파라미터(1\$110,000 사이의 정수)를 지정할 수도 있습니다.

`Range` 또는 `partNumber` 파라미터를 포함하는 요청을 처리할 수 있는 여러 방법이 있기 때문에 S3 객체 Lambda는 이러한 파라미터를 변환된 객체에 적용하지 않습니다. 대신 AWS Lambda 함수가 애플리케이션에 필요한 경우 이 기능을 구현해야 합니다.

`Range` 및 `partNumber` 파라미터를 S3 객체 Lambda와 함께 사용하려면 다음을 수행하십시오.
+ 객체 Lambda 액세스 포인트 구성에서 이러한 파라미터를 활성화합니다.
+ 이러한 파라미터를 포함하는 요청을 처리할 수 있는 Lambda 함수를 작성합니다.

다음 단계에서 이 작업을 수행하는 방법을 설명합니다.

## 1단계: 객체 Lambda 액세스 포인트 구성
<a name="range-get-olap-step-1"></a>

기본적으로 객체 Lambda 액세스 포인트는 헤더 또는 쿼리 파라미터에 `Range` 또는 `partNumber` 파라미터가 포함되는 모든 `GetObject` 또는 `HeadObject` 요청에 HTTP 상태 코드 501(구현되지 않음) 오류로 응답합니다.

객체 Lambda 액세스 포인트가 이러한 요청을 수락하도록 설정하려면 객체 Lambda 액세스 포인트 구성의 `AllowedFeatures` 섹션에 `GetObject-Range`, `GetObject-PartNumber`, `HeadObject-Range` 또는 `HeadObject-PartNumber`를 포함해야 합니다. 객체 Lambda 액세스 포인트 구성 업데이트에 대한 자세한 내용은 [객체 Lambda 액세스 포인트 생성](olap-create.md) 섹션을 참조하십시오.

## 2단계: Lambda 함수에서 `Range` 또는 `partNumber` 처리 구현
<a name="range-get-olap-step-2"></a>

객체 Lambda 액세스 포인트가 범위가 지정된 `GetObject` 또는 `HeadObject` 요청을 사용하여 Lambda 함수를 호출할 경우 `Range` 또는 `partNumber` 파라미터가 이벤트 컨텍스트에 포함됩니다. 다음 테이블에 설명된 대로 이벤트 컨텍스트에서 파라미터의 위치는 객체 Lambda 액세스 포인트에 대한 원래 요청에서 어떤 파라미터가 사용되었는지와 파라미터가 포함된 방식에 따라 달라집니다.


| 파라미터 | 이벤트 컨텍스트 위치 | 
| --- | --- | 
|  `Range`(헤더)  |  `userRequest.headers.Range`  | 
|  `Range`(쿼리 파라미터)  |  `userRequest.url`(쿼리 파라미터 `Range`)  | 
|  `partNumber`  |  `userRequest.url`(쿼리 파라미터 `partNumber`)  | 

**중요**  
객체 Lambda 액세스 포인트에 제공된 미리 서명된 URL에는 원래 요청의 `Range` 또는`partNumber` 파라미터가 포함되어 있지 않습니다. AWS Lambda 함수에서 이러한 파라미터를 처리하는 방법은 다음 옵션을 참조하세요.

`Range` 또는 `partNumber` 값을 추출한 후 애플리케이션의 요구 사항에 따라 다음 방법 중 하나를 사용할 수 있습니다.

1. **요청된 `Range` 또는 `partNumber`를 변환된 객체에 매핑합니다(권장).**

   `Range` 또는 `partNumber` 요청을 처리하는 가장 신뢰할 수 있는 방법은 다음을 수행하는 것입니다.
   + Amazon S3에서 전체 객체를 검색합니다.
   + 객체를 변환합니다.
   + 요청된 `Range` 또는 `partNumber` 파라미터를 변환된 객체에 적용합니다.

   이 작업을 수행하려면 제공된 미리 서명된 URL을 사용하여 Amazon S3에서 전체 객체를 가져온 다음 필요에 따라 객체를 처리합니다. 이 방식으로 `Range` 파라미터를 처리하는 Lambda 함수의 예제에 대해서는 AWS 샘플 GitHub 리포지토리의 [이 샘플](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration/blob/main/function/nodejs_20_x/src/response/range_mapper.ts)을 참조하십시오.

1. **요청된 `Range`를 미리 서명된 URL에 매핑합니다.**

   경우에 따라 Lambda 함수가 요청된 `Range`를 미리 서명된 URL에 직접 매핑하여 Amazon S3에서 객체의 일부만 검색할 수 있습니다. 이 접근 방식은 변환이 다음 두 기준을 모두 충족하는 경우에만 적합합니다.

   1. 변환 함수를 부분 객체 범위에 적용할 수 있습니다.

   1. 변환 함수 앞 또는 뒤에 `Range` 파라미터를 사용하면 동일한 변환된 객체가 생성됩니다.

   예를 들어 ASCII로 인코딩된 객체의 모든 문자를 대문자로 변환하는 변환 함수는 이전 두 조건을 모두 충족합니다. 변환을 객체의 일부에 적용할 수 있고 `Range` 파라미터를 변환 전에 적용하는 것과 파라미터를 변환 후에 적용하는 것이 동일한 결과를 얻습니다.

   이와 달리 ASCII로 인코딩된 객체의 문자 순서를 반대로 바꾸는 함수는 이러한 조건을 충족하지 못합니다. 이러한 함수는 부분 객체 범위에 적용할 수 있기 때문에 조건 1을 충족합니다. 그러나 `Range` 파라미터를 변환 전에 적용하는 것과 파라미터를 변환 후에 적용하는 것이 서로 다른 결과를 얻기 때문에 조건 2를 충족하지 못합니다.

   콘텐츠가 `abcdefg`인 객체의 처음 세 문자에 함수를 적용하는 요청을 가정합니다. `Range` 파라미터를 변환 전에 적용하면 `abc`만 가져오며 다음에 데이터의 순서를 반대로 바꾸면 `cba`를 반환합니다. 그러나 파라미터를 변환 후에 적용하면 함수가 전체 객체를 가져온 다음 데이터의 순서를 바꾸고 `Range` 파라미터를 적용하여 `gfe`를 반환합니다. 두 결과가 다르기 때문에 이 함수는 Amazon S3에서 객체를 가져올 때 `Range` 파라미터를 적용해서는 안 됩니다. 따라서 이 함수는 전체 객체를 가져와 변환을 수행한 다음 `Range` 파라미터를 적용해야만 합니다.
**주의**  
많은 경우에 `Range` 파라미터를 미리 서명된 URL에 적용하면 Lambda 함수 또는 요청을 하는 클라이언트에서 예기치 않은 동작이 발생합니다. Amazon S3에서 부분 객체만 가져올 때 애플리케이션이 제대로 작동한다는 확신이 없는 경우 앞서 방법 A에서 설명한 대로 전체 객체를 가져오고 변환하는 것이 좋습니다.

   애플리케이션이 B 방법에서 설명한 조건을 충족하는 경우 요청된 객체 범위만 가져온 다음 해당 범위에서 변환을 실행하여 AWS Lambda 함수를 간소화할 수 있습니다.

   다음 Java 코드 예시는 다음 작업을 실행하는 방법을 설명한 것입니다.
   + `GetObject` 요청에서 `Range` 헤더를 검색합니다.
   + `Range` 헤더를 Lambda가 Amazon S3에서 요청된 범위를 가져오는 데 사용할 수 있는 미리 서명된 URL에 추가합니다.

   ```
   private HttpRequest.Builder applyRangeHeader(ObjectLambdaEvent event, HttpRequest.Builder presignedRequest) {
       var header = event.getUserRequest().getHeaders().entrySet().stream()
               .filter(e -> e.getKey().toLowerCase(Locale.ROOT).equals("range"))
               .findFirst();
   
       // Add check in the query string itself.
       header.ifPresent(entry -> presignedRequest.header(entry.getKey(), entry.getValue()));
       return presignedRequest;
   }
   ```

# AWS 빌드 Lambda 함수 사용
<a name="olap-examples"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

AWS는 Amazon S3 객체 Lambda와 함께 사용하여 개인 식별 정보(PII)를 검색 후 교정하고 S3 객체의 압축을 풀 수 있는 미리 빌드된 AWS Lambda 함수를 제공합니다. 이러한 Lambda 함수는 AWS Serverless Application Repository에서 사용할 수 있습니다. 객체 Lambda 액세스 포인트를 생성할 때 AWS Management Console을 통해 이러한 함수를 선택할 수 있습니다.

AWS Serverless Application Repository에서 서버리스 애플리케이션을 배포하는 방법에 대한 자세한 내용은 AWS Serverless Application Repository 개발자 안내서**에서 [애플리케이션 배포](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/serverlessrepo-consuming-applications.html)를 참조하십시오.

**참고**  
다음 예시는 `GetObject` 요청에만 사용할 수 있습니다.

## 예시 1: PII 액세스 제어
<a name="olap-examples-1"></a>

이 Lambda 함수는 기계 학습을 사용하는 자연어 처리(NLP) 서비스인 Amazon Comprehend를 사용하여 텍스트에서 인사이트와 관계를 찾습니다. 이 함수는 Amazon S3 버킷의 문서에 있는 이름, 주소, 날짜, 신용 카드 번호, 주민등록번호와 같은 개인 식별 정보(PII)를 자동으로 교정합니다. 버킷에 PII가 포함된 문서가 있는 경우 이러한 PII 엔터티 유형을 감지하고 권한이 없는 사용자에 대한 액세스를 제한하는 PII 액세스 제어 함수를 구성할 수 있습니다.

시작하려면 계정에 다음 Lambda 함수를 배포하고 객체 Lambda 액세스 포인트 구성에 함수의 Amazon 리소스 이름(ARN)을 추가하면 됩니다.

다음은 이 함수의 ARN 예시입니다.

```
arn:aws:serverlessrepo:us-east-1:111122223333:applications/ComprehendPiiAccessControlS3ObjectLambda
```

다음 AWS Serverless Application Repository 링크를 사용하여 AWS Management Console에서 이 함수를 추가하거나 볼 수 있습니다. [ComprehendPiiAccessControlS3ObjectLambda](https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:839782855223:applications/ComprehendPiiAccessControlS3ObjectLambda)

GitHub에서 이 함수를 보려면 [Amazon Comprehend S3 객체 Lambda에 관한 문서](https://github.com/aws-samples/amazon-comprehend-s3-object-lambdas)를 참조하세요.

## 예시 2: PII 교정
<a name="olap-examples-2"></a>

이 Lambda 함수는 기계 학습을 사용하는 자연어 처리(NLP) 서비스인 Amazon Comprehend를 사용하여 텍스트에서 인사이트와 관계를 찾습니다. 이 함수는 Amazon S3 버킷의 문서에서 이름, 주소, 날짜, 신용 카드 번호, 주민등록번호와 같은 개인 식별 정보(PII)를 자동으로 교정합니다.

버킷에 신용 카드 번호 또는 은행 계좌 정보와 같은 정보가 포함된 문서가 있는 경우 PII를 감지한 다음 PII 엔터티 유형이 교정되는 문서의 복사본을 반환하는 PII 교정 S3 객체 Lambda 함수를 구성할 수 있습니다.

시작하려면 계정에 다음 Lambda 함수를 배포하고 객체 Lambda 액세스 포인트 구성에 함수의 ARN을 추가하면 됩니다.

다음은 이 함수의 ARN 예시입니다.

```
arn:aws:serverlessrepo:us-east-1:111122223333::applications/ComprehendPiiRedactionS3ObjectLambda
```

다음 AWS Serverless Application Repository 링크를 사용하여 AWS Management Console에서 이 함수를 추가하거나 볼 수 있습니다. [ComprehendPiiRedactionS3ObjectLambda](https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:839782855223:applications/ComprehendPiiRedactionS3ObjectLambda)

GitHub에서 이 함수를 보려면 [Amazon Comprehend S3 객체 Lambda에 관한 문서](https://github.com/aws-samples/amazon-comprehend-s3-object-lambdas)를 참조하십시오.

PII 교정에서의 일부 S3 객체 Lambda 태스크 절차를 처음부터 끝까지 완전히 알아보려면 [자습서: S3 객체 Lambda 및 Amazon Comprehend를 사용하여 PII 데이터 감지 및 수정](tutorial-s3-object-lambda-redact-pii.md) 페이지를 참조하십시오.

## 예제 3: 압축 풀기
<a name="olap-examples-3"></a>

`S3ObjectLambdaDecompression` Lambda 함수는 6가지 압축 파일 형식(`bzip2`, `gzip`, `snappy`, `zlib`, `zstandard`, `ZIP`) 중 하나로 Amazon S3에 저장되는 객체의 압축을 풀 수 있습니다.

시작하려면 계정에 다음 Lambda 함수를 배포하고 객체 Lambda 액세스 포인트 구성에 함수의 ARN을 추가하면 됩니다.

다음은 이 함수의 ARN 예시입니다.

```
arn:aws:serverlessrepo:us-east-1:111122223333::applications/S3ObjectLambdaDecompression
```

다음 AWS Serverless Application Repository 링크를 사용하여 AWS Management Console에서 이 함수를 추가하거나 볼 수 있습니다. [S3ObjectLambdaDecompression](https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/create/app?applicationId=arn:aws:serverlessrepo:eu-west-1:123065155563:applications/S3ObjectLambdaDecompression)

GitHub에서 이 함수를 보려면 [S3 Object Lambda Decompression](https://github.com/aws-samples/amazon-s3-object-lambda-decompression)을 참조하십시오.

# S3 객체 Lambda에 대한 모범 사례 및 지침
<a name="olap-best-practices"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

S3 객체 Lambda를 사용하는 경우 다음 모범 사례 및 지침에 따라 작업 및 성능을 최적화하십시오.

**Topics**
+ [S3 객체 Lambda 작업](#olap-working-with)
+ [S3 객체 Lambda와 관련하여 사용되는 AWS 서비스](#olap-services)
+ [`Range` 및 `partNumber` 헤더](#olap-managing-range-part)
+ [`expiry-date` 변환](#olap-console-download)
+ [AWS CLI 및 AWS SDK 작업](#olap-cli-sdk)

## S3 객체 Lambda 작업
<a name="olap-working-with"></a>

S3 객체 Lambda는 `GET`, `LIST`, `HEAD` 요청 처리만 지원합니다. 다른 요청은 AWS Lambda을 반환하지 않고 변환되지 않은 표준 API 응답을 반환합니다. AWS 계정에 대해 리전당 최대 1,000개의 객체 Lambda 액세스 포인트를 생성할 수 있습니다. 사용하는 AWS Lambda 함수는 객체 Lambda 액세스 포인트와 동일한 AWS 계정 및 리전에 있어야 합니다.

S3 객체 Lambda는 최대 60초 동안 호출자에게 전체 응답을 스트리밍할 수 있습니다. 함수에는 AWS Lambda 기본 할당량도 적용됩니다. 자세한 내용은 *AWS Lambda 개발자 안내서*에서 [Lambda 할당량](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)을 참조하십시오.

S3 객체 Lambda가 지정된 Lambda 함수를 호출할 때 지정된 Lambda 함수 또는 애플리케이션에 의해 Amazon S3에서 덮어쓰거나 삭제되는 데이터가 의도된 것이고 올바른지 확인할 책임은 사용자에게 있습니다.

S3 객체 Lambda는 객체에 대한 작업을 수행하는 데만 사용할 수 있습니다. S3 객체 Lambda를 사용하여 버킷 수정 또는 삭제와 같은 다른 Amazon S3 작업을 수행할 수 없습니다. 액세스 포인트를 지원하는 전체 S3 작업 목록은 [S3 작업과의 액세스 포인트 호환성](access-points-service-api-support.md#access-points-operations-support) 섹션을 참조하세요.

이 목록 외에도 Object Lambda 액세스 포인트는 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html), [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)(소스) 및 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_SelectObjectContent.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_SelectObjectContent.html) API 작업을 지원하지 않습니다.

## S3 객체 Lambda와 관련하여 사용되는 AWS 서비스
<a name="olap-services"></a>

S3 객체 Lambda는 Amazon S3, AWS Lambda, 선택적으로 원하는 다른 AWS 서비스를 연결하여 요청 애플리케이션과 관련된 객체를 전달합니다. S3 객체 Lambda와 함께 사용되는 모든 AWS 서비스는 각 서비스 수준에 관한 계약(SLA)에 따라 규제됩니다. 예를 들어, 한 AWS 서비스가 서비스 약정을 충족하지 못하는 경우 해당 서비스의 SLA에 명시된 서비스 크레딧을 받을 수 있습니다.

## `Range` 및 `partNumber` 헤더
<a name="olap-managing-range-part"></a>

대용량 객체로 작업하는 경우 `Range` HTTP 헤더를 사용하면 객체에서 지정된 바이트 범위를 다운로드할 수 있습니다. `Range` 헤더를 사용하는 경우 요청은 객체의 지정된 부분만 가져옵니다. `partNumber` 헤더를 사용하여 객체에서 지정된 부분에 대해 범위가 지정된 요청을 수행할 수도 있습니다.

자세한 내용은 [Range 및 partNumber 헤더 작업](range-get-olap.md) 섹션을 참조하세요.

## `expiry-date` 변환
<a name="olap-console-download"></a>

AWS Management Console의 객체 Lambda 액세스 포인트에서 변환된 객체를 열거나 다운로드할 수 있습니다. 이러한 객체는 만료되지 않은 상태여야 합니다. Lambda 함수가 객체의 `expiry-date`를 변환하는 경우 열거나 다운로드할 수 없는 만료된 객체를 볼 수 있습니다. 이 동작은 S3 Glacier Deep Retrieval 및 S3 Glacier Deep Archive 복원된 객체에만 적용됩니다.

## AWS CLI 및 AWS SDK 작업
<a name="olap-cli-sdk"></a>

AWS Command Line Interface(AWS CLI) S3 하위 명령(`cp`, `mv`, `sync`) 및 AWS SDK for Java `TransferManager` 클래스 사용은 S3 객체 Lambda와 함께 사용할 수 없습니다.

# S3 객체 Lambda 자습서
<a name="olap-tutorials"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

다음 자습서에서는 일부 S3 객체 Lambda 태스크를 처음부터 끝까지 수행하는 절차를 보여줍니다.

S3 객체 Lambda를 사용하여 자체 코드를 추가하여 S3에서 검색한 데이터를 애플리케이션으로 반환하기 전에 처리할 수 있습니다. 다음 자습서를 통해 기존 객체를 변경하거나 여러 데이터 사본을 유지하지 않고도 Amazon S3에서 데이터를 검색할 때 데이터를 수정할 수 있습니다. 첫 번째 자습서에서는 S3에서 검색된 객체를 수정하기 위해 S3 GET 요청에 AWS Lambda 함수를 추가하는 방법을 안내합니다. 두 번째 자습서에서는 애플리케이션으로 반환하기 전에 Amazon Comprehend에서 제공하는 사전 빌드된 Lambda 함수를 사용하여 S3에서 검색된 개인 식별 정보(PII)를 보호하는 방법을 보여줍니다. 세 번째 자습서에서는 Amazon S3에서 이미지를 검색할 때 S3 Object Lambda를 사용하여 이미지에 워터마크를 추가합니다.
+ [자습서: S3 객체 Lambda를 사용하여 애플리케이션의 데이터 변환](tutorial-s3-object-lambda-uppercase.md)
+ [자습서: S3 객체 Lambda 및 Amazon Comprehend를 사용하여 PII 데이터 감지 및 수정](tutorial-s3-object-lambda-redact-pii.md)
+ [Tutorial: Using S3 Object Lambda to dynamically watermark images as they are retrieved(자습서: S3 객체 Lambda를 사용하여 이미지를 검색할 때 동적으로 워터마크 지정](https://aws.amazon.com/getting-started/hands-on/amazon-s3-object-lambda-to-dynamically-watermark-images/?ref=docs_gateway/amazons3/olap-tutorials.html)

# 자습서: S3 객체 Lambda를 사용하여 애플리케이션의 데이터 변환
<a name="tutorial-s3-object-lambda-uppercase"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

데이터를 Amazon S3 저장하면 여러 애플리케이션에서 사용하기 위해 데이터를 쉽게 공유할 수 있습니다. 그러나 각 애플리케이션에는 고유한 데이터 형식 요구 사항이 있을 수 있으며 특정 사용 사례에 따라 데이터를 수정하거나 처리해야 할 수 있습니다. 예를 들어 전자 상거래 애플리케이션에서 생성한 데이터 집합에는 개인 식별 정보(PII)가 포함될 수 있습니다. 분석을 위해 동일한 데이터가 처리되는 경우 이 PII가 필요하지 않으므로 수정해야 합니다. 그러나 마케팅 캠페인에 동일한 데이터 집합이 사용되는 경우 고객 충성도 데이터베이스의 정보와 같은 추가 세부 정보로 데이터를 보강해야 할 수 있습니다.

[S3 객체 Lambda](https://aws.amazon.com/s3/features/object-lambda)를 사용하여 자체 코드를 추가하여 S3에서 검색한 데이터를 애플리케이션으로 반환하기 전에 처리할 수 있습니다. 특히, AWS Lambda 함수를 구성하여 S3 객체 Lambda 액세스 포인트에 연결할 수 있습니다. 애플리케이션에서 S3 Object Lambda 액세스 포인트를 통해 [표준 S3 GET 요청](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)을 전송하면 지정된 Lambda 함수가 간접 호출되어 지원 S3 액세스 포인트를 통해 기본 데이터 소스에서 검색된 데이터를 처리합니다. 그런 다음 S3 객체 Lambda 액세스 포인트가 변환된 결과를 애플리케이션에 다시 반환합니다. 애플리케이션을 변경할 필요 없이 S3 객체 Lambda 데이터 변환을 특정 사용 사례에 맞게 조정하여 자체 사용자 지정 Lambda 함수를 작성 및 실행할 수 있습니다.

![\[이 다이어그램은 S3 객체 Lambda 워크플로 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/ol-example-image-global.png)


**목표**  
이 자습서에서는 표준 S3 GET 요청에 사용자 지정 코드를 추가하여, 요청하는 클라이언트 또는 애플리케이션의 요구 사항에 맞게 S3에서 검색된 요청된 객체를 수정하는 방법에 대해 알아봅니다. 특히 S3 버킷에 저장된 원본 객체의 모든 텍스트를 S3 Object Lambda를 통해 대문자로 변환하는 방법에 대해 알아봅니다.

**참고**  
이 튜토리얼에서는 Python 코드를 사용하여 데이터를 변환합니다. 다른 AWS SDK를 사용하는 예는 AWS SDK 코드 예제 라이브러리의 [S3 객체 Lambda를 사용하여 애플리케이션의 데이터 변환](https://docs.aws.amazon.com/code-library/latest/ug/lambda_example_cross_ServerlessS3DataTransformation_section.html)을 참조하세요.

**Topics**
+ [사전 조건](#ol-upper-prerequisites)
+ [1단계: S3 버킷 생성](#ol-upper-step1)
+ [2단계: S3 버킷에 파일 업로드](#ol-upper-step2)
+ [3단계: S3 액세스 포인트 생성](#ol-upper-step3)
+ [4단계: Lambda 함수 생성](#ol-upper-step4)
+ [5단계: Lambda 함수의 실행 역할에 대한 IAM 정책 구성](#ol-upper-step5)
+ [6단계: S3 객체 Lambda 액세스 포인트 생성](#ol-upper-step6)
+ [7단계: 변환된 데이터 보기](#ol-upper-step7)
+ [8단계: 정리](#ol-upper-step8)
+ [다음 단계](#ol-upper-next-steps)

## 사전 조건
<a name="ol-upper-prerequisites"></a>

이 자습서를 시작하기 전에 올바른 권한이 있는 AWS Identity and Access Management(IAM) 사용자로 로그인할 수 있는 AWS 계정이 있어야 합니다. 또한 Python 버전 3.8 이상을 설치해야 합니다.

**Topics**
+ [AWS 계정 권한이 있는 IAM 사용자 생성(콘솔)](#ol-upper-prerequisites-account)
+ [로컬 시스템에 Python 3.8 이상을 설치합니다.](#ol-upper-prerequisites-python)

### AWS 계정 권한이 있는 IAM 사용자 생성(콘솔)
<a name="ol-upper-prerequisites-account"></a>

그 대신 자습서의 IAM 사용자 자격 증명을 사용하면 됩니다. 이 자습서를 완료하려면 IAM 사용자가 다음 IAM 정책을 연결하여 관련 AWS 리소스에 액세스하고 특정 작업을 수행해야 합니다. IAM 사용자를 생성하는 방법에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM 사용자 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)을 참조하십시오.

IAM 사용자에게는 다음의 정책이 필요합니다.
+ [AmazonS3FullAccess](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonS3FullAccess$jsonEditor) - 객체 Lambda 액세스 포인트를 생성하고 사용할 수 있는 권한을 포함하여 모든 Amazon S3 작업에 권한을 부여합니다.
+ [AWSLambda\$1FullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor) - 모든 Lambda 작업에 권한을 부여합니다.
+ [IAMFullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor) - 모든 IAM 작업에 권한을 부여합니다.
+ [IAMAccessAnalyzerReadOnlyAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/IAMAccessAnalyzerReadOnlyAccess$jsonEditor) - IAM 액세스 분석기에서 제공하는 모든 액세스 정보를 읽을 수 있는 권한을 부여합니다.
+ [CloudWatchLogsFullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/CloudWatchLogsFullAccess$jsonEditor) – CloudWatch Logs에 대한 전체 액세스 권한을 부여합니다.

**참고**  
편의상 이 자습서에서는 IAM 사용자를 생성해 사용합니다. 이 자습서를 완료하면 [IAM 사용자 삭제](#ol-upper-step8-delete-user)를 수행해야 합니다. 프로덕션 용도로는 **IAM 사용 설명서에서 [IAM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 따르는 것이 좋습니다. 가장 좋은 방법은 인간 사용자가 ID 제공업체와의 페더레이션을 사용하여 임시 보안 인증으로 AWS에 액세스하도록 하는 것입니다. 워크로드에서 IAM 역할과 함께 임시 보안 인증을 사용하여 AWS에 액세스하도록 하는 것도 좋은 방법입니다. AWS IAM Identity Center를 사용하여 임시 보안 인증으로 사용자를 생성하는 방법에 대해 알아보려면 *AWS IAM Identity Center 사용 설명서*의 [Getting started](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)(시작하기)를 참조하십시오.  
이 자습서에서는 편의상 전체 액세스 AWS 관리형 정책을 사용합니다. 프로덕션 사용 용도의 경우 [보안 모범 사례](security-best-practices.md#security-best-practices-prevent)에 따라 사용 사례에 필요한 최소한의 권한만 부여하는 것이 좋습니다.

### 로컬 시스템에 Python 3.8 이상을 설치합니다.
<a name="ol-upper-prerequisites-python"></a>

로컬 시스템에 Python 3.8 이상을 설치하려면 다음 절차를 따르십시오. 설치 지침은 *Python 초급 가이드*의 [Python 다운로드](https://wiki.python.org/moin/BeginnersGuide/Download) 페이지를 참조하십시오.

1. 로컬 터미널 또는 셸을 열고 다음 명령을 실행하여 Python이 이미 설치되어 있는지 여부를 확인하고, 설치되어 있는 경우에는 어떤 버전이 설치되어 있는지 확인합니다.

   ```
   python --version
   ```

1. Python 3.8 이상의 버전이 없는 경우 로컬 시스템에 적합한 Python 3.8 이상의 [공식 설치 프로그램](https://www.python.org/downloads/)을 다운로드합니다.

1. 다운로드한 파일을 두 번 클릭하여 설치 프로그램을 실행하고 단계에 따라 설치를 완료합니다.

   **Windows 사용자**의 경우 먼저 설치 마법사에서 **Python 3.X를 경로에 추가(Add Python 3.X to PATH)**를 선택한 후 **지금 설치(Install Now)**를 선택합니다.

1. 터미널을 닫았다가 다시 열어서 다시 시작합니다.

1. Python 3.8 이상이 제대로 설치되었는지 확인하려면 다음 명령을 실행합니다.

   **macOS 사용자**의 경우 이 명령을 실행합니다.

   ```
   python3 --version
   ```

   **Windows 사용자**의 경우 이 명령을 실행합니다.

   ```
   python --version
   ```

1. pip3 패키지 관리자가 설치되었는지 확인하려면 다음 명령을 실행합니다. 명령 응답에 pip 버전 번호와 python 3.8 이상이 표시되면 pip3 패키지 관리자가 성공적으로 설치되었음을 의미합니다.

   ```
   pip --version
   ```

## 1단계: S3 버킷 생성
<a name="ol-upper-step1"></a>

버킷을 생성하여 변환하려는 원본 데이터를 저장합니다.

**참고**  
Amazon FSx for OpenZFS 볼륨과 같은 다른 데이터 소스에 액세스 포인트를 연결할 수 있지만 이 자습서에서는 S3 버킷에 연결된 지원 액세스 포인트를 사용합니다.

**버킷을 생성하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷 만들기**를 선택합니다.

   **버킷 만들기** 페이지가 열립니다.

1. **버킷 이름(Bucket Name)**에서 버킷 이름을 입력합니다(예: **tutorial-bucket**).

   Amazon S3의 버킷 이름 지정 규칙에 대한 자세한 내용은 [범용 버킷 이름 지정 규칙](bucketnamingrules.md) 섹션을 참조하세요.

1. **리전(Region)**에서 버킷이 속할 AWS 리전을 선택합니다.

   버킷 리전에 대한 자세한 내용은 [범용 버킷 개요](UsingBucket.md) 섹션을 참조하세요.

1. **이 버킷에 대한 퍼블릭 액세스 차단 설정(Block Public Access settings for this bucket)**에서 해당 설정을 기본값으로 유지합니다(***모든* 퍼블릭 액세스 차단(Block all public access)**이 활성화됨).

   해당 사용 사례에 대해 하나 이상의 설정을 해제해야 하는 경우가 아니라면 모든 설정을 퍼블릭 액세스 차단 설정 활성화 상태로 유지하는 것이 좋습니다. 퍼블릭 액세스 차단에 대한 자세한 내용은 [Amazon S3 스토리지에 대한 퍼블릭 액세스 차단](access-control-block-public-access.md) 섹션을 참조하세요.

1. 나머지 설정은 기본값으로 유지합니다.

   특정 사용 사례에 대한 추가 버킷 설정을 구성하려면 [범용 버킷 생성](create-bucket-overview.md) 섹션을 참조하십시오(선택 사항).

1. **버킷 생성**을 선택합니다.

## 2단계: S3 버킷에 파일 업로드
<a name="ol-upper-step2"></a>

텍스트 파일을 S3 버킷에 업로드합니다. 이 텍스트 파일에는 이 자습서의 뒷부분에서 대문자로 변환할 원본 데이터가 들어 있습니다.

예를 들어, 다음 텍스트가 포함된 `tutorial.txt` 파일을 업로드할 수 있습니다.

```
Amazon S3 Object Lambda Tutorial:
You can add your own code to process data retrieved from S3 before 
returning it to an application.
```

**버킷에 파일을 업로드하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷(Buckets)** 목록에서, [1단계](#ol-upper-step1)에서 생성한 버킷의 이름(예: **tutorial-bucket**)을 선택하여 파일을 업로드합니다.

1. 버킷의 **객체(Objects)** 탭에서 **업로드(Upload)**를 선택합니다.

1. **업로드(Upload)** 페이지의 **파일 및 폴더(Files and Folders)**에서 **파일 추가(Add Files)**를 선택합니다.

1. 업로드할 파일을 선택한 후 **열기**를 선택합니다. 예를 들어, 앞에서 언급한 `tutorial.txt` 파일 예제를 업로드할 수 있습니다.

1. **업로드**를 선택합니다.

## 3단계: S3 액세스 포인트 생성
<a name="ol-upper-step3"></a>

S3 객체 Lambda 액세스 포인트를 사용하여 원본 데이터에 액세스하고 변환하려면 S3 액세스 포인트를 생성하고 [1단계](#ol-upper-step1)에서 생성한 S3 버킷에 연결해야 합니다. 액세스 포인트는 변환하려는 객체와 동일한 AWS 리전에 있어야 합니다.

이 자습서의 뒷부분에서 이 액세스 포인트를 객체 Lambda 액세스 포인트에 대한 지원 액세스 포인트로 사용합니다.

**액세스 포인트 생성**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 탐색 창에서 **액세스 포인트(Access Points)**를 선택합니다.

1. **액세스 포인트(Access Points)** 페이지에서 **액세스 포인트 생성(Create access point)**을 선택합니다.

1. **액세스 포인트 이름(Access point name)** 필드에 액세스 포인트 이름을 입력합니다(예: **tutorial-access-point**).

   액세스 포인트 명명에 대한 자세한 내용은 [액세스 포인트 이름 지정 규칙](access-points-restrictions-limitations-naming-rules.md#access-points-names) 섹션을 참조하십시오.

1. **데이터 소스** 필드에서 [1단계](#ol-upper-step1)에서 생성한 버킷의 이름을 입력합니다(예: **tutorial-bucket**). S3는 액세스 포인트를 이 버킷에 연결합니다.

   (선택 사항) **S3 찾아보기(Browse S3)**를 선택하여 계정의 버킷을 찾아보고 검색할 수 있습니다. **S3 찾아보기(Browse S3)**를 선택할 경우 원하는 버킷을 선택한 후 **경로 선택(Choose path)**을 선택하여 **버킷 이름(Bucket name)** 필드를 해당 버킷의 이름으로 채웁니다.

1. **네트워크 오리진(Network origin)**에서 **인터넷(Internet)**을 선택합니다.

   액세스 포인트의 네트워크 오리진에 대한 자세한 내용은 [가상 프라이빗 클라우드(VPC)로 제한된 액세스 포인트 생성](access-points-vpc.md) 섹션을 참조하십시오.

1. 액세스 포인트에는 기본값으로 모든 퍼블릭 액세스 차단(Block all public access) 설정이 활성화되어 있습니다. ***모든* 퍼블릭 액세스 차단(Block all public access)** 설정을 활성화 상태로 유지하는 것이 좋습니다.

   자세한 정보는 [범용 버킷의 액세스 포인트에 대한 퍼블릭 액세스 관리](access-points-bpa-settings.md)을 참조하세요.

1. 다른 모든 액세스 포인트 설정의 경우 기본 설정을 그대로 유지합니다.

   (선택 사항) 사용 사례를 지원하도록 액세스 포인트 설정을 수정할 수 있습니다. 이 자습서에서는 기본 설정을 그대로 유지하는 것이 좋습니다.

   (선택 사항) 액세스 포인트에 대한 액세스를 관리해야 하는 경우 액세스 포인트 정책을 지정할 수 있습니다. 자세한 정보는 [액세스 포인트의 정책 예시](access-points-policies.md#access-points-policy-examples)을 참조하세요.

1. **액세스 포인트 생성**을 선택합니다.

## 4단계: Lambda 함수 생성
<a name="ol-upper-step4"></a>

원본 데이터를 변환하려면 S3 객체 Lambda 액세스 포인트에 사용할 Lambda 함수를 생성합니다.

**Topics**
+ [Lambda 함수 코드 작성 및 가상 환경의 배포 패키지 생성](#ol-upper-step4-write-lambda)
+ [실행 역할을 사용하여 Lambda 함수 생성(콘솔)](#ol-upper-step4-create-function)
+ [.zip 파일 아카이브를 사용하여 Lambda 함수 코드 배포 및 Lambda 함수 구성(콘솔)](#ol-upper-step4-deploy-function)

### Lambda 함수 코드 작성 및 가상 환경의 배포 패키지 생성
<a name="ol-upper-step4-write-lambda"></a>

1. 로컬 시스템에서, 이 자습서의 뒷부분에서 사용할 가상 환경의 `object-lambda` 폴더 이름으로 폴더를 생성합니다.

1. `object-lambda` 폴더에서 원본 객체의 모든 텍스트를 대문자로 변경하는 Lambda 함수를 사용하여 파일을 생성합니다. 예를 들어 Python으로 작성된 다음 함수를 사용할 수 있습니다. 이 함수를 `transform.py` 파일에 저장합니다.

   ```
   import boto3
   import requests
   from botocore.config import Config
   
   # This function capitalizes all text in the original object
   def lambda_handler(event, context):
       object_context = event["getObjectContext"]
       # Get the presigned URL to fetch the requested original object 
       # from S3
       s3_url = object_context["inputS3Url"]
       # Extract the route and request token from the input context
       request_route = object_context["outputRoute"]
       request_token = object_context["outputToken"]
       
       # Get the original S3 object using the presigned URL
       response = requests.get(s3_url)
       original_object = response.content.decode("utf-8")
   
       # Transform all text in the original object to uppercase
       # You can replace it with your custom code based on your use case
       transformed_object = original_object.upper()
   
       # Write object back to S3 Object Lambda
       s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
       # The WriteGetObjectResponse API sends the transformed data
       # back to S3 Object Lambda and then to the user
       s3.write_get_object_response(
           Body=transformed_object,
           RequestRoute=request_route,
           RequestToken=request_token)
   
       # Exit the Lambda function: return the status code  
       return {'status_code': 200}
   ```
**참고**  
앞의 예제 Lambda 함수는 요청된 객체 전체를 메모리에 로드한 다음 변환하여 클라이언트에 반환합니다. 또는 S3에서 객체를 스트리밍하여 전체 객체를 메모리에 로드하지 않도록 할 수 있습니다. 이 접근 방법은 큰 객체 작업 시 유용할 수 있습니다. 객체 Lambda 액세스 포인트를 사용하여 응답을 스트리밍하는 방법에 대한 자세한 내용은 [Lambda에서 `GetObject` 요청 작업](olap-writing-lambda.md#olap-getobject-response) 섹션을 참조하십시오.

   S3 객체 Lambda 액세스 포인트와 함께 사용할 Lambda 함수를 작성할 때 이 함수는 S3 객체 Lambda 함수가 Lambda 함수에 제공하는 입력 이벤트 컨텍스트를 기반으로 합니다. 이벤트 컨텍스트는 S3 객체 Lambda에서 Lambda로 전달된 이벤트에서 수행되는 요청에 대한 정보를 제공합니다. 여기에는 Lambda 함수를 생성하는 데 사용하는 파라미터가 포함되어 있습니다.

   앞의 Lambda 함수를 생성하는 데 사용된 필드는 다음과 같습니다.

   `getObjectContext` 필드는 Amazon S3 및 S3 객체 Lambda 연결에 대한 입력 및 출력 세부 정보입니다. 해당 필드에는 다음 필드가 포함되어 있습니다.
   + `inputS3Url` - Lambda 함수가 지원 액세스 포인트에서 원본 객체를 다운로드하는 데 사용할 수 있는 미리 서명된 URL입니다. 미리 서명된 URL을 사용하면 Lambda 함수가 원본 객체를 검색하기 위해 Amazon S3 읽기 권한을 가질 필요가 없으며 각 호출에 의해 처리된 객체에만 액세스할 수 있습니다.
   + `outputRoute` - 변환된 객체를 다시 전송하기 위해 Lambda 함수에서 `WriteGetObjectResponse`를 호출할 때 S3 객체 Lambda URL에 추가되는 라우팅 토큰입니다.
   + `outputToken` - 변환된 객체를 다시 전송할 때 `WriteGetObjectResponse` 호출을 원래 발신자와 일치시키기 위해 S3 객체 Lambda에서 사용하는 토큰입니다.

   이벤트 컨텍스트의 모든 필드에 대한 자세한 내용은 [이벤트 컨텍스트 형식 및 사용법](olap-event-context.md) 및 [S3 객체 Lambda 액세스 포인트에 대한 Lambda 함수 작성](olap-writing-lambda.md) 섹션을 참조하십시오.

1. 로컬 터미널에서 `virtualenv` 패키지를 설치하려면 다음 명령을 입력합니다.

   ```
   python -m pip install virtualenv
   ```

1. 로컬 터미널에서, 이전에 생성된 `object-lambda` 폴더를 연 후 다음 명령을 입력하여 `venv` 가상 환경을 생성하고 초기화합니다.

   ```
   python -m virtualenv venv
   ```

1. 가상 환경을 활성화하려면 다음 명령을 입력하여 환경의 폴더에서 `activate` 파일을 실행합니다.

   **macOS 사용자**의 경우 이 명령을 실행합니다.

   ```
   source venv/bin/activate
   ```

   **Windows 사용자**의 경우 이 명령을 실행합니다.

   ```
   .\venv\Scripts\activate
   ```

   이제 명령 프롬프트가 **(venv)**를 표시하도록 변경되어 가상 환경이 활성임을 보여 줍니다.

1. 필요한 라이브러리를 설치하려면 `venv` 가상 환경에서 다음 명령을 한 줄씩 실행합니다.

   이러한 명령은 `lambda_handler` Lambda 함수의 종속성에 대한 업데이트된 버전을 설치합니다. 이러한 종속성은 AWS SDK for Python(Boto3) 및 요청 모듈입니다.

   ```
   pip3 install boto3
   ```

   ```
   pip3 install requests
   ```

1. 가상 환경을 비활성화하려면 다음 명령을 실행합니다.

   ```
   deactivate
   ```

1. 설치된 라이브러리를 `object-lambda` 디렉터리의 루트에 `lambda.zip`이라는 `.zip` 파일로 사용하여 배포 패키지를 생성하려면 로컬 터미널에서 다음 명령줄을 한 줄씩 실행합니다.
**작은 정보**  
특정 환경에서 작동하도록 다음 명령을 조정해야 할 수 있습니다. 예를 들어 라이브러리는 `site-packages` 또는 `dist-packages`에 표시될 수 있으며, 첫 번째 폴더는 `lib` 또는 `lib64`에 표시될 수 있습니다. 또한 `python` 폴더의 이름은 다른 Python 버전으로 명명될 수 있습니다. 특정 패키지를 찾으려면 `pip show` 명령을 사용합니다.

   **macOS 사용자**의 경우 다음 명령을 실행합니다.

   ```
   cd venv/lib/python3.8/site-packages 
   ```

   ```
   zip -r ../../../../lambda.zip .
   ```

   **Windows 사용자**의 경우 다음 명령을 실행합니다.

   ```
   cd .\venv\Lib\site-packages\ 
   ```

   ```
   powershell Compress-Archive * ../../../lambda.zip
   ```

   마지막 명령은 배포 패키지를 `object-lambda` 디렉터리의 루트에 저장합니다.

1. 배포 패키지 루트에 함수 코드 파일 `transform.py`를 추가합니다.

   **macOS 사용자**의 경우 다음 명령을 실행합니다.

   ```
   cd ../../../../ 
   ```

   ```
   zip -g lambda.zip transform.py
   ```

   **Windows 사용자**의 경우 다음 명령을 실행합니다.

   ```
   cd ..\..\..\
   ```

   ```
   powershell Compress-Archive -update transform.py lambda.zip
   ```

   이 단계를 완료한 후에는 다음과 같은 디렉터리 구조가 있어야 합니다.

   ```
   lambda.zip$
     │ transform.py
     │ __pycache__
     | boto3/
     │ certifi/
     │ pip/
     │ requests/
     ...
   ```

### 실행 역할을 사용하여 Lambda 함수 생성(콘솔)
<a name="ol-upper-step4-create-function"></a>

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)에서 AWS Lambda 콘솔을 엽니다.

   

1. 왼쪽 탐색 창에서 **함수(Functions)**를 선택합니다.

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

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

1. **기본 정보**에서 다음과 같이 합니다.

   1. [**함수 이름(Function name)**]에 **tutorial-object-lambda-function**을 입력합니다.

   1. **런타임(Runtime)**에서 **Python 3.8** 이상 버전을 선택합니다.

1. **기본 실행 역할 변경(Change default execution role)** 섹션을 펼칩니다. **실행 역할(Execution role)**에서 **기본 Lambda 권한을 가진 새 역할 생성(Create a new role with basic Lambda permissions)**을 선택합니다.

   이 자습서 뒷부분의 [5단계](#ol-upper-step5)에서 **AmazonS3ObjectLambdaExecutionRolePolicy**를 이 Lambda 함수의 실행 역할에 연결합니다.

1. 나머지 설정은 기본값으로 유지합니다.

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

### .zip 파일 아카이브를 사용하여 Lambda 함수 코드 배포 및 Lambda 함수 구성(콘솔)
<a name="ol-upper-step4-deploy-function"></a>

1. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)에 있는 AWS Lambda 콘솔의 왼쪽 탐색 창에서 **함수(Functions)**를 선택합니다.

1. 전에 생성해 둔 Lambda 함수를 선택합니다(예: **tutorial-object-lambda-function**).

1. Lambda 함수의 세부 정보 페이지에서 **코드(Code)** 탭을 선택합니다. **코드 소스(Code Source)** 섹션에서 **업로드 원본(Upload from)**을 선택한 다음 **.zip 파일(.zip file)**을 선택합니다.

1. **업로드(Upload)**를 선택하여 로컬 `.zip` 파일을 선택합니다.

1. 이전에 생성한 `lambda.zip` 파일을 선택한 후 **열기(Open)**를 선택합니다.

1. **저장**을 선택합니다.

1. **런타임 설정(Runtime settings)** 섹션에서 **편집(Edit)**을 선택합니다.

1. **런타임 설정 편집(Edit runtime settings)** 페이지에서 **런타임(Runtime)**이 **Python 3.8** 이상 버전으로 설정되었는지 확인합니다.

1. Lambda 함수 코드에서 호출할 핸들러 메서드를 Lambda 런타임에 알리기 위해 **핸들러(Handler)**에 **transform.lambda\$1handler**를 입력합니다.

   Python에서 함수를 구성할 때, 핸들러 설정의 값은 파일의 이름과 핸들러 모듈의 이름이며 점으로 구분됩니다. 예를 들어 `transform.lambda_handler`는 `transform.py` 파일에 정의된 `lambda_handler` 메서드를 호출합니다.

1. **저장**을 선택합니다.

1. (선택 사항) Lambda 함수의 세부 정보 페이지에서 **구성(Configuration)** 탭을 선택합니다. 왼쪽 탐색 창에서 **일반 구성(General configuration)**을 선택한 후 **편집(Edit)**을 선택합니다. **제한 시간(Timeout)** 필드에 **1**분 **0**초를 입력합니다. 나머지 설정은 기본값으로 유지하고 **저장(Save)**을 선택합니다.

   **제한 시간(Timeout)**은 Lambda가 함수를 중지하기까지 호출 실행을 허용하는 시간입니다. 기본값은 3초입니다. S3 객체 Lambda에서 사용하는 Lambda 함수의 최대 지속 시간은 60초입니다. 가격은 구성된 메모리 양과 코드가 실행되는 시간을 기준으로 책정됩니다.

## 5단계: Lambda 함수의 실행 역할에 대한 IAM 정책 구성
<a name="ol-upper-step5"></a>

Lambda 함수가 사용자 지정된 데이터 및 응답 헤더를 `GetObject` 발신자에게 제공하도록 설정하려면 Lambda 함수의 실행 역할에 `WriteGetObjectResponse` API를 호출할 수 있는 IAM 권한이 있어야 합니다.

**IAM 정책을 Lambda 함수 역할에 연결하려면**



1. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)에 있는 AWS Lambda 콘솔의 왼쪽 탐색 창에서 **함수(Functions)**를 선택합니다.

1. [4단계](#ol-upper-step4)에서 생성한 함수(예: **tutorial-object-lambda-function**)를 선택합니다.

1. Lambda 함수의 세부 정보 페이지에서 **구성(Configuration)** 탭을 선택한 후 왼쪽 탐색 창에서 **권한(Permissions)**을 선택합니다.

1. **실행 역할(Execution role)**에서 **역할 이름(Role name)** 링크를 선택합니다. 그러면 IAM 콘솔이 열립니다.

1. Lambda 함수의 실행 역할에 대한 IAM 콘솔의 **Summary**(요약) 페이지에서 **Permissions**(권한) 탭을 선택합니다. 그런 다음, **권한 추가** 메뉴에서 **정책 연결**을 선택합니다.

1. **권한 연결(Attach Permissions)** 페이지에서 검색 필드에 **AmazonS3ObjectLambdaExecutionRolePolicy**를 입력하여 정책 목록을 필터링합니다. **AmazonS3ObjectLambdaExecutionRolePolicy** 정책 이름 옆의 확인란을 선택합니다.

1. **정책 연결**을 선택합니다.

## 6단계: S3 객체 Lambda 액세스 포인트 생성
<a name="ol-upper-step6"></a>

S3 객체 Lambda 액세스 포인트는 해당 함수가 S3 액세스 포인트에서 검색된 데이터를 처리할 수 있도록 S3 GET 요청에서 직접 Lambda 함수를 호출할 수 있는 유연성을 제공합니다. S3 객체 Lambda 액세스 포인트를 생성하고 구성하는 경우, Lambda 함수를 지정하여 Lambda가 사용할 사용자 지정 파라미터로 JSON 형식의 이벤트 컨텍스트를 호출하고 제공해야 합니다.

**S3 객체 Lambda 액세스 포인트를 생성하는 방법**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **객체 Lambda 액세스 포인트(Object Lambda Access Points)**를 선택합니다.

1. **객체 Lambda 액세스 포인트(Object Lambda Access Points)** 페이지에서 **객체 Lambda 액세스 포인트 생성(Create Object Lambda Access Point)**을 선택합니다.

1. **객체 Lambda 액세스 포인트 이름**에서 객체 Lambda 액세스 포인트에 사용할 이름을 입력합니다(예: **tutorial-object-lambda-accesspoint**).

1. **지원 액세스 포인트(Supporting Access Point)**에서, [3단계](#ol-upper-step3)에서 생성한 표준 액세스 포인트(예: **tutorial-access-point**)를 입력하거나 검색한 후 **지원 액세스 포인트 선택(Choose supporting Access Point)**.을 선택합니다.

1. **S3 API**의 경우, Lambda 함수가 처리할 S3 버킷에서 객체를 검색하려면 **GetObject**를 선택합니다.

1. **Lambda 함수 호출(Invoke Lambda function)**에서, 이 자습서의 다음 두 가지 옵션 중 하나를 선택할 수 있습니다.
   + **계정의 함수에서 선택**을 선택한 후, [4단계](#ol-upper-step4)에서 생성한 Lambda 함수(예: **tutorial-object-lambda-function**)를 **Lambda 함수** 드롭다운 목록에서 선택합니다.
   + **ARN 입력(Enter ARN)**을 선택한 후, [4단계](#ol-upper-step4)에서 생성한 Lambda 함수의 Amazon 리소스 이름(ARN)을 입력합니다.

1. **Lambda 함수 버전(Lambda function version)**에서 **\$1LATEST**([4단계](#ol-upper-step4)에서 생성한 Lambda 함수의 최신 버전)를 선택합니다.

1. (선택 사항) Lambda 함수가 범위 및 부분 번호 헤더가 있는 GET 요청을 인식하고 처리해야 하는 경우 **Lambda 함수는 범위를 사용하여 요청을 지원합니다(Lambda function supports requests using range)** 및 **Lambda 함수는 부분 번호를 사용하여 요청을 지원합니다(Lambda function supports requests using part numbers)**를 선택합니다. 그렇지 않으면 이 두 확인란의 선택을 취소합니다.

   S3 객체 Lambda에서 범위 또는 부분 번호를 사용하는 방법에 대한 자세한 내용은 [Range 및 partNumber 헤더 작업](range-get-olap.md) 섹션을 참조하십시오.

1. (선택 사항) **페이로드 - *선택 사항*(Payload - optional)**에서, Lambda 함수에 추가 정보를 제공하는 JSON 텍스트를 추가합니다.

   페이로드는 특정 S3 객체 Lambda 액세스 포인트에서 오는 모든 호출에 대한 입력으로 Lambda 함수에 제공할 수 있는 선택적 JSON 텍스트입니다. 동일한 Lambda 함수를 호출하는 여러 객체 Lambda 액세스 포인트에 대해 사용자 지정하기 위해 서로 다른 파라미터를 사용하여 페이로드를 구성할 수 있으므로 Lambda 함수의 유연성을 높일 수 있습니다.

   페이로드에 대한 자세한 내용은 [이벤트 컨텍스트 형식 및 사용법](olap-event-context.md) 섹션을 참조하십시오.

1. (선택 사항) **요청 지표 - *선택 사항***에서 **비활성화** 또는 **활성화**를 선택하여 Object Lambda 액세스 포인트에 Amazon S3 모니터링을 추가합니다. 요청 지표는 표준 Amazon CloudWatch 요금으로 청구됩니다. 자세한 내용은 [CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/)을 참조하십시오.

1. **객체 Lambda 액세스 포인트 정책 - *선택 사항*(Object Lambda Access Point policy - optional)**에서 기본 설정을 그대로 유지합니다.

   리소스 정책을 설정할 수 있습니다(선택 사항). 이 리소스 정책은 지정된 객체 Lambda 액세스 포인트를 사용할 수 있는 권한을 `GetObject` API에 부여합니다.

1. 나머지 설정은 기본값으로 유지하고 **객체 Lambda 액세스 포인트 생성(Create Object Lambda Access Point)**을 선택합니다.

## 7단계: 변환된 데이터 보기
<a name="ol-upper-step7"></a>

이제 S3 Object Lambda가 사용 사례에 맞게 데이터를 변환할 준비가 되었습니다. 이 자습서에서는 S3 객체 Lambda가 객체의 모든 텍스트를 대문자로 변환합니다.

**Topics**
+ [S3 객체 Lambda 액세스 포인트에서 변환된 데이터 보기](#ol-upper-step7-check-data)
+ [Python 스크립트를 실행하여 원본 및 변환된 데이터를 인쇄합니다.](#ol-upper-step7-python-print)

### S3 객체 Lambda 액세스 포인트에서 변환된 데이터 보기
<a name="ol-upper-step7-check-data"></a>

S3 객체 Lambda 액세스 포인트를 통해 파일을 검색하도록 요청할 때 S3 객체 Lambda에 대한 `GetObject` API 호출을 수행합니다. S3 객체 Lambda는 Lambda 함수를 호출하여 데이터를 변환하고 변환된 데이터를 표준 S3 `GetObject` API 호출에 대한 응답으로 반환합니다.

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **객체 Lambda 액세스 포인트(Object Lambda Access Points)**를 선택합니다.

1. **객체 Lambda 액세스 포인트** 페이지에서 [6단계](#ol-upper-step6)에서 생성한 S3 객체 Lambda 액세스 포인트를 선택합니다(예: **tutorial-object-lambda-accesspoint**).

1. S3 객체 Lambda 액세스 포인트의 **객체** 탭에서 [2단계](#ol-upper-step2)에서 S3 버킷에 업로드한 파일과 이름이 같은 파일을 선택합니다(예: `tutorial.txt`) 

   이 파일에는 변환된 모든 데이터가 포함되어야 합니다.

1. 변환된 데이터를 보려면 **열기(Open)** 또는 **다운로드(Download)**를 선택합니다.

### Python 스크립트를 실행하여 원본 및 변환된 데이터를 인쇄합니다.
<a name="ol-upper-step7-python-print"></a>

S3 객체 Lambda를 기존 애플리케이션에서 사용할 수 있습니다. 이 작업을 수행하려면 [6단계](#ol-upper-step6)에서 생성한 새로운 S3 객체 Lambda 액세스 포인트 ARN을 사용하여 S3에서 데이터를 검색하도록 애플리케이션 구성을 업데이트합니다.

다음 예시 Python 스크립트는 S3 버킷의 원본 데이터와 S3 객체 Lambda 액세스 포인트에서 변환된 데이터를 모두 인쇄합니다.

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **객체 Lambda 액세스 포인트(Object Lambda Access Points)**를 선택합니다.

1. **객체 Lambda 액세스 포인트** 페이지에서 [6단계](#ol-upper-step6)에서 생성한 S3 객체 Lambda 액세스 포인트 왼쪽에 있는 라디오 버튼을 선택합니다(예: **tutorial-object-lambda-accesspoint**).

1. **ARN 복사(Copy ARN)**를 선택합니다.

1. 나중에 사용할 수 있도록 ARN을 저장합니다.

1. 로컬 시스템에서 Python 스크립트를 작성하여 S3 버킷의 원본 데이터(예 :`tutorial.txt`)와 S3 객체 Lambda 액세스 포인트의 변환된 데이터(예: `tutorial.txt`)를 모두 인쇄합니다. 다음 예제 스크립트를 사용할 수 있습니다.

   ```
   import boto3
   from botocore.config import Config
   
   s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
   
   def getObject(bucket, key):
       objectBody = s3.get_object(Bucket = bucket, Key = key)
       print(objectBody["Body"].read().decode("utf-8"))
       print("\n")
   
   print('Original object from the S3 bucket:')
   # Replace the two input parameters of getObject() below with 
   # the S3 bucket name that you created in Step 1 and 
   # the name of the file that you uploaded to the S3 bucket in Step 2
   getObject("tutorial-bucket", 
             "tutorial.txt")
   
   print('Object transformed by S3 Object Lambda:')
   # Replace the two input parameters of getObject() below with 
   # the ARN of your S3 Object Lambda Access Point that you saved earlier and
   # the name of the file with the transformed data (which in this case is
   # the same as the name of the file that you uploaded to the S3 bucket 
   # in Step 2)
   getObject("arn:aws:s3-object-lambda:us-west-2:111122223333:accesspoint/tutorial-object-lambda-accesspoint",
             "tutorial.txt")
   ```

1. 로컬 시스템의 [4단계](#ol-upper-step4)에서 생성한 폴더(예: `object-lambda`)에 Python 스크립트를 사용자 지정 이름(예: `tutorial_print.py`)으로 저장합니다.

1. 로컬 터미널에서, [4단계](#ol-upper-step4)에서 생성한 디렉터리 루트에서 다음 명령을 실행합니다(예: `object-lambda`).

   ```
   python3 tutorial_print.py
   ```

   터미널을 통해 원본 데이터와 변환된 데이터(대문자로 된 모든 텍스트)가 모두 표시되어야 합니다. 예를 들어 다음 텍스트와 같은 내용이 표시되어야 합니다.

   ```
   Original object from the S3 bucket:
   Amazon S3 Object Lambda Tutorial:
   You can add your own code to process data retrieved from S3 before 
   returning it to an application.
   
   Object transformed by S3 Object Lambda:
   AMAZON S3 OBJECT LAMBDA TUTORIAL:
   YOU CAN ADD YOUR OWN CODE TO PROCESS DATA RETRIEVED FROM S3 BEFORE 
   RETURNING IT TO AN APPLICATION.
   ```

## 8단계: 정리
<a name="ol-upper-step8"></a>

실습용으로만 S3 객체 Lambda를 통해 데이터를 변환한 경우에는 요금이 발생하지 않도록 할당한 AWS 리소스를 삭제합니다.

**Topics**
+ [객체 Lambda 액세스 포인트 삭제](#ol-upper-step8-delete-olap)
+ [S3 액세스 포인트 삭제](#ol-upper-step8-delete-ap)
+ [Lambda 함수용 실행 역할 삭제](#ol-upper-step8-delete-lambda-role)
+ [Lambda 함수 삭제](#ol-upper-step8-delete-lambda-function)
+ [CloudWatch 로그 그룹 삭제](#ol-upper-step8-delete-cloudwatch)
+ [S3 소스 버킷에서 원본 파일 삭제](#ol-upper-step8-delete-file)
+ [S3 소스 버킷 삭제](#ol-upper-step8-delete-bucket)
+ [IAM 사용자 삭제](#ol-upper-step8-delete-user)

### 객체 Lambda 액세스 포인트 삭제
<a name="ol-upper-step8-delete-olap"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **객체 Lambda 액세스 포인트(Object Lambda Access Points)**를 선택합니다.

1. **객체 Lambda 액세스 포인트** 페이지에서 [6단계](#ol-upper-step6)에서 생성한 S3 객체 Lambda 액세스 포인트 왼쪽에 있는 라디오 버튼을 선택합니다(예: **tutorial-object-lambda-accesspoint**).

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

1. 표시되는 텍스트 필드에 객체 Lambda 액세스 포인트 이름을 입력하여 삭제 여부를 확인하고 **삭제**를 선택합니다.

### S3 액세스 포인트 삭제
<a name="ol-upper-step8-delete-ap"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 탐색 창에서 **액세스 포인트(Access Points)**를 선택합니다.

1. [3단계](#ol-upper-step3)에서 생성한 액세스 포인트(예: **tutorial-access-point**)로 이동한 후 액세스 포인트 이름 옆에 있는 라디오 버튼을 선택합니다.

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

1. 표시되는 텍스트 필드에 액세스 포인트 이름을 입력하여 삭제 여부를 확인하고 **삭제(Delete)**를 선택합니다.

### Lambda 함수용 실행 역할 삭제
<a name="ol-upper-step8-delete-lambda-role"></a>

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)에서 AWS Lambda 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **함수(Functions)**를 선택합니다.

1. [4단계](#ol-upper-step4)에서 생성한 함수(예: **tutorial-object-lambda-function**)를 선택합니다.

1. Lambda 함수의 세부 정보 페이지에서 **구성(Configuration)** 탭을 선택한 후 왼쪽 탐색 창에서 **권한(Permissions)**을 선택합니다.

1. **실행 역할(Execution role)**에서 **역할 이름(Role name)** 링크를 선택합니다. 그러면 IAM 콘솔이 열립니다.

1. Lambda 함수의 실행 역할에 대한 IAM 콘솔 **요약(Summary)** 페이지에서 **역할 삭제(Delete role)**를 선택합니다.

1. **역할 삭제(Delete role)** 대화 상자에서 **예, 삭제(Yes, Delete)**를 선택합니다.

### Lambda 함수 삭제
<a name="ol-upper-step8-delete-lambda-function"></a>

1. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)에 있는 AWS Lambda 콘솔의 왼쪽 탐색 창에서 **함수(Functions)**를 선택합니다.

1. [4단계](#ol-upper-step4)에서 생성한 함수 이름 왼쪽에 있는 확인란을 선택합니다(예: **tutorial-object-lambda-function**).

1. **작업**을 선택한 후 **삭제**를 선택합니다.

1. **함수 삭제(Delete function)** 대화 상자에서 **삭제(Delete)**를 선택합니다.

### CloudWatch 로그 그룹 삭제
<a name="ol-upper-step8-delete-cloudwatch"></a>

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **로그 그룹(Log groups)**을 선택합니다.

1. 이름이 [4단계](#ol-upper-step4)에서 생성한 Lambda 함수로 끝나는 로그 그룹을 찾습니다(예: **tutorial-object-lambda-function**).

1. 로그 그룹 이름 왼쪽에 있는 확인란을 선택합니다.

1. **작업(Actions)**을 선택한 후 **로그 그룹 삭제(Delete log group(s))**를 선택합니다.

1. **로그 그룹 삭제(Delete log group(s))** 대화 상자에서 **삭제(Delete)**를 선택합니다.

### S3 소스 버킷에서 원본 파일 삭제
<a name="ol-upper-step8-delete-file"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷 이름(Bucket name)** 목록에서, [2단계](#ol-upper-step2)에서 원본 파일을 업로드한 버킷의 이름을 선택합니다(예: **tutorial-bucket**).

1. 삭제할 객체의 이름 왼쪽에 있는 확인란을 선택합니다(예: `tutorial.txt`).

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

1. **객체 삭제(Delete objects)** 페이지의 **객체를 영구적으로 삭제하시겠습니까?(Permanently delete objects?)** 섹션에서 텍스트 상자에 **permanently delete**를 입력하여 이 객체의 삭제 여부를 확인합니다.

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

### S3 소스 버킷 삭제
<a name="ol-upper-step8-delete-bucket"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷(Buckets)** 목록에서, [1단계](#ol-upper-step1)에서 생성한 버킷의 이름 옆에 있는 라디오 버튼을 선택합니다(예: **tutorial-bucket**).

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

1. **버킷 삭제(Delete bucket)** 페이지의 텍스트 필드에 버킷 이름을 입력하여 버킷의 삭제 여부를 확인한 다음 **버킷 삭제(Delete bucket)**를 선택합니다.

### IAM 사용자 삭제
<a name="ol-upper-step8-delete-user"></a>

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **사용자(Users)**를 선택한 후 삭제할 사용자 이름 옆에 있는 확인란을 선택합니다.

1. 페이지 상단에서 **삭제(Delete)**를 선택합니다.

1. ***사용자 이름*을 삭제하시겠습니까?(Delete user name?)** 대화 상자에서 텍스트 입력 필드에 역할 이름을 입력하여 사용자의 삭제 여부를 확인합니다. **삭제**를 선택합니다.

## 다음 단계
<a name="ol-upper-next-steps"></a>

이 자습서를 완료한 후 사용 사례에 따라 Lambda 함수를 사용자 지정하여 표준 S3 GET 요청에서 반환된 데이터를 수정할 수 있습니다.

다음은 S3 객체 Lambda의 일반적인 사용 사례 목록입니다.
+ 보안 및 규정 준수를 위해 민감한 데이터를 마스킹합니다.

  자세한 정보는 [자습서: S3 객체 Lambda 및 Amazon Comprehend를 사용하여 PII 데이터 감지 및 수정](tutorial-s3-object-lambda-redact-pii.md)을 참조하세요.
+ 특정 정보를 제공하기 위해 특정 데이터 행을 필터링합니다.
+ 다른 서비스 또는 데이터베이스의 정보로 데이터를 보강합니다.
+ 애플리케이션 호환성을 위해 XML을 JSON으로 변환하는 등 데이터 형식 간에 변환합니다.
+ 다운로드 중일 때 파일을 압축 또는 압축 해제합니다.
+ 이미지 크기를 조정하고 워터마킹을 수행합니다.

  자세한 내용은 [Tutorial: Using S3 Object Lambda to dynamically watermark images as they are retrieved](https://aws.amazon.com/getting-started/hands-on/amazon-s3-object-lambda-to-dynamically-watermark-images/?ref=docs_gateway/amazons3/tutorial-s3-object-lambda-uppercase.html)(자습서: S3 객체 Lambda를 사용하여 이미지를 검색할 때 동적으로 워터마크 지정)를 참조하십시오.
+ 사용자 지정 권한 부여 규칙을 구현하여 데이터에 액세스합니다.

S3 객체 Lambda에 대한 자세한 내용은 [S3 객체 Lambda를 사용하여 객체 변환](transforming-objects.md) 섹션을 참조하세요.

# 자습서: S3 객체 Lambda 및 Amazon Comprehend를 사용하여 PII 데이터 감지 및 수정
<a name="tutorial-s3-object-lambda-redact-pii"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

여러 애플리케이션과 사용자가 액세스할 수 있도록 공유 데이터 집합에 Amazon S3를 사용하는 경우 개인 식별 정보(PII)와 같이 권한 있는 정보를 승인된 엔터티로만 제한하는 것이 중요합니다. 예를 들어 마케팅 애플리케이션에서 PII가 포함된 일부 데이터를 사용하는 경우 데이터 개인 정보 보호 요구 사항을 충족하기 위해 먼저 PII 데이터를 마스킹해야 할 수 있습니다. 또한 분석 애플리케이션이 생산 주문 인벤토리 데이터 집합을 사용하는 경우 의도하지 않은 데이터 유출을 방지하기 위해 먼저 고객 신용 카드 정보를 수정해야 할 수 있습니다.

[S3 객체 Lambda](https://aws.amazon.com/s3/features/object-lambda)와 Amazon Comprehend에서 제공하는 사전 빌드된 AWS Lambda 함수를 사용하면 애플리케이션으로 반환하기 전에 S3에서 검색된 PII 데이터를 보호할 수 있습니다. 특히 사전 빌드된 [Lambda 함수](https://aws.amazon.com/lambda/)를 수정 함수로 사용하여 S3 객체 Lambda 액세스 포인트에 연결할 수 있습니다. 애플리케이션(예: 분석 애플리케이션)이 [표준 S3 GET 요청](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)을 전송하는 경우, S3 Object Lambda 액세스 포인트를 통해 수행된 이러한 요청은 사전 빌드된 수정 Lambda 함수를 간접 호출하여 지원 S3 액세스 포인트를 통해 기본 데이터 소스에서 검색된 PII 데이터를 감지하고 수정합니다. 그런 다음 S3 객체 Lambda 액세스 포인트가 수정된 결과를 애플리케이션에 다시 반환합니다.

![\[이는 S3 객체 Lambda 워크플로 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/ol-comprehend-image-global.png)


프로세스에서 사전 빌드된 Lambda 함수는 자연어 처리(NLP) 서비스인 [Amazon Comprehend](https://aws.amazon.com/comprehend/)를 사용하여 PII가 텍스트에 존재하는 방식(예: 숫자 또는 단어와 숫자의 조합)에 관계없이 PII가 표현되는 방식의 변형을 캡처할 수 있습니다. Amazon Comprehend는 텍스트에서 컨텍스트를 사용하여 4자리 숫자가 PIN인지, SSN(사회 보장 번호)의 마지막 4자리 숫자나 연도인지 파악할 수도 있습니다. Amazon Comprehend는 모든 텍스트 파일을 UTF-8 형식으로 처리하며 정확성에 영향을 주지 않고 대규모로 PII를 보호할 수 있습니다. 자세한 내용은 *Amazon Comprehend 개발자 가이드*의 [Amazon Comprehend란 무엇입니까?](https://docs.aws.amazon.com/comprehend/latest/dg/what-is.html)를 참조하십시오.

**목표**  
이 자습서에서는 사전 빌드된 Lambda 함수 `ComprehendPiiRedactionS3ObjectLambda`와 함께 S3 객체 Lambda를 사용하는 방법에 대해 알아봅니다. 이 함수는 Amazon Comprehend를 사용하여 PII 엔터티를 감지합니다. 그런 다음 별표로 대체하여 이러한 엔티티를 수정합니다. PII를 수정하면 보안 및 규정 준수에 도움이 되는 민감한 데이터를 숨길 수 있습니다.

또한 쉬운 배포를 위해 S3 Object Lambda와 함께 작동하도록 [AWS Serverless Application Repository](https://aws.amazon.com/serverless/serverlessrepo/)에서 사전 빌드된 AWS Lambda 함수를 사용하고 구성하는 방법에 대해 학습합니다.

**Topics**
+ [사전 조건: 권한이 있는 IAM 사용자 생성](#ol-pii-prerequisites)
+ [1단계: S3 버킷 생성](#ol-pii-step1)
+ [2단계: S3 버킷에 파일 업로드](#ol-pii-step2)
+ [3단계: S3 액세스 포인트 생성](#ol-pii-step3)
+ [4단계: 사전 빌드된 Lambda 함수 구성 및 배포](#ol-pii-step4)
+ [5단계: S3 객체 Lambda 액세스 포인트 생성](#ol-pii-step5)
+ [6단계: S3 객체 Lambda 액세스 포인트를 사용하여 수정된 파일 검색](#ol-pii-step6)
+ [7단계: 정리](#ol-pii-step7)
+ [다음 단계](#ol-pii-next-steps)

## 사전 조건: 권한이 있는 IAM 사용자 생성
<a name="ol-pii-prerequisites"></a>

이 자습서를 시작하기 전에 올바른 권한이 있는 AWS Identity and Access Management 사용자(IAM 사용자)로 로그인할 수 있는 AWS 계정이 있어야 합니다.

그 대신 자습서의 IAM 사용자 자격 증명을 사용하면 됩니다. 이 자습서를 완료하려면 IAM 사용자가 다음 IAM 정책을 연결하여 관련 AWS 리소스에 액세스하고 특정 작업을 수행해야 합니다.

**참고**  
편의상 이 자습서에서는 IAM 사용자를 생성해 사용합니다. 이 자습서를 완료하면 [IAM 사용자 삭제](#ol-pii-step8-delete-user)를 수행해야 합니다. 프로덕션 용도로는 **IAM 사용 설명서에서 [IAM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 따르는 것이 좋습니다. 가장 좋은 방법은 인간 사용자가 ID 제공업체와의 페더레이션을 사용하여 임시 보안 인증으로 AWS에 액세스하도록 하는 것입니다. 워크로드에서 IAM 역할과 함께 임시 보안 인증을 사용하여 AWS에 액세스하도록 하는 것도 좋은 방법입니다. AWS IAM Identity Center를 사용하여 임시 보안 인증으로 사용자를 생성하는 방법에 대해 알아보려면 *AWS IAM Identity Center 사용 설명서*의 [Getting started](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)(시작하기)를 참조하십시오.  
이 자습서에서는 편의상 전체 액세스 정책을 사용합니다. 프로덕션 사용 용도의 경우 [보안 모범 사례](security-best-practices.md#security-best-practices-prevent)에 따라 사용 사례에 필요한 최소한의 권한만 부여하는 것이 좋습니다.

IAM 사용자에게는 다음의 AWS 관리형 정책이 필요합니다.
+ [AmazonS3FullAccess](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonS3FullAccess$jsonEditor) - 객체 Lambda 액세스 포인트를 생성하고 사용할 수 있는 권한을 포함하여 모든 Amazon S3 작업에 권한을 부여합니다.
+ [AWSLambda\$1FullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor) - 모든 Lambda 작업에 권한을 부여합니다.
+ [AWSCloudFormationFullAccess](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AWSCloudFormationFullAccess$serviceLevelSummary) - 모든 AWS CloudFormation 작업에 권한을 부여합니다.
+ [IAMFullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor) - 모든 IAM 작업에 권한을 부여합니다.
+ [IAMAccessAnalyzerReadOnlyAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/IAMAccessAnalyzerReadOnlyAccess$jsonEditor) - IAM 액세스 분석기에서 제공하는 모든 액세스 정보를 읽을 수 있는 권한을 부여합니다.

IAM 사용자를 생성할 때 이러한 기존 정책을 직접 연결할 수 있습니다. IAM 사용자를 생성하는 방법에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM 사용자 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)을 참조하십시오.

또한 IAM 사용자에게는 고객 관리형 정책이 필요합니다. IAM 사용자에게 AWS Serverless Application Repository 리소스 및 작업에 대한 모든 권한을 부여하려면 IAM 정책을 생성하고 이 정책을 IAM 사용자에게 연결해야 합니다.

**IAM 정책을 생성하여 IAM 사용자에게 연결하려면**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **정책**을 선택합니다.

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

1. **시각적 편집기(Visual editor)** 탭의 **서비스**에서 **서비스 선택(Choose a service)**을 선택합니다. 그런 다음 **Serverless Application Repository**를 선택합니다.

1. **작업(Actions)**의 **수동 작업(Manual actions)**에서 이 자습서의 **모든 Serverless Application Repository 작업(serverlessrepo:\$1)**을 선택합니다.

   보안 모범 사례에 따라 사용 사례에 필요한 작업과 리소스에만 권한을 허용해야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하십시오.

1. **리소스(Resources)**에서, 이 자습서에 대해 **모든 리소스(All resources)**를 선택합니다.

   최선의 결과를 위해 특정 계정의 특정 리소스에 대한 권한만 정의해야 합니다. 또는 조건 키를 사용하여 최소 권한을 부여할 수도 있습니다. 자세한 내용은 *IAM 사용 설명서*의 [최소 권한 부여](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)를 참조하십시오.

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

1. **다음: 검토**를 선택합니다.

1. **정책 검토** 페이지에서, 생성하는 정책에 대한 **이름**(예: **tutorial-serverless-application-repository**)과 **설명**(선택 사항)을 입력합니다. 정책 요약을 검토하여 의도한 권한이 부여되었는지 확인한 다음 **정책 생성**을 선택하여 새 정책을 저장합니다.

1. 왼쪽 탐색 창에서 **사용자**를 선택합니다. 그런 다음 이 자습서에 대해 IAM 사용자를 선택합니다.

1. 선택한 사용자의 **요약(Summary)** 페이지에서 **권한(Permissions)**탭을 선택한 후 **권한 추가(Add permissions)**를 선택합니다.

1. **권한 부여(Grant permissions)**에서 **기존 정책 직접 연결(Attach existing policies directly)**을 선택합니다.

1. 앞서 생성한 정책(예: **tutorial-serverless-application-repository**) 옆에 있는 확인란을 선택하고 **다음: 검토(Next: Review)**를 선택합니다.

1. **정책 요약(Permissions summary)**에서 요약을 검토하여 의도한 정책을 연결했는지 확인합니다. 그런 다음 **권한 추가(Add permissions)**를 선택합니다.

## 1단계: S3 버킷 생성
<a name="ol-pii-step1"></a>

버킷을 생성하여 변환하려는 원본 데이터를 저장합니다.

**참고**  
Amazon FSx for OpenZFS 볼륨과 같은 다른 데이터 소스에 액세스 포인트를 연결할 수 있지만 이 자습서에서는 S3 버킷에 연결된 지원 액세스 포인트를 사용합니다.

**버킷을 생성하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷 만들기**를 선택합니다.

   **버킷 만들기** 페이지가 열립니다.

1. **버킷 이름(Bucket Name)**에서 버킷 이름을 입력합니다(예: **tutorial-bucket**).

   Amazon S3의 버킷 이름 지정 규칙에 대한 자세한 내용은 [범용 버킷 이름 지정 규칙](bucketnamingrules.md) 섹션을 참조하세요.

1. **리전(Region)**에서 버킷이 속할 AWS 리전을 선택합니다.

   버킷 리전에 대한 자세한 내용은 [범용 버킷 개요](UsingBucket.md) 섹션을 참조하세요.

1. **이 버킷에 대한 퍼블릭 액세스 차단 설정(Block Public Access settings for this bucket)**에서 해당 설정을 기본값으로 유지합니다(***모든* 퍼블릭 액세스 차단(Block all public access)**이 활성화됨).

   해당 사용 사례에 대해 하나 이상의 설정을 해제해야 하는 경우가 아니라면 모든 설정을 퍼블릭 액세스 차단 설정 활성화 상태로 유지하는 것이 좋습니다. 퍼블릭 액세스 차단에 대한 자세한 내용은 [Amazon S3 스토리지에 대한 퍼블릭 액세스 차단](access-control-block-public-access.md) 섹션을 참조하세요.

1. 나머지 설정은 기본값으로 유지합니다.

   특정 사용 사례에 대한 추가 버킷 설정을 구성하려면 [범용 버킷 생성](create-bucket-overview.md) 섹션을 참조하십시오(선택 사항).

1. **버킷 생성**을 선택합니다.

## 2단계: S3 버킷에 파일 업로드
<a name="ol-pii-step2"></a>

이름, 은행 정보, 전화 번호, SSN 등 다양한 유형의 알려진 PII 데이터가 포함된 텍스트 파일을, 이 자습서의 뒷부분에서 PII를 수정할 원본 데이터로 S3 버킷에 업로드합니다.

예를 들어, 다음의 `tutorial.txt` 파일을 업로드할 수 있습니다. 이 파일은 Amazon Comprehend의 입력 파일의 예입니다.

```
Hello Zhang Wei, I am John. Your AnyCompany Financial Services, 
LLC credit card account 1111-0000-1111-0008 has a minimum payment 
of $24.53 that is due by July 31st. Based on your autopay settings, 
we will withdraw your payment on the due date from your 
bank account number XXXXXX1111 with the routing number XXXXX0000. 

Your latest statement was mailed to 100 Main Street, Any City, 
WA 98121. 
After your payment is received, you will receive a confirmation 
text message at 206-555-0100. 
If you have questions about your bill, AnyCompany Customer Service 
is available by phone at 206-555-0199 or 
email at support@anycompany.com.
```

**S3 버킷에 파일을 업로드하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷(Buckets)** 목록에서, [1단계](#ol-pii-step1)에서 생성한 버킷의 이름(예: **tutorial-bucket**)을 선택하여 파일을 업로드합니다.

1. 버킷의 **객체(Objects)** 탭에서 **업로드(Upload)**를 선택합니다.

1. **업로드(Upload)** 페이지의 **파일 및 폴더(Files and Folders)**에서 **파일 추가(Add Files)**를 선택합니다.

1. 업로드할 파일을 선택한 후 **열기**를 선택합니다. 예를 들어, 앞에서 언급한 `tutorial.txt` 파일 예제를 업로드할 수 있습니다.

1. **업로드**를 선택합니다.

## 3단계: S3 액세스 포인트 생성
<a name="ol-pii-step3"></a>

S3 객체 Lambda 액세스 포인트를 사용하여 원본 데이터에 액세스하고 변환하려면 S3 액세스 포인트를 생성하고 [1단계](#ol-pii-step1)에서 생성한 S3 버킷에 연결해야 합니다. 액세스 포인트는 변환하려는 객체와 동일한 AWS 리전에 있어야 합니다.

이 자습서의 뒷부분에서 이 액세스 포인트를 객체 Lambda 액세스 포인트에 대한 지원 액세스 포인트로 사용합니다.

**액세스 포인트 생성**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 탐색 창에서 **액세스 포인트(Access Points)**를 선택합니다.

1. **액세스 포인트(Access Points)** 페이지에서 **액세스 포인트 생성(Create access point)**을 선택합니다.

1. **액세스 포인트 이름(Access point name)** 필드에 액세스 포인트 이름을 입력합니다(예: **tutorial-pii-access-point**).

   액세스 포인트 명명에 대한 자세한 내용은 [액세스 포인트 이름 지정 규칙](access-points-restrictions-limitations-naming-rules.md#access-points-names) 섹션을 참조하십시오.

1. **데이터 소스** 필드에서 [1단계](#ol-pii-step1)에서 생성한 버킷의 이름을 입력합니다(예: **tutorial-bucket**). S3는 액세스 포인트를 이 버킷에 연결합니다.

   (선택 사항) **S3 찾아보기(Browse S3)**를 선택하여 계정의 버킷을 찾아보고 검색할 수 있습니다. **S3 찾아보기(Browse S3)**를 선택할 경우 원하는 버킷을 선택한 후 **경로 선택(Choose path)**을 선택하여 **버킷 이름(Bucket name)** 필드를 해당 버킷의 이름으로 채웁니다.

1. **네트워크 오리진(Network origin)**에서 **인터넷(Internet)**을 선택합니다.

   액세스 포인트의 네트워크 오리진에 대한 자세한 내용은 [가상 프라이빗 클라우드(VPC)로 제한된 액세스 포인트 생성](access-points-vpc.md) 섹션을 참조하십시오.

1. 액세스 포인트에는 기본값으로 모든 퍼블릭 액세스 차단 설정이 활성화되어 있습니다. ***모든* 퍼블릭 액세스 차단(Block all public access)** 설정을 활성화 상태로 유지하는 것이 좋습니다. 자세한 정보는 [범용 버킷의 액세스 포인트에 대한 퍼블릭 액세스 관리](access-points-bpa-settings.md)을 참조하세요.

1. 다른 모든 액세스 포인트 설정의 경우 기본 설정을 그대로 유지합니다.

   (선택 사항) 사용 사례를 지원하도록 액세스 포인트 설정을 수정할 수 있습니다. 이 자습서에서는 기본 설정을 그대로 유지하는 것이 좋습니다.

   (선택 사항) 액세스 포인트에 대한 액세스를 관리해야 하는 경우 액세스 포인트 정책을 지정할 수 있습니다. 자세한 정보는 [액세스 포인트의 정책 예시](access-points-policies.md#access-points-policy-examples)을 참조하세요.

1. **액세스 포인트 생성**을 선택합니다.

## 4단계: 사전 빌드된 Lambda 함수 구성 및 배포
<a name="ol-pii-step4"></a>

PII 데이터를 수정하려면 S3 객체 Lambda 액세스 포인트와 함께 사용할 사전 빌드된 AWS Lambda 함수 `ComprehendPiiRedactionS3ObjectLambda`를 구성하고 배포합니다.

**Lambda 함수를 구성하고 배포하려면**

1. AWS Management Console에 로그인한 후에 AWS Serverless Application Repository에서 [https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:839782855223:applications/ComprehendPiiRedactionS3ObjectLambda](https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:839782855223:applications/ComprehendPiiRedactionS3ObjectLambda) 함수를 확인합니다.

1. **애플리케이션 설정(Application settings)**의 **애플리케이션 이름(Application name)**에서 이 자습서의 기본 값(`ComprehendPiiRedactionS3ObjectLambda`)을 그대로 유지합니다.

   (선택 사항) 이 애플리케이션에 부여할 이름을 입력할 수 있습니다. 동일한 공유 데이터 집합에 대한 서로 다른 액세스 요구에 대해 여러 Lambda 함수를 구성하려는 경우 이 작업을 수행할 수 있습니다.

1. **MaskCharacter**에서 기본값(`*`)을 그대로 유지합니다. 마스크 문자는 수정된 PII 엔터티의 각 문자를 대체합니다.

1. **MaskMode**에서 기본값(**MASK**)을 그대로 유지합니다. **MaskMode** 값은 PII 엔터티가 `MASK`문자 또는 `PII_ENTITY_TYPE` 값으로 수정되는지 여부를 지정합니다.

1. 지정된 유형의 데이터를 수정하기 위해 **PiiEntityTypes**에서 기본값(**모두(ALL)**)을 그대로 유지합니다. **PiiEntityTypes** 값은 수정을 고려할 PII 엔터티 유형을 지정합니다.

   지원되는 PII 엔터티 유형 목록에 대한 자세한 내용은 *Amazon Comprehend 개발자 가이드*의 [개인 식별 정보(PII) 감지](https://docs.aws.amazon.com/comprehend/latest/dg/how-pii.html)를 참조하십시오.

1. 나머지 설정은 기본값으로 유지합니다.

   특정 사용 사례에 대한 추가 설정을 구성하려면 페이지 왼쪽의 **Readme 파일** 섹션을 참조하십시오.

1. **I acknowledge that this app creates custom IAM roles(이 앱이 사용자 지정 IAM 역할을 생성하는 것을 확인)** 옆 확인란을 선택합니다.

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

1. 새 애플리케이션 페이지의 **리소스(Resources)**에서, Lambda 함수 페이지에서 함수를 검토하기 위해 배포한 Lambda 함수의 **논리 ID(Logical ID)**를 선택합니다.

## 5단계: S3 객체 Lambda 액세스 포인트 생성
<a name="ol-pii-step5"></a>

S3 객체 Lambda 액세스 포인트는 해당 함수가 S3 액세스 포인트에서 검색된 PII 데이터를 수정할 수 있도록 S3 GET 요청에서 직접 Lambda 함수를 호출할 수 있는 유연성을 제공합니다. S3 객체 Lambda 액세스 포인트를 생성하고 구성하는 경우, 수정 Lambda 함수를 지정하여 Lambda가 사용할 사용자 지정 파라미터로 JSON 형식의 이벤트 컨텍스트를 호출하고 제공해야 합니다.

이벤트 컨텍스트는 S3 객체 Lambda에서 Lambda로 전달된 이벤트에서 수행되는 요청에 대한 정보를 제공합니다. 이벤트 컨텍스트의 모든 필드에 대한 자세한 내용은 [이벤트 컨텍스트 형식 및 사용법](olap-event-context.md) 섹션을 참조하십시오.

**S3 객체 Lambda 액세스 포인트를 생성하는 방법**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **객체 Lambda 액세스 포인트(Object Lambda Access Points)**를 선택합니다.

1. **객체 Lambda 액세스 포인트(Object Lambda Access Points)** 페이지에서 **객체 Lambda 액세스 포인트 생성(Create Object Lambda Access Point)**을 선택합니다.

1. **객체 Lambda 액세스 포인트 이름**에서 객체 Lambda 액세스 포인트에 사용할 이름을 입력합니다(예: **tutorial-pii-object-lambda-accesspoint**).

1. **지원 액세스 포인트(Supporting Access Point)**에서, [3단계](#ol-pii-step3)에서 생성한 표준 액세스 포인트(예: **tutorial-pii-access-point**)를 입력하거나 검색한 후 **지원 액세스 포인트 선택(Choose supporting Access Point)**.을 선택합니다.

1. **S3 API**의 경우, Lambda 함수가 처리할 S3 버킷에서 객체를 검색하려면 **GetObject**를 선택합니다.

1. **Lambda 함수 호출(Invoke Lambda function)**에서, 이 자습서의 다음 두 가지 옵션 중 하나를 선택할 수 있습니다.
   + **계정의 함수에서 선택**을 선택한 후, [4단계](#ol-pii-step4)에서 배포한 Lambda 함수(예: **serverlessrepo-ComprehendPiiRedactionS3ObjectLambda**)를 **Lambda 함수** 드롭다운 목록에서 선택합니다.
   + **ARN 입력(Enter ARN)**을 선택한 후, [4단계](#ol-pii-step4)에서 생성한 Lambda 함수의 Amazon 리소스 이름(ARN)을 입력합니다.

1. **Lambda 함수 버전(Lambda function version)**에서, **\$1LATEST**([4단계](#ol-pii-step4)에서 배포한 Lambda 함수의 최신 버전)를 선택합니다.

1. (선택 사항) Lambda 함수가 범위 및 부분 번호 헤더가 있는 GET 요청을 인식하고 처리해야 하는 경우 **Lambda 함수는 범위를 사용하여 요청을 지원합니다(Lambda function supports requests using range)** 및 **Lambda 함수는 부분 번호를 사용하여 요청을 지원합니다(Lambda function supports requests using part numbers)**를 선택합니다. 그렇지 않으면 이 두 확인란의 선택을 취소합니다.

   S3 객체 Lambda에서 범위 또는 부분 번호를 사용하는 방법에 대한 자세한 내용은 [Range 및 partNumber 헤더 작업](range-get-olap.md) 섹션을 참조하십시오.

1. (선택 사항) **페이로드 - *선택 사항*(Payload - optional)**에서, Lambda 함수에 추가 정보를 제공하는 JSON 텍스트를 추가합니다.

   페이로드는 특정 S3 객체 Lambda 액세스 포인트에서 오는 모든 호출에 대한 입력으로 Lambda 함수에 제공할 수 있는 선택적 JSON 텍스트입니다. 동일한 Lambda 함수를 호출하는 여러 객체 Lambda 액세스 포인트에 대해 사용자 지정하기 위해 서로 다른 파라미터를 사용하여 페이로드를 구성할 수 있으므로 Lambda 함수의 유연성을 높일 수 있습니다.

   페이로드에 대한 자세한 내용은 [이벤트 컨텍스트 형식 및 사용법](olap-event-context.md) 섹션을 참조하십시오.

1. (선택 사항) **요청 지표 - *선택 사항***에서 **비활성화** 또는 **활성화**를 선택하여 Object Lambda 액세스 포인트에 Amazon S3 모니터링을 추가합니다. 요청 지표는 표준 Amazon CloudWatch 요금으로 청구됩니다. 자세한 내용은 [CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/)을 참조하십시오.

1. **객체 Lambda 액세스 포인트 정책 - *선택 사항*(Object Lambda Access Point policy - optional)**에서 기본 설정을 그대로 유지합니다.

   리소스 정책을 설정할 수 있습니다(선택 사항). 이 리소스 정책은 지정된 객체 Lambda 액세스 포인트를 사용할 수 있는 권한을 `GetObject` API에 부여합니다.

1. 나머지 설정은 기본값으로 유지하고 **객체 Lambda 액세스 포인트 생성(Create Object Lambda Access Point)**을 선택합니다.

## 6단계: S3 객체 Lambda 액세스 포인트를 사용하여 수정된 파일 검색
<a name="ol-pii-step6"></a>

이제 S3 객체 Lambda가 원본 파일에서 PII 데이터를 수정할 준비가 되었습니다.

**S3 객체 Lambda 액세스 포인트를 사용하여 수정된 파일을 검색하려면**

S3 객체 Lambda 액세스 포인트를 통해 파일을 검색하도록 요청할 때 S3 객체 Lambda에 대한 `GetObject` API 호출을 수행합니다. S3 객체 Lambda는 Lambda 함수를 호출하여 PII 데이터를 수정하고 변환된 데이터를 표준 S3 `GetObject` API 호출에 대한 응답으로 반환합니다.

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **객체 Lambda 액세스 포인트(Object Lambda Access Points)**를 선택합니다.

1. **객체 Lambda 액세스 포인트** 페이지에서 [5단계](#ol-pii-step5)에서 생성한 S3 객체 Lambda 액세스 포인트를 선택합니다(예: **tutorial-pii-object-lambda-accesspoint**).

1. S3 객체 Lambda 액세스 포인트의 **객체** 탭에서 [2단계](#ol-pii-step2)에서 S3 버킷에 업로드한 파일과 이름이 같은 파일을 선택합니다(예: `tutorial.txt`) 

   이 파일에는 변환된 모든 데이터가 포함되어야 합니다.

1. 변환된 데이터를 보려면 **열기(Open)** 또는 **다운로드(Download)**를 선택합니다.

    다음 예제와 같이 수정된 파일이 표시되어야 합니다.

   ```
   Hello *********. Your AnyCompany Financial Services, 
   LLC credit card account ******************* has a minimum payment 
   of $24.53 that is due by *********. Based on your autopay settings, 
   we will withdraw your payment on the due date from your 
   bank account ********** with the routing number *********. 
   
   Your latest statement was mailed to **********************************. 
   After your payment is received, you will receive a confirmation 
   text message at ************. 
   If you have questions about your bill, AnyCompany Customer Service 
   is available by phone at ************ or 
   email at **********************.
   ```

## 7단계: 정리
<a name="ol-pii-step7"></a>

실습용으로만 S3 객체 Lambda를 통해 데이터를 수정한 경우에는 요금이 발생하지 않도록 할당한 AWS 리소스를 삭제합니다.

**Topics**
+ [객체 Lambda 액세스 포인트 삭제](#ol-pii-step8-delete-olap)
+ [S3 액세스 포인트 삭제](#ol-pii-step8-delete-ap)
+ [Lambda 함수 삭제](#ol-pii-step8-delete-lambda-function)
+ [CloudWatch 로그 그룹 삭제](#ol-pii-step8-delete-cloudwatch)
+ [S3 소스 버킷에서 원본 파일 삭제](#ol-pii-step8-delete-file)
+ [S3 소스 버킷 삭제](#ol-pii-step8-delete-bucket)
+ [Lambda 함수용 IAM 역할 삭제](#ol-pii-step8-delete-lambda-role)
+ [IAM 사용자용 고객 관리형 정책 삭제](#ol-pii-step8-delete-function-policy)
+ [IAM 사용자 삭제](#ol-pii-step8-delete-user)

### 객체 Lambda 액세스 포인트 삭제
<a name="ol-pii-step8-delete-olap"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **객체 Lambda 액세스 포인트(Object Lambda Access Points)**를 선택합니다.

1. **객체 Lambda 액세스 포인트** 페이지에서 [5단계](#ol-pii-step5)에서 생성한 S3 객체 Lambda 액세스 포인트 왼쪽에 있는 옵션 버튼을 선택합니다(예: **tutorial-pii-object-lambda-accesspoint**).

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

1. 표시되는 텍스트 필드에 객체 Lambda 액세스 포인트 이름을 입력하여 삭제 여부를 확인하고 **삭제**를 선택합니다.

### S3 액세스 포인트 삭제
<a name="ol-pii-step8-delete-ap"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 탐색 창에서 **액세스 포인트(Access Points)**를 선택합니다.

1. [3단계](#ol-pii-step3)에서 생성한 액세스 포인트(예: **tutorial-pii-access-point**)로 이동한 후 액세스 포인트 이름 옆에 있는 옵션 버튼을 선택합니다.

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

1. 표시되는 텍스트 필드에 액세스 포인트 이름을 입력하여 삭제 여부를 확인하고 **삭제(Delete)**를 선택합니다.

### Lambda 함수 삭제
<a name="ol-pii-step8-delete-lambda-function"></a>

1. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)에 있는 AWS Lambda 콘솔의 왼쪽 탐색 창에서 **함수(Functions)**를 선택합니다.

1. [4단계](#ol-pii-step4)에서 생성한 함수(예: **serverlessrepo-ComprehendPiiRedactionS3ObjectLambda**)를 선택합니다.

1. **작업**을 선택한 후 **삭제**를 선택합니다.

1. **함수 삭제(Delete function)** 대화 상자에서 **삭제(Delete)**를 선택합니다.

### CloudWatch 로그 그룹 삭제
<a name="ol-pii-step8-delete-cloudwatch"></a>

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **로그 그룹(Log groups)**을 선택합니다.

1. 이름이 [4단계](#ol-pii-step4)에서 생성한 Lambda 함수로 끝나는 로그 그룹을 찾습니다(예: **serverlessrepo-ComprehendPiiRedactionS3ObjectLambda**).

1. **작업(Actions)**을 선택한 후 **로그 그룹 삭제(Delete log group(s))**를 선택합니다.

1. **로그 그룹 삭제(Delete log group(s))** 대화 상자에서 **삭제(Delete)**를 선택합니다.

### S3 소스 버킷에서 원본 파일 삭제
<a name="ol-pii-step8-delete-file"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷 이름(Bucket name)** 목록에서, [2단계](#ol-pii-step2)에서 원본 파일을 업로드한 버킷의 이름을 선택합니다(예: **tutorial-bucket**).

1. 삭제할 객체의 이름 왼쪽에 있는 확인란을 선택합니다(예: `tutorial.txt`).

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

1. **객체 삭제(Delete objects)** 페이지의 **객체를 영구적으로 삭제하시겠습니까?(Permanently delete objects?)** 섹션에서 텍스트 상자에 **permanently delete**를 입력하여 이 객체의 삭제 여부를 확인합니다.

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

### S3 소스 버킷 삭제
<a name="ol-pii-step8-delete-bucket"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷(Buckets)** 목록에서, [1단계](#ol-pii-step1)에서 생성한 버킷의 이름 옆에 있는 옵션 버튼을 선택합니다(예: **tutorial-bucket**).

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

1. **버킷 삭제(Delete objects)** 페이지의 텍스트 필드에 버킷 이름을 입력하여 버킷의 삭제 여부를 확인한 다음 **버킷 삭제(Delete bucket)**를 선택합니다.

### Lambda 함수용 IAM 역할 삭제
<a name="ol-pii-step8-delete-lambda-role"></a>

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 탐색 창에서 **역할(Roles)**을 선택한 후 삭제할 역할 이름 옆에 있는 확인란을 선택합니다. 역할 이름은 [4단계](#ol-pii-step4)에서 배포한 Lambda 함수의 이름으로 시작합니다(예: **serverlessrepo-ComprehendPiiRedactionS3ObjectLambda**).

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

1. **삭제(Delete)** 대화 상자에서 텍스트 입력 필드에 역할 이름을 입력하여 삭제 여부를 확인합니다. 그런 다음 **삭제**를 선택합니다.

### IAM 사용자용 고객 관리형 정책 삭제
<a name="ol-pii-step8-delete-function-policy"></a>

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **정책**을 선택합니다.

1. **정책(Policies)** 페이지의 검색 상자에서, [사전 조건(Prerequisites)](#ol-pii-prerequisites)에서 생성한 고객 관리형 정책의 이름(예: **tutorial-serverless-application-repository**)을 입력하여 정책 목록을 필터링합니다. 삭제할 정책 이름 옆에 있는 옵션 버튼을 선택합니다.

1. **작업**을 선택한 후 **삭제**를 선택합니다.

1. 표시되는 텍스트 필드에 해당 이름을 입력하여 이 정책의 삭제 여부를 확인하고 **삭제(Delete)**를 선택합니다.

### IAM 사용자 삭제
<a name="ol-pii-step8-delete-user"></a>

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **사용자(Users)**를 선택한 후 삭제할 사용자 이름 옆에 있는 확인란을 선택합니다.

1. 페이지 상단에서 **삭제(Delete)**를 선택합니다.

1. ***사용자 이름*을 삭제하시겠습니까?(Delete user name?)** 대화 상자에서 텍스트 입력 필드에 역할 이름을 입력하여 사용자의 삭제 여부를 확인합니다. **삭제**를 선택합니다.

## 다음 단계
<a name="ol-pii-next-steps"></a>

이 자습서를 완료한 후에는 다음과 같은 관련 사용 사례를 더 자세히 탐색할 수 있습니다.
+ 여러 S3 객체 Lambda 액세스 포인트를 생성하고 데이터 접근자의 비즈니스 요구에 따라 특정 유형의 PII를 수정하도록 다르게 구성된 사전 빌드된 Lambda 함수를 사용하여 이 액세스 포인트를 활성화할 수 있습니다.

  각 유형의 사용자는 IAM 역할을 수임하고 하나의 S3 객체 Lambda 액세스 포인트(IAM 정책을 통해 관리됨)에만 액세스할 수 있습니다. 그런 다음 다른 수정 사용 사례에 대해 구성된 각 `ComprehendPiiRedactionS3ObjectLambda` Lambda 함수를 다른 S3 객체 Lambda 액세스 포인트에 연결합니다. 각 S3 객체 Lambda 액세스 포인트에 대해 공유 데이터 집합을 저장하는 S3 버킷에서 데이터를 읽을 수 있는 지원 S3 액세스 포인트를 소유할 수 있습니다.

  사용자가 S3 액세스 포인트를 통해서만 버킷에서 읽을 수 있도록 허용하는 S3 버킷 정책을 생성하는 방법에 대한 자세한 내용은 [액세스 포인트를 사용하도록 IAM 정책 구성](access-points-policies.md) 섹션을 참조하십시오.

  Lambda 함수, S3 액세스 포인트 및 S3 객체 Lambda 액세스 포인트에 액세스할 수 있는 권한을 사용자에게 부여하는 방법에 대한 자세한 내용은 [객체 Lambda 액세스 포인트에 대한 IAM 정책 구성](olap-policies.md) 섹션을 참조하십시오.
+ 자체 Lambda 함수를 빌드하고 사용자 지정된 Lambda 함수와 함께 S3 객체 Lambda를 사용하여 특정 데이터 요구 사항을 충족할 수 있습니다.

  예를 들어 다양한 데이터 값을 탐색하려면 S3 객체 Lambda와 추가적인 [Amazon Comprehend 기능](https://aws.amazon.com/comprehend/features/)(예: 엔터티 인식, 핵심 구문 인식, 감정 분석, 문서 분류)을 사용하는 자체 Lambda 함수를 사용하여 데이터를 처리할 수 있습니다. 또한 S3 객체 Lambda를 [Amazon Comprehend Medical](https://aws.amazon.com/comprehend/medical/)(HIPAA 적격 NLP 서비스)과 함께 사용하여 컨텍스트 인식 방식으로 데이터를 분석하고 추출할 수 있습니다.

  S3 객체 Lambda 및 자체 Lambda 함수를 사용하여 데이터를 변환하는 방법에 대한 자세한 내용은 [자습서: S3 객체 Lambda를 사용하여 애플리케이션의 데이터 변환](tutorial-s3-object-lambda-uppercase.md) 섹션을 참조하십시오.

# S3 Object Lambda 디버깅 및 문제 해결
<a name="olap-debugging-lambda"></a>

**참고**  
2025년 11월 7일부터 S3 Object Lambda는 현재 서비스를 사용하고 있는 기존 고객과 AWS 파트너 네트워크(APN) 파트너를 선택하는 고객만 사용할 수 있습니다. S3 Object Lambda와 유사한 기능의 경우 [Amazon S3 Object Lambda 가용성 변경](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html) 섹션에서 자세히 알아보세요.

Amazon S3 객체 Lambda 액세스 지점에 대한 요청에서 Lambda 함수 호출 또는 실행에 문제가 발생하면 새로운 오류 응답이 발생할 수 있습니다. 이러한 오류는 표준 Amazon S3 오류와 동일한 형식을 따릅니다. S3 객체 Lambda 오류에 대한 자세한 내용은 *Amazon Simple Storage Service API 참조*에서 [S3 객체 Lambda 오류 코드 목록](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#S3ObjectLambdaErrorCodeList)을 참조하십시오.

일반적인 Lambda 함수 디버깅에 대한 자세한 내용은 *AWS Lambda 개발자 안내서*에서 [Lambda 애플리케이션 모니터링 및 문제 해결](https://docs.aws.amazon.com/lambda/latest/dg/lambda-monitoring.html )을 참조하십시오.

표준 Amazon S3 오류에 대한 자세한 내용은 *Amazon Simple Storage Service API 참조*에서 [오류 응답](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html)을 참조하십시오.

Amazon CloudWatch에서 객체 Lambda 액세스 포인트에 대한 요청 지표를 활성화할 수 있습니다. 이러한 지표는 액세스 지점의 운영 성능을 모니터링하는 데 도움이 됩니다. 객체 Lambda 액세스 포인트를 생성하는 동안 또는 생성한 후에 요청 지표를 활성화할 수 있습니다. 자세한 내용은 [CloudWatch의 S3 객체 Lambda 요청 지표](metrics-dimensions.md#olap-cloudwatch-metrics) 섹션을 참조하세요.

객체 Lambda 액세스 포인트에 수행된 요청에 대한 보다 세부적인 로깅 정보를 얻으려면 AWS CloudTrail 데이터 이벤트를 활성화할 수 있습니다. 자세한 내용은 *AWS CloudTrail 사용 설명서*의 [추적을 위해 데이터 이벤트 로깅](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html)을 참조하십시오.

S3 객체 Lambda 자습서의 경우 다음을 참조하십시오.
+ [자습서: S3 객체 Lambda를 사용하여 애플리케이션의 데이터 변환](tutorial-s3-object-lambda-uppercase.md)
+ [자습서: S3 객체 Lambda 및 Amazon Comprehend를 사용하여 PII 데이터 감지 및 수정](tutorial-s3-object-lambda-redact-pii.md)
+ [Tutorial: Using S3 Object Lambda to dynamically watermark images as they are retrieved(자습서: S3 객체 Lambda를 사용하여 이미지를 검색할 때 동적으로 워터마크 지정](https://aws.amazon.com/getting-started/hands-on/amazon-s3-object-lambda-to-dynamically-watermark-images/?ref=docs_gateway/amazons3/transforming-objects.html)

표준 액세스 포인트에 대한 자세한 내용은 [액세스 포인트로 공유 데이터세트에 대한 액세스 관리](access-points.md) 섹션을 참조하십시오.

버킷 작업에 대한 자세한 내용은 [범용 버킷 개요](UsingBucket.md) 섹션을 참조하세요. 객체 작업에 대한 자세한 내용은 [Amazon S3 객체 개요](UsingObjects.md)을 참조하세요.