서버리스 애플리케이션은 다음을 사용하여 구축됩니다. AWS 람다 민첩성, 확장성, 효율성을 제공하지만 내장된 영구 저장소가 부족합니다. Lambda 함수가 호출 간에 파일에 액세스하거나 데이터를 영구적으로 공유해야 하는 경우, 클라우드 네이티브 Qumulo (CNQ) 이 격차를 해소합니다.
이 블로그에서는 AWS Lambda를 CNQ에 연결하는 방법을 보여줍니다. NFS서버리스 애플리케이션에 대한 지속적이고 확장 가능한 파일 액세스를 지원합니다.
이 블로그에서:
- AWS 람다는 무엇입니까?
- AWS Lambda에 영구 스토리지가 필요한 이유
- Lambda에 대한 CNQ NFS 액세스 설정
- CNQ와 상호 작용하는 람다 함수 만들기
- Lambda 패키징 및 배포
- 모든 것을 테스트해보기
AWS 람다는 무엇입니까?
AWS Lambda는 HTTP 요청, 파일 업로드, 데이터 스트림 변경 등의 이벤트에 응답하여 코드를 실행하는 서버리스 이벤트 기반 컴퓨팅 서비스로, 서버를 프로비저닝하거나 관리할 필요가 없습니다. 확장, 유지 관리 및 로깅을 처리하므로 원하는 언어로 코드를 작성하는 데 집중할 수 있습니다. 함수는 트리거될 때만 실행되며, 사용된 컴퓨팅 시간에 대해서만 요금이 청구됩니다.
Lambda는 빠른 확장과 이벤트 기반 처리가 필요한 시나리오에 특히 적합합니다.
- 파일 처리: Amazon S3에 파일을 업로드하면 실시간으로 워크플로를 트리거합니다.
- 스트림 처리: Amazon Kinesis와 같은 소스에서 실시간 스트리밍 데이터를 분석하고 처리합니다.
- 웹 애플리케이션: Lambda를 다른 AWS 서비스와 통합하여 확장 가능한 웹 앱을 구축하세요.
- IoT 백엔드: 서버 관리 없이 IoT 장치의 백엔드 작업을 관리합니다.
⚠️ 하지만 Lambda는 설계상 상태 비저장(stateless) 방식으로 동작합니다. 함수에 내장된 영구 저장소가 없기 때문에 파일 지속성을 위해서는 외부 솔루션이 필요합니다.
AWS Lambda에 영구 스토리지가 필요한 이유
서버리스 컴퓨팅은 개발자가 복잡한 서버 인프라 없이도 확장성이 뛰어난 함수를 구축할 수 있도록 함으로써 애플리케이션 개발 방식을 혁신했습니다. Lambda 함수는 기본적으로 Amazon S3와 같은 객체 스토리지와 상호 작용하지만, 실제 환경에서는 레거시 애플리케이션을 지원하거나 파일 기반 스토리지의 이점을 활용하기 위해 기존 파일 시스템에 액세스해야 하는 경우가 많습니다.
Amazon의 기본 영구 스토리지 옵션인 Elastic File System(EFS)은 SMB 프로토콜 지원이 부족하여 NFS를 사용하는 레거시 워크플로우에서만 사용할 수 있습니다. AWS Lambda를 Cloud Native Qumulo(CNQ)와 통합하면 개발자는 이러한 격차를 원활하게 해소할 수 있습니다. CNQ의 다중 프로토콜 기능을 통해 서버리스 애플리케이션은 확장성이나 단순성을 저해하지 않고 레거시 파일 시스템에 직접 액세스할 수 있습니다.
CNQ와 AWS Lambda를 사용하면 상태 저장 워크플로가 완전히 서버리스가 되어 복잡성 없이 탁월한 속도, 사용 편의성, 강력한 스토리지 성능을 제공합니다.
많은 실제 애플리케이션에는 영구 파일 저장소가 필요합니다.
- 보고서 생성 및 저장
- 업로드된 파일 처리
- 호출 또는 서비스 간 데이터 공유
Lambda의 임시 /tmp 저장소는 임시 저장소입니다. CNQ는 지속적이고 고성능이며 다중 프로토콜을 지원하고 확장 가능한 NFS 저장소를 제공하므로 이러한 시나리오에 이상적입니다.
Lambda에 대한 CNQ NFS 액세스 설정
AWS VPC에 CNQ 배포: Qumulo 웹 UI 또는 CLI를 통해 몇 분 안에 CNQ를 배포하세요.
- AWS 관리자 가이드의 클라우드 네이티브 Qumulo
- AWS에서 클라우드 네이티브 Qumulo가 작동하는 방식
- CloudFormation을 사용하여 AWS에 클라우드 네이티브 Qumulo 배포
- Terraform을 사용하여 AWS에 클라우드 네이티브 Qumulo 배포
Qumulo NFS 내보내기 만들기:
UI, API 또는 qq CLI를 사용하여 Lambda 사용 사례에 대한 내보내기를 생성합니다.
NFS 내보내기를 확인하세요.
- 읽기/쓰기 권한이 있습니다
- Lambda와 동일한 VPC/서브넷 내에서 접근 가능
- 루트가 아닌 포트 연결을 허용합니다(Lambda는 루트로 실행되지 않음)
CNQ 보안 구성:
포트 2049/tcp(NFS)에서 수신 액세스를 보장합니다.
VPC 보안 그룹 수신 규칙에 NFS를 추가하고 아래 CIDR을 Lambda 서브넷의 실제 CIDR 범위로 바꿉니다.
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 내보내기 경로(예: lambda-data)로 바꾸세요.
import os import sys from datetime import datetime import libnfs os.environ['LD_LIBRARY_PATH'] = "/var/task/lib:/var/task/libnfs:" + os.environ.get('LD_LIBRARY_PATH', '') sys.path.append('/var/task') def handler(event, context): try: nfs = libnfs.NFS("nfs://YOUR_CNQ_ADDRESS/YOUR_NFS_EXPORT") except Exception as e: return {"statusCode": 500, "body": "NFS 내보내기에 연결하는 중 오류 발생: " + str(e)} try: 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: return {"statusCode": 500, "body": "파일 쓰기 오류: " + str(e)} try: f = nfs.open("/testing-from-lambda.txt", "r") content = f.read() return {"statusCode": 200, "body": content} 예외 발생 시 e: return {"statusCode": 500, "body": "파일 읽기 오류: " + str(e)}
람다 함수 패키징
AWS Lambda는 FUSE를 마운트하거나 커널 수준 NFS 마운트를 사용할 수 없으므로, 사용자 공간 대안을 사용하기 위해 Python 코드와 함께 기본 libnfs 공유 라이브러리를 패키징합니다.
중요: 호환성을 위해 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-devel sudo amazon-linux-extras enable python3.8 echo "pip3.8을 사용하여 libnfs 설치 중..." pip3.8 install libnfs --target ./package echo "AL2 네이티브 libnfs 공유 라이브러리를 패키지에 복사하는 중..." cp -L /usr/lib64/libnfs.so package/lib/ echo "만드는 중 패키지에 libnfs 심볼릭 링크가 있습니다(런타임에 필요함)..." cd package/lib ln -sf libnfs.so libnfs.so.8 cd $BUILD_DIR echo "test_cnq_access.py Lambda 핸들러 스크립트를 복사합니다..." cp test_cnq_access.py package/ echo "배포 패키지(function.zip)를 압축합니다..." cd package zip -r ../function.zip .
IAM 구성
신뢰 정책(trust-policy.json)을 생성합니다.
{ "버전": "2012-10-17", "문": [ { "효과": "허용", "주체": { "서비스": "lambda.amazonaws.com" }, "작업": "sts:AssumeRole" } ] }
필요한 정책을 만들고 첨부하세요.
aws iam create-role \ --role-name LambdaCNQExecutionRole \ --assume-role-policy-document file://trust-policy.json \ --description "CNQ 함수에 대한 Lambda 실행 역할" aws iam attach-role-policy \ --role-name LambdaCNQExecutionRole \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam attach-role-policy \ --role-name LambdaCNQExecutionRole \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
람다 함수 생성
"123456789012"를 AWS 계정 ID로 바꾸세요.
aws 람다 생성 함수 \ --함수 이름 cnq-nfs-lambda \ --런타임 python3.8 \ --역할 arn:aws:iam::123456789012:역할/LambdaCNQExecutionRole \ --핸들러 test_cnq_access.handler \ --zip 파일 fileb://function.zip
VPC 설정 구성
Lambda 함수가 VPC의 리소스에 액세스할 수 있도록 하려면 서브넷 및 보안 그룹 세부 정보로 구성을 업데이트하세요.
aws 람다 업데이트-함수-구성 \ --함수-이름 cnq-nfs-lambda \ --vpc-config '{ "서브넷 ID": ["subnet-0a1b2c3d", "subnet-4e5f6g7h"], "보안 그룹 ID": ["sg-0abc123def456ghi7"] }'
선택 사항: 사용 사례에 맞게 사용자 지정 정책 첨부
Lambda 함수가 S3와 같은 추가 서비스에 액세스해야 하는 경우 사용자 지정 정책을 생성하세요. 예:
{ "버전": "2012-10-17", "문": [ { "Sid": "AllowCloudWatchLogs", "효과": "허용", "동작": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "리소스": "arn:aws:logs:*:*:*" }, { "Sid": "AllowS3Access", "효과": "허용", "동작": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "리소스": [ "arn:aws:s3:::당신의_버킷_이름", "arn:aws:s3:::당신의_버킷_이름/*" ] } ] }
참고: 프로덕션 환경에서는 최소 권한 원칙을 사용해야 합니다.
테스트에 적용하기
모든 것이 설정되었으니 이제 작업을 실제로 볼 차례입니다.
람다 함수를 트리거합니다.
aws 람다 invoke \ --function-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 로그 필터-로그-이벤트 --로그-그룹-이름 /aws/lambda/cnq-nfs-lambda --limit 5
왜이 사항
AWS Lambda를 CNQ와 통합하면 서버리스 기능이 강화되어 복잡성을 증가시키지 않고도 원활한 상태 저장 워크플로를 구현할 수 있습니다. CNQ의 다중 프로토콜 지원은 기존 시스템과의 호환성을 높여 빠르고 간편하며 서버리스인 강력하고 확장 가능한 파일 스토리지를 제공합니다.
행복한 코딩!


