Lambda 함수에 대한 동시성 관리 - AWS Lambda

Lambda 함수에 대한 동시성 관리

동시성은 특정 시각에 함수가 제공하는 요청의 수입니다. 함수가 호출되면 Lambda는 함수의 인스턴스를 할당하여 이벤트를 처리합니다. 함수 코드가 실행을 마치면, 다른 요청을 처리할 수 있습니다. 요청을 처리하는 동안 함수가 다시 호출되면, 다른 인스턴스가 할당되어 함수의 동시성이 증가합니다.

동시성에는 리전의 모든 함수가 공유하는 리전 할당량이 적용됩니다. 함수가 항상 일정 수준의 동시성에 도달할 수 있도록 보장하려면 예약된 함수로 함수를 구성할 수 있습니다. 한 함수가 동시성을 예약하면 다른 함수는 해당 동시성을 사용할 수 없습니다. 또한 예약된 동시성은 함수의 최대 동시성을 제한하며 버전 및 별칭을 포함하여 함수 전체에 적용됩니다.

Lambda에서 함수의 인스턴스를 할당하면 런타임은 함수의 코드를 로드하고 핸들러 외부에서 정의하는 초기화 코드를 실행합니다. 코드 및 종속성이 크거나 초기화 중에 SDK 클라이언트를 생성하는 경우 이 프로세스에 약간 시간이 걸릴 수 있습니다. 함수가 확장되면 이로 인해 새 인스턴스에서 제공하는 요청 부분이 나머지보다 긴 지연 시간을 갖게 됩니다.

지연 시간의 변동 없이 함수를 확장할 수 있도록 하려면 프로비저닝된 동시성을 사용하십시오. 호출이 증가하기 전에 프로비저닝된 동시성을 할당하면 매우 짧은 지연 시간으로 초기화된 인스턴스에서 모든 요청을 처리하도록 할 수 있습니다. 함수의 버전이나 별칭에서 프로비저닝된 동시성을 구성할 수 있습니다.

이제 Lambda는 이제 Application Auto Scaling과도 통합됩니다. 일정에 따라 또는 사용률을 기준으로 프로비저닝된 동시성을 관리하도록 Application Auto Scaling을 구성할 수 있습니다. 예약된 조정을 사용하여 최대 트래픽을 예상하여 프로비저닝된 동시성을 증가시킬 수 있습니다. 필요에 따라 프로비저닝된 동시성을 자동으로 높이려면 Application Auto Scaling API를 사용하여 대상을 등록하고 조정 정책을 만듭니다.

프로비저닝된 동시성은 함수의 예약된 동시성 및 리전 할당량에 포함됩니다. 함수의 버전과 별칭에서 프로비저닝된 동시성의 양이 함수의 예약된 동시성까지 더해지면 모든 호출은 프로비저닝된 동시성에서 실행됩니다. 이 구성은 게시되지 않은 버전의 함수($LATEST)를 조절하여 실행을 금지하는 효과가 있습니다.

예약된 동시성 구성

함수에 대해 예약된 동시성 설정을 관리하려면 Lambda 콘솔을 사용합니다.

함수에 대해 동시성을 예약하려면

  1. Lambda 콘솔의 함수 페이지(Functions page)를 엽니다.

  2. 함수를 선택합니다.

  3. 동시성에서 편집을 선택합니다.

  4. 동시성 예약을 선택합니다. 함수에 예약할 동시성의 크기를 입력합니다.

  5. Save를 선택합니다.

동시성을 예약하지 않은 함수에 대해 표시된 Unreserved account concurrency(예약되지 않은 계정 동시성) 값에서 100을 뺀 값까지만 동시성을 예약할 수 있습니다. 함수를 조절하려면 예약된 동시성을 0으로 설정합니다. 이렇게 하면 제한을 제거할 때까지 어떠한 이벤트도 처리되지 않습니다.

다음 예제는 예약된 동시성 풀과 다른 함수에서 사용되는 예약되지 않은 동시성 풀을 가진 두 개의 함수를 보여 줍니다. 제한 오류는 풀의 모든 동시성이 사용 중일 때 발생합니다.


        두 개의 함수에 할당된 예약 동시성입니다.

범례

  • 함수 동시성

  • 예약된 동시성

  • 예약되지 않은 동시성

  • 제한

동시성 예약은 다음과 같은 효과가 있습니다.

  • 다른 함수가 함수의 조정을 금지할 수 없음 – 예약된 동시성이 없는 동일한 리전에 있는 모든 계정의 함수는 예약되지 않은 동시성 풀을 공유합니다. 예약된 동시성이 없으면 다른 함수는 사용 가능한 모든 동시성을 다 사용할 수 있습니다. 이렇게 하면 필요할 때 함수가 확장하지 않습니다.

  • 함수가 제어 범위 밖으로 확장할 수 없음 – 또한 예약된 동시성은 함수가 예약되지 않은 풀에서 동시성을 사용하는 것을 제한하여 최대 동시성의 한도를 설정합니다. 동시성을 예약하여 함수가 해당 리전에서 사용 가능한 모든 동시성을 다 사용하지 못하게 하거나 다운스트림 리소스를 오버로드하지 못하게 할 수 있습니다.

