Amazon Web Services 한국 블로그

AWS Lambda 테넌트 격리 모드로 간소화된 다중 테넌트 애플리케이션 개발 가능

다중 테넌트 애플리케이션은 테넌트별 코드나 데이터를 처리할 때 엄격한 격리가 필요한 경우가 많습니다. 워크플로 자동화 또는 코드 실행을 위한 서비스형 소프트웨어(SaaS) 플랫폼이 대표적인 예입니다. 고객은 개별 테넌트 또는 최종 사용자에게 사용되는 실행 환경이 서로 완전히 분리되어 있는지 확인해야 합니다. 기존에는 개발자들이 각 테넌트에 대해 별도의 Lambda 함수를 배포하거나 공유 함수 내에 사용자 지정 격리 로직을 구현하여 이러한 요구 사항을 해결해 왔으며, 이로 인해 아키텍처 및 운영 복잡성이 증가했습니다.

AWS Lambda에 Lambda의 기존 격리 기능을 확장하는 새로운 테넌트 격리 모드가 도입되었습니다. Lambda는 이미 함수 수준에서 격리를 제공하며, 이 새로운 모드는 단일 함수 내에서 개별 테넌트 또는 최종 사용자 수준으로 격리를 확장합니다. 이 내장 기능은 테넌트별로 분리된 실행 환경에서 함수 간접 호출을 처리하므로, 함수 코드 내에서 테넌트별 리소스를 관리하기 위한 추가 구현 노력 없이도 엄격한 격리 요구 사항을 충족할 수 있습니다.

다음은 AWS Lambda에서 테넌트 격리 모드를 활성화하는 방법입니다.

새로운 테넌트 격리 기능을 사용할 때 Lambda는 함수 실행 환경을 고객이 지정한 테넌트 식별자와 연결합니다. 즉, 특정 테넌트의 실행 환경은 동일한 Lambda 함수를 간접적으로 호출하는 다른 테넌트의 간접 호출 요청을 처리하는 데 사용되지 않습니다.

이 특성은 민감한 데이터를 처리하거나 신뢰할 수 없는 테넌트 코드를 실행하는 SaaS 제공업체에 대한 엄격한 보안 요구 사항을 해결합니다. AWS Lambda의 사용량 기반 요금과 성능 특성을 유지하면서 실행 환경을 격리할 수 있습니다. 또한 이 접근 방식은 고객이 애플리케이션을 채택함에 따라 빠르게 증가할 수 있는 개별 테넌트의 전용 Lambda 함수를 관리하는 데 따른 운영 오버헤드 없이 테넌트별 인프라의 보안 이점을 제공합니다.

AWS Lambda 테넌트 격리 시작하기
다중 테넌트 애플리케이션을 위한 테넌트 격리를 구성하고 사용하는 방법을 알려드리겠습니다.

먼저 AWS Lambda 콘솔의 함수 생성 페이지에서 처음부터 새로 작성을 선택합니다.

그런 다음 추가 구성 아래의 테넌트 격리 모드에서 활성화를 선택합니다. 테넌트 격리 모드는 함수 생성 중에만 설정할 수 있으며, 기존 Lambda 함수에 대해서는 수정할 수 없습니다.

다음으로 Python 코드를 작성하여 이 기능을 보여드리겠습니다. 컨텍스트 객체를 통해 함수 코드에서 테넌트 식별자에 액세스할 수 있습니다. 다음은 전체 Python 코드입니다.

import json
import os
from datetime import datetime

def lambda_handler(event, context):
    tenant_id = context.tenant_id
    file_path = '/tmp/tenant_data.json'

    # Read existing data or initialize
    if os.path.exists(file_path):
        with open(file_path, 'r') as f:
            data = json.load(f)
    else:
        data = {
            'tenant_id': tenant_id,
            'request_count': 0,
            'first_request': datetime.utcnow().isoformat(),
            'requests': []
        }

    # Increment counter and add request info
    data['request_count'] += 1
    data['requests'].append({
        'request_number': data['request_count'],
        'timestamp': datetime.utcnow().isoformat()
    })

    # Write updated data back to file
    with open(file_path, 'w') as f:
        json.dump(data, f, indent=2)

    # Return file contents to show isolation
    return {
        'statusCode': 200,
        'body': json.dumps({
            'message': f'File contents for {tenant_id} (isolated per tenant)',
            'file_data': data
        })
    }

완료되면 배포를 선택합니다. 이제 테스트를 선택하여 이 기능을 테스트해야 합니다. 새로운 테스트 이벤트 생성 패널에 테넌트 ID라는 새 설정이 있습니다.

테넌트 ID 없이 이 함수를 간접적으로 호출하려고 하면 ‘요청에 유효한 테넌트 ID를 추가하고 다시 시도하세요.’라는 오류가 발생합니다.

tenant-A라는 테넌트 ID로 이 함수를 테스트해 보겠습니다.

함수가 성공적으로 실행되고 request_count: 1을 반환했습니다. 이 함수를 다시 간접적으로 호출하여 request_count: 2를 가져오겠습니다.

이제 tenant-B라는 테넌트 ID로 이 함수를 테스트해 보겠습니다.

tenant-B로 이 함수를 간접적으로 호출한 적이 없기 때문에 마지막 간접 호출에서 request_count: 1을 반환했습니다. 각 테넌트의 간접 호출은 별도의 실행 환경을 사용하여 캐시된 데이터, 글로벌 변수 및 /tmp에 저장된 모든 파일을 격리합니다.

이 기능은 다중 테넌트 서버리스 아키텍처에 대한 접근 방식을 바꿉니다. 복잡한 격리 패턴과 씨름하거나 수백 개의 테넌트별 Lambda 함수를 관리하는 대신 AWS Lambda가 자동으로 격리를 처리하도록 했습니다. 이를 통해 테넌트 간에 테넌트 데이터가 격리된 상태로 유지되어 다중 테넌트 애플리케이션의 보안과 분리에 대한 확신을 가질 수 있습니다.

추가 정보
다음은 알아두셔야 할 추가 정보입니다.

  • 성능 – 동일 테넌트 간접 호출은 최적의 성능을 위한 웜 실행 환경 재사용의 이점을 여전히 누릴 수 있습니다.
  • 요금 – Lambda가 새 테넌트 인식 실행 환경을 생성할 때 요금이 부과됩니다. 요금은 함수에 할당하는 메모리 양과 사용하는 CPU 아키텍처에 따라 달라집니다. 자세한 내용은 AWS Lambda 요금을 참조하세요.
  • 가용성 – 현재 아시아 태평양(뉴질랜드), AWS GovCloud(미국) 및 중국 리전을 제외한 모든 상용 AWS 리전에서 이용 가능합니다.

이번 출시로 AWS Lambda에서 워크플로 자동화 또는 코드 실행을 위한 SaaS 플랫폼과 같은 다중 테넌트 애플리케이션을 구축하는 과정이 간소화됩니다. AWS Lambda 개발자 안내서에서 다음 다중 테넌트 Lambda 함수에 대한 테넌트 격리를 구성하는 방법에 대해 자세히 알아보세요.

즐겁게 빌드해 보세요!
Donnie