Qumulo LogoQumulo Logo

블로그

Qumulo 및 AWS Lambda를 사용한 상태 비저장 애플리케이션을 위한 영구 스토리지

다음을 사용하여 구축된 서버리스 애플리케이션 AWS 람다 는 민첩성, 확장성, 효율성을 제공하지만 내장된 영구 저장소가 부족합니다. Lambda 함수가 여러 호출에서 파일에 액세스하거나 데이터를 지속적으로 공유해야 하는 경우, 클라우드 네이티브 쿠물로(CNQ) 이 격차를 해소합니다.

이 블로그는 다음을 통해 AWS Lambda를 CNQ에 연결하는 방법을 보여줍니다 NFS 를 사용하여 서버리스 애플리케이션을 위한 지속적이고 확장 가능한 파일 액세스를 지원합니다.

이 블로그에서

  • AWS 람다란?

  • AWS 람다에 영구 스토리지가 필요한 이유

  • 람다용 CNQ NFS 액세스 설정하기

  • CNQ와 상호 작용하는 람다 함수 만들기

  • 람다 패키징 및 배포

  • 모든 것을 시험해 보기

 

AWS 람다란?

AWS Lambda는 서버를 프로비저닝하거나 관리할 필요 없이 HTTP 요청, 파일 업로드 또는 데이터 스트림 변경과 같은 이벤트에 대한 응답으로 코드를 실행하는 서버리스 이벤트 중심 컴퓨팅 서비스입니다. 확장, 유지 관리, 로깅을 처리하므로 원하는 언어로 코드를 작성하는 데 집중할 수 있습니다. 함수는 트리거될 때만 실행되며, 사용한 컴퓨팅 시간에 대해서만 요금이 청구됩니다.

Lambda는 특히 빠른 확장과 이벤트 중심 처리가 필요한 시나리오에 적합합니다:

  • 파일 처리: Amazon S3에 파일이 업로드되면 실시간으로 워크플로를 트리거합니다.

  • 스트림 처리: Amazon Kinesis와 같은 소스에서 실시간 스트리밍 데이터를 분석하고 처리합니다.

  • 웹 애플리케이션: Lambda를 다른 AWS 서비스와 통합하여 확장 가능한 웹 앱을 구축하세요.

  • IoT 백엔드: 서버 관리 없이 IoT 디바이스의 백엔드 작업을 관리하세요.

 

⚠️ 그러나 Lambda는 설계상 상태가 없습니다. 함수에는 영구 저장소가 내장되어 있지 않으므로 파일 지속성을 위해 외부 솔루션이 필요합니다.

AWS 람다에 영구 스토리지가 필요한 이유

서버리스 컴퓨팅은 개발자가 복잡한 서버 인프라 없이도 확장성이 뛰어난 기능을 구축할 수 있게 함으로써 애플리케이션 개발에 변화를 가져왔습니다. Lambda 함수는 기본적으로 Amazon S3와 같은 객체 스토리지와 상호 작용하지만, 많은 실제 시나리오에서는 레거시 애플리케이션을 지원하거나 파일 기반 스토리지가 제공하는 이점을 활용하기 위해 기존 파일 시스템에 액세스해야 합니다.

Amazon의 기본 제공 영구 스토리지 옵션인 EFS(Elastic File System)는 SMB 프로토콜 지원이 부족하여 NFS에 의존하는 레거시 워크플로우에만 제한적으로 사용할 수 있습니다. 개발자는 AWS Lambda와 Cloud Native Qumulo(CNQ)를 통합함으로써 이 격차를 원활하게 해소할 수 있습니다. CNQ의 멀티 프로토콜 기능을 통해 서버리스 애플리케이션은 확장성이나 단순성을 저하시키지 않고 레거시 파일 시스템에 직접 액세스할 수 있습니다.

CNQ와 AWS Lambda를 사용하면 상태 저장 워크플로우가 완전히 서버리스화되어 복잡성 없이 탁월한 속도, 사용 편의성, 강력한 스토리지 성능을 모두 제공합니다.

많은 실제 애플리케이션에는 영구적인 파일 저장소가 필요합니다:

  • 보고서 생성 및 저장

  • 업로드된 파일 처리

  • 호출 또는 서비스 간 데이터 공유

 