함수별 동시성 설정은 다른 함수가 사용할 수 있는 동시성 풀에 영향을 미칠 수 있습니다. 문제를 방지하려면 PutFunctionConcurrencyDeleteFunctionConcurrency API 작업을 사용할 수 있는 사용자 수를 제한하십시오.

프로비저닝된 동시성 구성

버전 또는 별칭에 대해 프로비저닝된 동시성 설정을 관리하려면 Lambda 콘솔을 사용합니다.

별칭에 대해 동시성을 예약하려면

  1. Lambda 콘솔의 함수 페이지(Functions page)를 엽니다.

  2. 함수를 선택합니다.

  3. 프로비저닝된 동시성 구성에서 추가를 선택합니다.

  4. 별칭 또는 버전을 선택합니다.

  5. 할당할 프로비저닝된 동시성의 양을 입력합니다.

  6. 저장을 선택합니다.

함수 구성 페이지에서 모든 별칭 및 버전에 대해 프로비전된 동시성을 관리할 수 있습니다. 프로비저닝된 동시성 구성 목록에는 각 구성의 할당 진행률이 표시됩니다. 프로비저닝된 동시성 설정은 각 버전 및 별칭에 대한 구성 페이지에서도 사용할 수 있습니다.

다음 예제에서는 my-function-DEVmy-function-PROD 함수가 예약된 동시성과 프로비저닝된 동시성을 모두 사용하여 구성됩니다. my-function-DEV의 경우 예약된 동시성의 전체 풀도 프로비저닝된 동시성입니다. 이 경우 모든 호출은 프로비저닝된 동시성에서 실행되거나 제한됩니다. my-function-PROD의 경우 예약된 동시성 풀의 일부는 표준 동시성입니다. 프로비저닝된 모든 동시성이 사용되는 경우 이 함수는 표준 동시성을 확장하여 추가 요청을 처리합니다.


        예약된 동시성 및 프로비저닝된 동시성을 갖는 함수입니다.

범례

  • 함수 동시성

  • 예약된 동시성

  • 프로비저닝된 동시성

  • 예약되지 않은 동시성

  • 제한

프로비저닝된 동시성은 구성 직후에 온라인 상태가 되지 않습니다. Lambda는 1 ~ 2분의 준비 시간 이후에 프로비저닝된 동시성 할당을 시작합니다. 함수가 부하에 따른 조정 방식과 마찬가지로 리전에 따라 최대 3000개의 함수 인스턴스를 한 번에 초기화 할 수 있습니다. 초기 버스트 이후 인스턴스는 요청이 이행될 때까지 분당 500의 일정한 속도로 할당됩니다. 동일한 리전에서 여러 함수 또는 함수 버전에 대해 프로비저닝된 동시성을 요청하면 모든 요청에 조정 할당량이 적용됩니다.


      프로비저닝된 동시성을 통해 확장됩니다.

범례

  • 함수 인스턴스

  • 미결 요청

  • 프로비저닝된 동시성

  • 표준 동시성

함수의 초기화 코드는 함수의 실행 중인 인스턴스가 재활용되므로 할당 중에 몇 시간마다 실행됩니다. 인스턴스가 요청을 처리한 후 로그와 추적에서 초기화 시간을 확인할 수 있습니다. 그러나 인스턴스가 요청을 처리하지 않더라도 초기화에 대해 비용이 청구됩니다. 프로비저닝된 동시성은 계속 실행되며 초기화 및 호출 비용과는 별도로 비용이 청구됩니다. 자세한 내용은 AWS Lambda 요금을 참조하십시오.

함수의 각 버전에는 프로비저닝된 동시성 구성이 하나만 있을 수 있습니다. 이 구성은 버전 자체에서 직접 있거나 버전을 가리키는 별칭에 있을 수 있습니다. 두 별칭은 동일한 버전에 대해 프로비저닝된 동시성을 할당할 수 없습니다. 또한 게시되지 않은 버전($LATEST)을 가리키는 별칭에서는 프로비저닝된 동시성을 할당할 수 없습니다.

별칭이 가리키는 버전을 변경하면 프로비저닝된 동시성은 이전 버전에서 할당 해제된 다음, 새 버전에 할당됩니다. 프로비저닝된 동시성이 있는 별칭에 라우팅 구성을 추가할 수 있습니다. 하지만 라우팅 구성이 설정되어 있는 동안에는 별칭에 대해 프로비저닝된 동시성 설정을 관리할 수 없습니다.

Lambda는 프로비저닝된 동시성에 대해 다음 지표를 내보냅니다.

프로비저닝된 동시성 지표

  • ProvisionedConcurrentExecutions

  • ProvisionedConcurrencyInvocations

  • ProvisionedConcurrencySpilloverInvocations

  • ProvisionedConcurrencyUtilization

자세한 내용은 AWS Lambda 함수 지표 작업 단원을 참조하십시오.

Lambda API를 이용한 동시성 구성

AWS CLI 또는 AWS SDK를 사용하여 동시성 설정 및 autoscaling을 관리하려면 다음 API 작업을 사용합니다.

