詳細検索

AWS 람다와 S3가 더 똑똑해졌다: AWS가 재귀 루프를 자동으로 방지하는 방법

아바타
글쓴이 Jatin Mehrotra

AWS 람다와 S3가 더 똑똑해졌다: AWS가 재귀 루프를 자동으로 방지하는 방법
English에서 번역 • 원문 보기

우리는 모두 특히 AWS LAMBDA 함수에 관해서는 서버리스를 좋아합니다.

이벤트 기반, 분리, 자동화 등 다양한 이유로 AWS 람다가 출시된 데에는 충분한 이유가 있습니다.

하지만 우리의 친한 친구 람다가 적으로 변해 돈과 휴식 시간을 잃을 수 있는 상황이 있을 수 있으며, 그럴 때는 의도치 않은 재귀적 루프가 됩니다.
이 블로그에서는 매우 단순하지만 강력한 기능인 AWS 람다와 S3 버킷 간의 재귀 루프 감지에 대해 이야기할 것입니다.

동기

AWS 람다 재귀 루프와 루프 탐지란 무엇인가요?

  • 람다 함수를 설정하여 동일한 서비스나 자원과 상호작용할 때, 끝없는 재귀 루프가 발생할 위험이 있습니다.
  • 예를 들어, 람다 함수가 아마존 심플 큐 서비스(SQS) 큐로 메시지를 보내고, SQS가 같은 함수를 다시 트리거할 수 있습니다.
  • 이로 인해 반복되는 소환의 순환이 이어집니다.

이게 너한테 무슨 의미야?

  • 의도치 않은 재귀 루프는 AWS 계정에 예상치 못한 요금이 발생해 비용 급증으로 이어질 수 있습니다.
  • 더 나쁜 것은, 이러한 루프가 * 람다 함수를 급격히 통제 불능 상태로 확장시켜 계정의 모든 동시성을 소모하게 만든다는 점입니다*. 이것은 현재 기능뿐만 아니라 다른 중요한 프로세스들도 다운시켜 시스템 전체를 과부하되고 반응하지 않게 만들 수 있습니다. 이것은 당신이 겪고 싶지 않은 비용이 많이 드는 실수입니다!

*이것이 AWS 람다 루프 탐지가 해결하려는 바로 그 문제입니다. *

이 업데이트가 당신에게 어떤 의미인가요?

  • 지금까지 AWS 람다 루프 감지는 Amazon SQS와 Amazon SNS에서만 지원되었으며, 오늘부터 s3도 이 그룹에 가입했습니다.

람다가 루프를 감지하는 방법

  • 람다는 AWS X-Ray 추적 헤더를 사용하여 재귀 루프를 감지합니다. 지원되는 AWS 서비스가 람다에 이벤트를 전송합니다
  • 이벤트가 함수를 호출한 횟수를 추적하는 메타데이터가 포함되어 있습니다.
  • 같은 이벤트가 연속으로 약 16번 함수를 트리거하면, 람다가 자동으로 추가 호출을 중단하고 경고합니다. 다른 함수 트리거는 이 제한의 영향을 받지 않습니다.

여기에서 더 자세히 알아보 실 수 있습니다.

실행해 봅시다.

  • s3 버킷을 생성하고 모든 것을 기본값으로 유지하세요.

  • 람다가 호출될 때마다 s3 버킷에 txt 파일을 업로드하는 람다 함수를 생성합니다. *** 참고: 람다 기본 타임아웃은 3초이며, 파일 업로드 시 그보다 더 오래 걸리므로 타임아웃을 10초로 늘리지 않으면 타임아웃 오류가 발생합니다.**

수입 보토3
import os
랜덤 가져오기
문자열 가져오기