Lambda의 임시 /tmp 스토리지는 임시적입니다. CNQ는 영구적인 고성능, 멀티 프로토콜, 확장 가능한 NFS 스토리지를 제공하므로 이러한 시나리오에 이상적입니다.

람다용 CNQ NFS 액세스 설정하기

AWS VPC에 CNQ를 배포하세요: Qumulo 웹 UI 또는 CLI를 통해 CNQ를 몇 분 안에 배포하세요.

 

Qumulo NFS 내보내기를 만듭니다:

UI, API 또는 qq CLI를 사용하여 Lambda 사용 사례에 대한 내보내기를 생성하세요.

NFS 내보내기를 확인합니다:

  • 읽기/쓰기 권한이 있습니다

  • 람다와 동일한 VPC/서브넷 내에서 액세스할 수 있습니다

  • 비루트 포트 연결 허용(Lambda가 루트로 실행되지 않음)

 

CNQ 보안을 구성합니다:

포트 2049/tcp(NFS)에서 인그레스 액세스를 보장합니다:

아래의 CIDR을 람다 서브넷의 실제 CIDR 범위로 대체하여 VPC 보안 그룹 인그레스 규칙에 NFS를 추가합니다.

aws ec2 authorize-security-group-ingress \--그룹-ID SG-0A1B2C3D4E5F6G7H8 \--프로토콜 tcp \--포트 2049 \--CIDR 192.168.0.0/24

람다 함수 코드 만들기

다음 코드를 사용하여 Python 핸들러 파일(예: test_cnq_access.py)을 만듭니다.
참고: YOUR_CNQ_ADDRESS를 CNQ 클러스터의 DNS 이름(또는 IP 주소)으로 바꾸고 YOUR_NFS_EXPORT를 실제 NFS 내보내기 경로(예: 람다 데이터)로 바꿉니다.

import osimport sysfrom datetime import datetimeimport libnfsos.environ['LD_LIBRARY_PATH'] = "/var/task/lib:/var/task/libnfs:" + os.environ.get('LD_LIBRARY_PATH', '')sys.path.append('/var/task')def 핸들러(이벤트, 컨텍스트):시도:nfs = libnfs.NFS("nfs://YOUR_CNQ_ADDRESS/YOUR_NFS_EXPORT")예외 예외는 e입니다:반환 {"statusCode": 500, "본문": "NFS 내보내기에 연결하는 동안 오류가 발생했습니다: " + str(e)}시도:timestamp = datetime.now().isoformat()message = f"안녕하세요, CNQ를 통해 AWS Lambda에서 왔습니다! - {timestamp}\n"f = nfs.open("/testing-from-lambda.txt", "w+")f.write(message)f.close()예외 예외는 e입니다:반환 {"statusCode": 500, "본문": "파일에 쓰는 동안 오류가 발생했습니다: " + str(e)}시도:f = nfs.open("/testing-from-lambda.txt", "r")content = f.read()반환 {"statusCode": 200, "body": content}예외 예외는 e입니다:반환 {"statusCode": 500, "body": "파일을 읽는 동안 오류가 발생했습니다: " + str(e)}

람다 함수 패키징

AWS Lambda는 FUSE를 마운트하거나 커널 수준의 NFS 마운트를 사용할 수 없기 때문에, 사용자 공간 대안을 사용하기 위해 기본 libnfs 공유 라이브러리를 Python 코드와 함께 패키지화합니다.

중요: 호환성을 위해 Amazon Linux 2 환경에서 빌드하고 테스트하세요.

배포 패키지 생성 스크립트 - 셸 스크립트를 만들거나 이러한 명령을 단계별로 실행합니다. 환경에 따라 필요에 따라 조정하세요.

#!/bin/bash################################################################# AWS Lambda 배포 패키지 생성 스크립트# Amazon Linux 2 VM 또는 컨테이너에서 다음 단계를 실행합니다.################################################################BUILD_DIR="/home/ec2-user/build"echo "생성 패키지 디렉터리..."mkdir -p "$BUILD_DIR/package/lib"echo "필수 패키지 설치 중..."sudo yum -y install python3.8 python38-devel gcc libnfs-develsudo amazon-linux-extras enable python3.8echo "pip3.8을 사용하여 libnfs를 설치 중..."pip3.8 install libnfs --target ./packageecho "AL2 네이티브 libnfs 공유 라이브러리를 패키지에 복사..."cp -L /usr/lib64/libnfs.so package/lib/echo "패키지에 libnfs 심볼릭 링크 생성 (런타임에 필요)..."cd package/libln -sf libnfs.so libnfs.so.8cd $BUILD_DIRecho "복사하는 test_cnq_access.py 람다 핸들러 스크립트..."cp test_cnq_access.py package/echo "압축 배포 패키지(function.zip)..."cd packagezip -r ../함수.zip .

