기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Lambda를 사용하여 서버리스로 파일 처리
파일 처리 워크플로는 NFS 또는 SMB 파일 공유에 도착하는 파일, 즉 지사에서 스캔한 문서, 필드 팀이 업로드한 이미지, 고객 센터에서 캡처한 오디오 또는 파트너가 제공한 데이터 파일로 시작하는 경우가 많습니다.
FSx for ONTAP 볼륨에 연결된 Amazon S3 액세스 포인트를 사용하여 AWS Lambda 함수는 Amazon S3 API를 사용하여 파일을 직접 읽고 씁니다. 파일 수준 작업은 사용자와 애플리케이션이 NFS 및 SMB를 통해 액세스하는 것과 동일한 데이터에 대해 서버리스로 처리할 수 있습니다.
이 자습서에서는 세 가지 일반적인 파일 처리 패턴을 보여줍니다. 각 예제는 액세스 포인트를 통해 볼륨에서 파일을 읽고 AWS 서비스 또는 라이브러리로 처리한 다음 결과를 볼륨에 다시 씁니다.
| 예제 | Input | 처리 | 출력 |
|---|---|---|---|
| 예제 1: 이미지 썸네일 생성 | JPEG 이미지 | Pillow(이미지 라이브러리) | 크기 조정된 썸네일 |
| 예제 2: 문서에서 텍스트 추출 | PDF 문서 | Amazon Textract | 추출된 텍스트(JSON) |
| 예제 3: 오디오 파일 트랜스크립션 | MP3 오디오 | Amazon Transcribe | 트랜스크립트(JSON) |
참고
이 자습서를 완료하는 데 약 40~60분이 걸립니다. AWS 서비스 사용한 에는 생성한 리소스에 대한 요금이 발생합니다. 정리 섹션을 포함하여 모든 단계를 즉시 완료하면 미국 동부(버지니아 북부)에서 예상 비용이 1 USD 미만입니다 AWS 리전. 이 견적에는 FSx for ONTAP 볼륨 자체에 대한 지속적인 요금은 포함되지 않습니다.
사전 조건
시작하기 전에 다음 항목이 준비되었는지 확인합니다.
Amazon S3 액세스 포인트가 연결된 FSx for ONTAP 볼륨입니다. 액세스 포인트 생성에 대한 지침은 섹션을 참조하세요액세스 포인트 생성.
액세스 포인트의 액세스 포인트 별칭입니다. Amazon FSx 콘솔에서 또는를 실행하여 찾을 수 있습니다
aws fsx describe-s3-access-point-attachments.AWS CLI 버전 1 또는 버전 2가 설치 및 구성되었습니다. 이 자습서의
aws lambda invoke명령에는 원시 JSON 페이로드가 base64로 해석되지 않도록 AWS CLI 버전 2에 필요한--cli-binary-format raw-in-base64-out옵션이 포함되어 있습니다. AWS CLI 버전 1을 사용하는 경우 해당 옵션을 생략합니다.호출자(이 자습서를 실행하는 사용자 또는 역할)가 Lambda 함수(
lambda:CreateFunction,lambda:InvokeFunction)를 호출하고, Amazon S3 액세스 포인트(s3:GetObject,s3:PutObject)에 액세스하고, Lambda 실행 역할()을 전달할 수 있는 IAM 권한입니다iam:PassRole.
참고
이 자습서에서는 함수가 VPC 외부의 관리형 네트워크에서 실행되는 기본 Lambda 구성을 사용합니다. 이 경우 함수가 액세스할 수 있도록 액세스 포인트에 인터넷 네트워크 오리진이 있어야 합니다. Lambda 함수를 VPC에 연결하는 경우 액세스 포인트에서 VPC 네트워크 오리진을 대신 사용할 수 있습니다. VPC에는 Amazon S3 게이트웨이 또는 인터페이스 엔드포인트가 있어야 합니다. 자세한 내용은 Amazon S3 액세스 포인트에 대한 네트워크 액세스 구성 단원을 참조하십시오.
1단계: 샘플 파일 업로드
다음 샘플 파일을 다운로드하여 액세스 포인트를 통해 FSx for ONTAP 볼륨에 업로드합니다. 이 자습서 전체에서를 액세스 포인트 별칭으로 바꿉니다.my-ap-alias-ext-s3alias
샘플 이미지: NASA 블루 마블 이미지
(퍼블릭 도메인, 2.4MB)를 다운로드하여 로 저장합니다 sample-image.jpg.샘플 오디오: Amazon Transcribe 시작하기 자습서(410KB)에서 샘플 오디오 파일을
다운로드하고 로 저장합니다 sample-audio.mp3.
액세스 포인트를 통해 샘플 파일을 FSx for ONTAP 볼륨에 업로드합니다.
$aws s3 cp sample-image.jpg s3://my-ap-alias-ext-s3alias/samples/images/sample-image.jpg aws s3 cp sample-audio.mp3 s3://my-ap-alias-ext-s3alias/samples/audio/sample-audio.mp3
참고
샘플 이미지는 NASA 블루 마블 사진(퍼블릭 도메인, 2.4MB)입니다. 샘플 오디오는 Amazon Transcribe 시작하기 자습서(410KB)에서 가져온 것입니다. 샘플 PDF는에서 생성됩니다예제 2: 문서에서 텍스트 추출.
2단계: Lambda 실행 역할 생성
Lambda 함수는 실행 역할을 수임하여 다른 함수와 상호 작용합니다 AWS 서비스. 이 자습서에서는 CloudWatch Logs 로깅에 대한 AWS관리형 AWSLambdaBasicExecutionRole 정책을 연결한 다음 Amazon S3 액세스 포인트와 예제에서 사용하는 Textract 및 Transcribe APIs에 대한 액세스 권한을 부여하는 인라인 정책을 추가합니다.
, region및 account-id를 값으로 바꿉니다.access-point-name
다음 신뢰 정책을 로 저장합니다
trust-policy.json.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }다음 인라인 권한 정책을 로 저장합니다
permissions-policy.json. 액세스 포인트 및 예제에서 사용하는 추가 서비스에 대한 액세스 권한을 부여합니다.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:region:account-id:accesspoint/access-point-name", "arn:aws:s3:region:account-id:accesspoint/access-point-name/object/*" ] }, { "Effect": "Allow", "Action": ["textract:DetectDocumentText"], "Resource": "*" }, { "Effect": "Allow", "Action": [ "transcribe:StartTranscriptionJob", "transcribe:GetTranscriptionJob" ], "Resource": "*" } ] }역할을 생성하고 관리형 로깅 정책을 연결한 다음 인라인 정책을 연결합니다.
$aws iam create-role \ --role-namefsxn-lambda-file-processor\ --assume-role-policy-document file://trust-policy.json aws iam attach-role-policy \ --role-namefsxn-lambda-file-processor\ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam put-role-policy \ --role-namefsxn-lambda-file-processor\ --policy-name fsxn-access-point-policy \ --policy-document file://permissions-policy.json
워크플로에 통합
이 자습서의 예제에서는 테스트 이벤트와 함께 수동 호출을 사용합니다. 프로덕션 환경에서는 다음 접근 방식을 사용하여 이러한 함수를 자동으로 트리거할 수 있습니다.
Amazon EventBridge 일정. 함수를 반복 일정(예: 매시간 또는 매일)으로 실행하여 새 파일을 처리합니다. 함수는 액세스 포인트를 통해 파일을 나열하고 아직 처리되지 않은를 처리할 수 있습니다. 자세한 내용은 Amazon EventBridge 사용 설명서의 EventBridge를 사용하여 Lambda 함수 예약을 참조하세요. EventBridge
Amazon API Gateway. 사용자 또는 애플리케이션이 온디맨드 방식으로 특정 파일의 처리를 요청할 수 있도록 함수를 HTTP API로 노출합니다. 자세한 내용은 Amazon API Gateway API Gateway 개발자 안내서의 Lambda 통합을 사용하여 API Gateway REST API 빌드를 참조하세요.
Step Functions. 여러 Lambda 함수를 결합하는 다단계 파일 처리 파이프라인을 오케스트레이션합니다. 예를 들어 문서에서 텍스트를 추출하고 번역한 다음 결과를 볼륨에 다시 쓰는 워크플로가 있습니다. 자세한 내용은 AWS Step Functions 개발자 안내서의 Step Functions로 Lambda 호출을 참조하세요.
예제 1: 이미지 썸네일 생성
이 예제에서는 FSx for ONTAP 볼륨에서 JPEG 이미지를 읽고, Pillow 이미지 라이브러리를 사용하여 200픽셀 썸네일로 크기를 조정하고, 썸네일을 볼륨에 다시 씁니다.
Lambda 함수 코드
다음 코드를 로 저장합니다lambda_function.py.
import boto3 from io import BytesIO from PIL import Image s3 = boto3.client('s3') def lambda_handler(event, context): bucket = event['access_point_alias'] key = event['key'] # Read the image from FSx through the access point response = s3.get_object(Bucket=bucket, Key=key) image_data = response['Body'].read() # Resize to thumbnail img = Image.open(BytesIO(image_data)) img.thumbnail((200, 200)) # Write the thumbnail back to FSx buffer = BytesIO() img.save(buffer, format='JPEG', quality=85) buffer.seek(0) thumbnail_key = key.rsplit('.', 1)[0] + '_thumbnail.jpg' s3.put_object( Bucket=bucket, Key=thumbnail_key, Body=buffer.getvalue(), ContentType='image/jpeg' ) return { 'original_size': len(image_data), 'thumbnail_size': len(buffer.getvalue()), 'thumbnail_key': thumbnail_key }
함수 생성 및 호출
이 함수에는 Pillow 라이브러리가 필요합니다. Lambda Linux 런타임용으로 빌드된 Pillow가 포함된 배포 패키지를 생성합니다.
$# Create a deployment package with Pillow for Lambda (Linux) mkdir package && pip install Pillow -t package/ \ --platform manylinux2014_x86_64 --only-binary=:all: cd package && zip -r ../thumbnail-function.zip . cd .. && zip thumbnail-function.zip lambda_function.py # Create the function aws lambda create-function \ --function-namefsxn-thumbnail-generator\ --runtime python3.12 \ --handler lambda_function.lambda_handler \ --role arn:aws:iam::account-id:role/fsxn-lambda-file-processor\ --zip-file fileb://thumbnail-function.zip \ --timeout 30 \ --memory-size 256 # Invoke with a test event aws lambda invoke \ --function-namefsxn-thumbnail-generator\ --cli-binary-format raw-in-base64-out \ --payload '{"access_point_alias": "my-ap-alias-ext-s3alias", "key": "samples/images/sample-image.jpg"}' \ response.json cat response.json
결과 확인
$aws s3 ls s3://my-ap-alias-ext-s3alias/samples/images/2024-01-23 12:19:32 2566770 sample-image.jpg 2024-01-23 12:25:49 7065 sample-image_thumbnail.jpg
원래 2.4MB 이미지(5400 × 2700픽셀)의 크기를 7KB 썸네일(200 × 100픽셀)로 조정했습니다.
예제 2: 문서에서 텍스트 추출
이 예제에서는 FSx for ONTAP 볼륨에서 PDF 문서를 읽고 Amazon Textract로 전송하여 텍스트를 추출한 다음 추출된 텍스트를 JSON 파일로 볼륨에 다시 씁니다.
샘플 PDF 생성 및 업로드
이 예제에서는 FSx for ONTAP 볼륨에 PDF 문서가 필요합니다. 다음 Python 스크립트는 간단한 인보이스 PDF를 생성하여 액세스 포인트를 통해 업로드합니다. 로컬 시스템(Lambda 아님)에서이 스크립트를 실행합니다.
$pip install fpdf2 boto3
# create_invoice.py — run locally to generate and upload a sample PDF from fpdf import FPDF import boto3 pdf = FPDF() pdf.add_page() pdf.set_font("Helvetica", "B", 24) pdf.cell(0, 15, "INVOICE", new_x="LMARGIN", new_y="NEXT", align="C") pdf.set_font("Helvetica", "", 12) pdf.cell(0, 8, "Invoice Number: INV-2024-00142", new_x="LMARGIN", new_y="NEXT") pdf.cell(0, 8, "Date: January 15, 2024", new_x="LMARGIN", new_y="NEXT") pdf.cell(0, 8, "Customer: Example Corp", new_x="LMARGIN", new_y="NEXT") pdf.ln(5) pdf.set_font("Helvetica", "B", 12) pdf.cell(80, 8, "Description", border=1) pdf.cell(30, 8, "Qty", border=1, align="C") pdf.cell(40, 8, "Unit Price", border=1, align="R") pdf.cell(40, 8, "Amount", border=1, align="R") pdf.ln() pdf.set_font("Helvetica", "", 12) for desc, qty, price, amt in [ ("Cloud Storage Service", "1", "$2,400.00", "$2,400.00"), ("Data Transfer (TB)", "5", "$90.00", "$450.00"), ("Technical Support", "1", "$500.00", "$500.00"), ]: pdf.cell(80, 8, desc, border=1) pdf.cell(30, 8, qty, border=1, align="C") pdf.cell(40, 8, price, border=1, align="R") pdf.cell(40, 8, amt, border=1, align="R") pdf.ln() s3 = boto3.client('s3') s3.put_object( Bucket='my-ap-alias-ext-s3alias', Key='samples/documents/invoice.pdf', Body=pdf.output(), ContentType='application/pdf' ) print("Uploaded invoice.pdf")
$python3 create_invoice.py
Lambda 함수 코드
다음 코드를 로 저장합니다lambda_function.py.
import boto3 import json s3 = boto3.client('s3') textract = boto3.client('textract') def lambda_handler(event, context): bucket = event['access_point_alias'] key = event['key'] # Read the PDF from FSx through the access point response = s3.get_object(Bucket=bucket, Key=key) document_bytes = response['Body'].read() # Extract text with Textract textract_response = textract.detect_document_text( Document={'Bytes': document_bytes} ) lines = [ block['Text'] for block in textract_response['Blocks'] if block['BlockType'] == 'LINE' ] # Write extracted text as JSON back to FSx result = { 'source_file': key, 'total_lines': len(lines), 'extracted_text': lines } output_key = key.rsplit('.', 1)[0] + '_extracted.json' s3.put_object( Bucket=bucket, Key=output_key, Body=json.dumps(result, indent=2), ContentType='application/json' ) return { 'lines_extracted': len(lines), 'output_key': output_key }
함수 생성 및 호출
$zip textract-function.zip lambda_function.py aws lambda create-function \ --function-namefsxn-text-extractor\ --runtime python3.12 \ --handler lambda_function.lambda_handler \ --role arn:aws:iam::account-id:role/fsxn-lambda-file-processor\ --zip-file fileb://textract-function.zip \ --timeout 30 \ --memory-size 256 aws lambda invoke \ --function-namefsxn-text-extractor\ --cli-binary-format raw-in-base64-out \ --payload '{"access_point_alias": "my-ap-alias-ext-s3alias", "key": "samples/documents/invoice.pdf"}' \ response.json cat response.json
출력 예시:
{"lines_extracted": 22, "output_key": "samples/documents/invoice_extracted.json"}
예제 3: 오디오 파일 트랜스크립션
이 예제에서는 FSx for ONTAP 볼륨에 저장된 오디오 파일에 대한 Amazon Transcribe 작업을 시작합니다. Amazon Transcribe는 미디어 파일 URI의 액세스 포인트 별칭을 사용하여 액세스 포인트에서 직접 오디오 파일을 읽습니다. 작업이 완료되면 함수는 트랜스크립트를 볼륨에 다시 기록합니다.
Lambda 함수 코드
다음 코드를 로 저장합니다lambda_function.py.
import boto3 import json import time import urllib.request s3 = boto3.client('s3') transcribe = boto3.client('transcribe') def lambda_handler(event, context): bucket = event['access_point_alias'] key = event['key'] media_format = key.rsplit('.', 1)[-1] # mp3, wav, etc. # Start a Transcribe job pointing to the file on FSx job_name = f"fsxn-{int(time.time())}" transcribe.start_transcription_job( TranscriptionJobName=job_name, Media={'MediaFileUri': f's3://{bucket}/{key}'}, MediaFormat=media_format, LanguageCode='en-US' ) # Wait for the job to complete while True: status = transcribe.get_transcription_job( TranscriptionJobName=job_name ) state = status['TranscriptionJob']['TranscriptionJobStatus'] if state in ('COMPLETED', 'FAILED'): break time.sleep(5) if state == 'FAILED': raise Exception( status['TranscriptionJob'].get('FailureReason', 'Unknown error') ) # Download the transcript transcript_uri = status['TranscriptionJob']['Transcript']['TranscriptFileUri'] with urllib.request.urlopen(transcript_uri) as resp: transcript_data = json.loads(resp.read()) transcript_text = transcript_data['results']['transcripts'][0]['transcript'] # Write the transcript back to FSx result = { 'source_file': key, 'job_name': job_name, 'transcript': transcript_text } output_key = key.rsplit('.', 1)[0] + '_transcript.json' s3.put_object( Bucket=bucket, Key=output_key, Body=json.dumps(result, indent=2), ContentType='application/json' ) return { 'transcript_length': len(transcript_text), 'output_key': output_key }
함수 생성 및 호출
$zip transcribe-function.zip lambda_function.py aws lambda create-function \ --function-namefsxn-audio-transcriber\ --runtime python3.12 \ --handler lambda_function.lambda_handler \ --role arn:aws:iam::account-id:role/fsxn-lambda-file-processor\ --zip-file fileb://transcribe-function.zip \ --timeout 120 aws lambda invoke \ --function-namefsxn-audio-transcriber\ --cli-binary-format raw-in-base64-out \ --payload '{"access_point_alias": "my-ap-alias-ext-s3alias", "key": "samples/audio/sample-audio.mp3"}' \ --cli-read-timeout 180 \ response.json cat response.json
참고
트랜스크립션 작업을 완료하는 데 일반적으로 15~45초가 걸립니다. 함수의 제한 시간은 120초로 설정되어 이를 허용합니다.
고려 사항
기본 구성에 필요한 인터넷 오리진입니다. 기본적으로 Lambda는 인터넷 오리진 액세스 포인트가 필요한 VPC 외부의 관리형 인프라에서 Amazon S3에 액세스합니다. Lambda 함수를 VPC에 연결하는 경우 VPC 오리진 액세스 포인트를 대신 사용할 수 있습니다. 자세한 내용은 사전 조건을 참조하세요.
파일 크기 제한. Lambda 함수의 최대 메모리는 10GB이고 최대 실행 시간은 15분입니다. 대용량 파일의 경우 범위 읽기(
GetObjectRange헤더 포함)를 사용하거나 응답을 스트리밍하는 것이 좋습니다.Textract 제한. 동기
DetectDocumentTextAPI는 최대 10MB 및 1페이지의 문서를 허용합니다. 여러 페이지 문서의 경우 비동기StartDocumentTextDetectionAPI를 사용합니다.액세스 포인트에서 직접 읽기를 트랜스크립션합니다. Amazon Transcribe는
MediaFileUri파라미터()의 액세스 포인트 별칭을 수락합니다s3://. Lambda 함수는 오디오 파일을 다운로드하고 다시 업로드할 필요가 없습니다.ap-alias/key파일 시스템 사용자 권한. 액세스 포인트와 연결된 파일 시스템 사용자는 입력 파일에 대한 읽기 권한과 출력 디렉터리에 대한 쓰기 권한이 있어야 합니다.
정리
요금이 계속 부과되지 않도록 하려면이 자습서에서 생성한 리소스를 삭제합니다.
$# Delete Lambda functions aws lambda delete-function --function-namefsxn-thumbnail-generatoraws lambda delete-function --function-namefsxn-text-extractoraws lambda delete-function --function-namefsxn-audio-transcriber# Delete the IAM role and policies aws iam delete-role-policy \ --role-namefsxn-lambda-file-processor\ --policy-name fsxn-access-point-policy aws iam detach-role-policy \ --role-namefsxn-lambda-file-processor\ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam delete-role --role-namefsxn-lambda-file-processor# Delete sample files from your FSx volume aws s3 rm s3://my-ap-alias-ext-s3alias/samples/ --recursive