def lambda_handler(이벤트, 맥락): 
    # S3 버킷을 정의해
    s3_bucket = 'your-s3-bucket-name' # S3 버킷 이름으로 대체하세요

    # 파일 이름에 덧붙일 임의 문자열을 생성하세요
    random_string = ''.join(random.choices(string.ascii_lowercase + string.digits, k=6))

    # 파일 내용과 키를 정의하세요 (임의 문자열 추가)
    s3_key = f'your-file-{random_string}.txt' # S3 파일의 키(경로)
    file_content = "안녕하세요, 이것은 Lambda가 무작위 접미사를 붙인 샘플 텍스트 파일입니다!" 

    # 파일을 /tmp 디렉토리에서 로컬로 생성하세요
    local_file_path = '/tmp/sample_file.txt' 

    # 파일에 콘텐츠 쓰기
    Open(local_file_path, 'W') 파일을 사용할 때: 
        file.write(file_content)

    # S3 클라이언트 초기화
    s3 = boto3.client('s3')

    # 파일을 S3에 업로드해
    시도해보세요: 
        s3.upload_file(local_file_path, s3_bucket, s3_key)
        반환 { 
            'statusCode': 200, 
            'body': f"파일이 {s3_bucket}/{s3_key}에 성공적으로 업로드됨" 
        }
    예외는 e: 
        반환 { 
            'statusCode': 500, 
            'body': f"파일 업로드 오류: {str(e)}" 
        }
  • Lambda 함수에 트리거를 추가하여 S3 트리거로 설정하세요.

  • Lambda 함수 IAM 역할에 S3 권한을 추가하세요. 이 권한들은 AWS 람다 함수가 파일을 S3 버킷에 업로드할 수 있게 합니다
  • 블로그의 간결함을 위해 'AmazonS3FullAccess' 관리 정책을 첨부하겠습니다

  • 파일을 S3 버킷에 업로드하세요. 몇 초 후 파일이 자동으로 버킷에 업로드되는 것을 볼 수 있습니다.
  • 다른 친구들에서는 람다가 정확히 16번 호출되는 것을 볼 수 있습니다. 람다가 정확히 16개의 파일을 업로드한 후 루프 감지가 작동합니다.

루프 감지 알림 수신 방법

  • 문서에 따르면, AWS Health Dashboard 알림, 이메일 알림 등 재 귀 루프 알림을 받는 방법은 여러 가지가 있으며 , Lambda가 재귀 호출을 중단한 후 최대 3시간이 걸릴 수 있습니다.
  • 받은 대로 블로그를 업데이트하겠습니다. (이메일 알림 추가)

  • 하지만 가장 빠르고 신뢰할 수 있는 방법은, 'RecursiveInvocationsDropped' 함수에 대해 클라우드 워치 메트릭을 확인하는 것입니다.

CloudWatch 메트릭 RecursiveInvocationsDropped는 한 번의 요청 체인에서 함수가 약 16회 이상 호출되어 Lambda가 차단한 함수 호출 횟수를 기록합니다.

솔루션 아키텍트 관점에서

  • 재귀 루프가 존재한다는 것을 아는 것은 중요하지만, *그 루프가 발생하지 않도록 어떻게 반응할지 이해하는 것이 훨씬 더 중요하다:
    • 재귀 루프가 람다를 확장시키고 계정의 모든 가용 동시성을 사용하므로, 향후 호출을 제한하기 위해 가용 동시성을 0으로 설정하세요.
    • 가장 간단한 방법은 호출을 중단하거나, 다시 말해 람다를 호출하는 트리거를 제거하는 것입니다
    • 내 코드에서 재귀 루프를 일으킨 설정/코드를 수정해 주세요. 버킷 이름은 같습니다.
  • 아키텍처 설계가 요구한다면 재 귀 루프에서 람다를 허용 하는 옵션도 있습니다.
  • 람다 루프 감지가 SQL, SNS, 그리고 이제 S3에서 지원된다는 점을 이해하는 것이 매우 중요합니다. Amazon DynamoDB와 같은 AWS 서비스도 루프의 일부를 이루며, 람다가 현재 이를 감지하고 중단할 수 없습니다.

이 블로그에서는 S3로 인해 재귀 루프가 발생했을 때 계정 람다가 발생하는 다운타임을 줄이고 비용을 절감하는 방법을 살펴보았습니다.

이번 업데이트가 람다를 더 좋게 만들었다는 데 동의하시나요?

언제든 링크드인, X에서 저에게 연락하실 수 있습니다.

Related Articles