IAM 구성

신뢰 정책(trust-policy.json)을 만듭니다:

{"버전": "2012-10-17","Statement": [{"효과": "허용","주체": {"Service": "lambda.amazonaws.com"},"Action": "sts:AssumeRole"}]}

필요한 정책을 생성하고 첨부합니다:

aws iam create-role \--역할 이름 LambdaCNQExecutionRole \--assume-role-policy-document file://trust-policy.json \--설명 "CNQ 함수에 대한 Lambda 실행 역할"aws iam attach-role-policy \--role-name LambdaCNQExecutionRole \--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRoleaws iam attach-role-policy \--role-name LambdaCNQExecutionRole \--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole

람다 함수 만들기

"123456789012"를 AWS 계정 ID로 바꿉니다.

aWS 람다 생성-함수 \--함수-name cnq-nfs-lambda \--runtime python3.8 \--role arn:aws:iam::123456789012:role/LambdaCNQExecutionRole \--handler test_cnq_access.handler \--zip-file fileb://function.zip

VPC 설정 구성

람다 함수가 VPC의 리소스에 액세스할 수 있도록 하려면 서브넷 및 보안 그룹 세부 정보로 해당 함수의 구성을 업데이트하세요.

aWS 람다 업데이트-함수-구성 \--함수-name cnq-nfs-lambda \--vpc-config '{"SubnetIds": ["subnet-0a1b2c3d", "subnet-4e5f6g7h"],"SecurityGroupIds": ["sg-0abc123def456ghi7"]}'

선택 사항입니다: 사용 사례에 맞는 사용자 지정 정책 첨부하기

Lambda 함수가 추가 서비스(예: S3)에 액세스해야 하는 경우 사용자 지정 정책을 만드세요. 예를 들어

{"버전": "2012-10-17","Statement": [{"Sid": "AllowCloudWatchLogs","Effect": "허용","액션": ["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Resource": "arn:aws:logs:*:*:*"},{"Sid": "AllowS3Access","Effect": "허용","액션": ["s3:GetObject","s3:PutObject","s3:ListBucket"],"Resource": ["arn:aws:s3:::YOUR_BUCKET_NAME","arn:aws:s3:::YOUR_BUCKET_NAME/*"]}]}

참고: 프로덕션에서는 최소 권한 원칙을 사용해야 합니다.

테스트해 보기

모든 설정이 완료되었으니 이제 작업을 실행해 볼 차례입니다:
람다 함수를 트리거합니다:

aws 람다 호출 \--함수-name cnq-nfs-lambda \--payload '{}' \--cli-binary-format raw-in-base64-out \response.json

테스트 시스템에 CNQ NFS 내보내기를 마운트하고 파일을 확인하여 기능을 확인합니다:

sudo mkdir /mnt/test$ sudo mount -t nfs -o vers=3,tcp,nconnect=16 10.99.2.230:/lambdatest /mnt/test$ cat /mnt/test/testing-from-lambda.txt 안녕하세요, CNQ를 통해 AWS Lambda에서 왔습니다! - 2025-04-03T21:01:21

디버깅: 오류가 발생하면 디버깅 목적으로 출력을 볼 수 있습니다:

aws logs filter-log-events --log-group-name /aws/lambda/cnq-nfs-lambda --limit 5이것이 중요한 이유

AWS Lambda와 CNQ를 통합하면 서버리스 기능이 향상되어 복잡성 추가 없이 원활한 상태 저장 워크플로우를 구현할 수 있습니다. CNQ의 멀티 프로토콜 지원으로 레거시 시스템과의 호환성을 확보하여 강력하고 확장 가능한 파일 스토리지를 빠르고 간편하며 서버 없이 제공합니다.

행복한 코딩!