AWS CLI를 사용하여 예약된 동시성을 구성하려면 put-function-concurrency 명령을 사용합니다. , 다음 명령은 my-function이라는 함수에 대해 100의 동시성을 예약합니다.

$ aws lambda put-function-concurrency --function-name my-function --reserved-concurrent-executions 100 { "ReservedConcurrentExecutions": 100 }

함수에 대해 프로비저닝된 동시성을 할당하려면 put-provisioned-concurrency-config를 사용합니다. 다음 명령은 my-function이라는 함수의 BLUE 별칭에 대해 100의 동시성을 할당합니다.

$ aws lambda put-provisioned-concurrency-config --function-name my-function \ --qualifier BLUE --provisioned-concurrent-executions 100 { "Requested ProvisionedConcurrentExecutions": 100, "Allocated ProvisionedConcurrentExecutions": 0, "Status": "IN_PROGRESS", "LastModified": "2019-11-21T19:32:12+0000" }

프로비저닝된 동시성을 관리하도록 Application Auto Scaling을 구성하려면 Application Auto Scaling를 사용하여 대상 추적 조정을 구성합니다. 먼저 함수의 별칭을 조정 대상으로 등록하십시오. 다음 예제에서는 my-function라는 함수의 BLUE 별칭을 등록합니다.

$ aws application-autoscaling register-scalable-target --service-namespace lambda \ --resource-id function:my-function:BLUE --min-capacity 1 --max-capacity 100 \ --scalable-dimension lambda:function:ProvisionedConcurrency

그런 다음, 조정 정책을 대상에 적용합니다. 다음 예제에서는 별칭에 대해 프로비저닝된 동시성 구성을 조정하여 사용률을 70% 가까이 유지하도록 Application Auto Scaling를 구성합니다.

$ aws application-autoscaling put-scaling-policy --service-namespace lambda \ --scalable-dimension lambda:function:ProvisionedConcurrency --resource-id function:my-function:BLUE \ --policy-name my-policy --policy-type TargetTrackingScaling \ --target-tracking-scaling-policy-configuration '{ "TargetValue": 0.7, "PredefinedMetricSpecification": { "PredefinedMetricType": "LambdaProvisionedConcurrencyUtilization" }}' { "PolicyARN": "arn:aws:autoscaling:us-east-2:123456789012:scalingPolicy:12266dbb-1524-xmpl-a64e-9a0a34b996fa:resource/lambda/function:my-function:BLUE:policyName/my-policy", "Alarms": [ { "AlarmName": "TargetTracking-function:my-function:BLUE-AlarmHigh-aed0e274-xmpl-40fe-8cba-2e78f000c0a7", "AlarmARN": "arn:aws:cloudwatch:us-east-2:123456789012:alarm:TargetTracking-function:my-function:BLUE-AlarmHigh-aed0e274-xmpl-40fe-8cba-2e78f000c0a7" }, { "AlarmName": "TargetTracking-function:my-function:BLUE-AlarmLow-7e1a928e-xmpl-4d2b-8c01-782321bc6f66", "AlarmARN": "arn:aws:cloudwatch:us-east-2:123456789012:alarm:TargetTracking-function:my-function:BLUE-AlarmLow-7e1a928e-xmpl-4d2b-8c01-782321bc6f66" } ] }

Application Auto Scaling은 CloudWatch에 두 개의 경보를 생성합니다. 프로비저닝된 동시성의 사용률이 지속적으로 70% 를 초과하면 첫 번째 경보가 트리거됩니다. 이 경우 Application Auto Scaling은 프로비저닝된 동시성을 더 많이 할당하여 사용률을 줄입니다. 두 번째 경보는 사용률이 지속적으로 63%(70% 대상의 90%) 미만인 경우에 트리거됩니다. 이 경우 Application Auto Scaling가 별칭의 프로비저닝된 동시성을 줄입니다.

다음 예제에서는 프로비저닝된 동시성의 최소 양과 최대 양 사이에서 함수 크기가 사용률에 따라 조정됩니다. 미결 요청 수가 증가하면 Application Auto Scaling이 구성된 최대값에 도달할 때까지 프로비저닝된 동시성을 큰 폭으로 늘립니다. 사용률이 떨어지기 시작할 때까지 표준 동시성에서 함수 크기가 계속 조정됩니다. 사용률이 계속 낮아지면 Application Auto Scaling이 프로비저닝된 동시성을 주기적인 작은 단계로 줄입니다.


      Application Auto Scaling 대상 추적으로 프로비저닝된 동시성 자동 조정

범례

  • 함수 인스턴스

  • 미결 요청

  • 프로비저닝된 동시성

  • 표준 동시성

한 리전에서 계정의 동시성 할당량을 보려면 get-account-settings를 사용하세요.

$ aws lambda get-account-settings { "AccountLimit": { "TotalCodeSize": 80530636800, "CodeSizeUnzipped": 262144000, "CodeSizeZipped": 52428800, "ConcurrentExecutions": 1000, "UnreservedConcurrentExecutions": 900 }, "AccountUsage": { "TotalCodeSize": 174913095, "FunctionCount": 52 } }