AWS SDK를 사용하여 Lambda 함수를 호출할 때 재시도 및 시간 초과 문제를 해결하려면 어떻게 해야 합니까?

6분 분량
0

AWS SDK를 사용하여 AWS Lambda 함수를 호출할 때 함수가 시간 초과되거나 API 요청이 응답하지 않거나 API 작업이 중복됩니다. 이 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

AWS SDK를 사용하여 Lambda 함수를 호출할 때 재시도 및 시간 초과 문제가 발생하는 이유는 다음과 같습니다.

  • 원격 API에 연결할 수 없거나 API 호출에 응답하는 데 너무 오래 걸립니다.
  • API 호출 시 소켓 제한 시간 내에 응답을 받지 못합니다.
  • API 호출 시 Lambda 함수의 제한 시간 내에 응답을 받지 못합니다.

참고: 네트워크 연결 문제가 발생할 경우 API 호출이 예상보다 더 오래 걸릴 수 있습니다. 또한 네트워크 문제로 인해 재시도 및 중복 API 요청이 발생할 수도 있습니다. 이러한 문제에 대비하려면 Lambda 함수가 멱등인지 확인해야 합니다.

AWS SDK를 사용하여 API를 호출할 때 호출이 실패하면 AWS SDK에서 자동으로 호출을 다시 시도합니다. AWS SDK의 재시도 횟수와 기간은 AWS SDK에 따라 다른 설정에 의해 결정됩니다.

기본 AWS SDK 재시도 설정

참고: 다른 AWS 서비스의 경우 일부 값이 다를 수 있습니다.

AWS SDK최대 재시도 횟수연결 제한 시간소켓 제한 시간
Python(Boto 3)서비스에 따라 다름60초60초
JavaScript/Node.js서비스에 따라 다름해당 사항 없음120초
Java310초50초
.NET4100초300초
Go3해당 사항 없음해당 사항 없음

재시도 및 시간 초과 문제를 해결하려면 먼저 API 호출 로그를 검토하여 문제를 찾습니다. 그런 다음 각 사용 사례의 필요에 따라 AWS SDK의 재시도 횟수 및 제한 시간 설정을 변경합니다. API 호출에 대한 응답에 충분한 시간을 허용하려면 [Lambda 함수 제한 시간 설정(Lambda function timeout setting)]의 시간을 늘립니다.

해결 방법

AWS SDK를 통해 수행된 API 호출 로깅

Amazon CloudWatch Logs를 사용하면 실패한 연결 및 각 연결마다 시도한 재시도 횟수에 대한 세부 정보를 확인할 수 있습니다. 자세한 내용은 AWS Lambda에 대한 Amazon CloudWatch Logs 액세스를 참조하세요. 또는 사용 중인 AWS SDK에 따라 다음 지침을 참조하세요.

API 호출에서 연결을 설정할 수 없는 경우에 대한 예제 오류 로그(연결 시간 초과)

START RequestId: b81e56a9-90e0-11e8-bfa8-b9f44c99e76d Version: $LATEST
2018-07-26T14:32:27.393Z    b81e56a9-90e0-11e8-bfa8-b9f44c99e76d    [AWS ec2 undefined 40.29s 3 retries] describeInstances({})
2018-07-26T14:32:27.393Z    b81e56a9-90e0-11e8-bfa8-b9f44c99e76d    { TimeoutError: Socket timed out without establishing a connection

...

API 호출 연결이 성공했지만 API 응답이 너무 오래 걸려 시간 초과된 경우에 대한 예제 오류 로그(소켓 시간 초과)

START RequestId: 3c0523f4-9650-11e8-bd98-0df3c5cf9bd8 Version: $LATEST
2018-08-02T12:33:18.958Z    3c0523f4-9650-11e8-bd98-0df3c5cf9bd8    [AWS ec2 undefined 30.596s 3 retries] describeInstances({})
2018-08-02T12:33:18.978Z    3c0523f4-9650-11e8-bd98-0df3c5cf9bd8    { TimeoutError: Connection timed out after 30s

참고: API 요청에서 Lambda 함수의 제한 시간 내에 응답을 받지 못하면 이러한 로그가 생성되지 않습니다. 함수 제한 시간으로 인해 API 요청이 종료된 경우 다음 중 하나를 수행합니다.

  • 모든 재시도가 제한 시간 내에 수행되도록 SDK의 재시도 설정을 변경합니다.
  • 일시적으로 Lambda 함수 제한 시간 설정을 늘려 SDK 로그 생성에 충분한 시간을 허용합니다.

AWS SDK 설정 변경

AWS SDK의 재시도 횟수 및 제한 시간 설정에서 API 호출이 응답을 받는 데 충분한 시간을 허용해야 합니다. 각 설정에 대해 적절한 값을 결정하려면 다양한 구성을 테스트하고 다음 정보를 얻어야 합니다.

  • 성공적인 연결을 설정하는 데 걸린 평균 시간
  • 전체 API 요청에 소요된(성공적으로 반환될 때까지) 평균 시간
  • AWS SDK 또는 코드로 재시도를 수행해야 하는지 여부

재시도 횟수 및 제한 시간 설정 변경에 대한 자세한 내용은 다음 AWS SDK 클라이언트 구성 설명서를 참조하세요.

다음은 각 런타임에 대한 재시도 횟수 및 제한 시간 설정을 변경하는 몇 가지 예제 명령입니다.

중요: 다음 명령을 사용하려면 먼저 각 설정의 예제 값을 사용 사례의 해당 값으로 바꿉니다.

재시도 횟수 및 제한 시간 설정을 변경하는 예제 Python(Boto 3) 명령

# max_attempts: retry count / read_timeout: socket timeout / connect_timeout: new connection timeout

from botocore.session import Session
from botocore.config import Config

s = Session()
c = s.create_client('s3', config=Config(connect_timeout=5, read_timeout=60, retries={'max_attempts': 2}))

재시도 횟수 및 제한 시간 설정을 변경하는 예제 JavaScript/Node.js 명령

// maxRetries: retry count / timeout: socket timeout / connectTimeout: new connection timeout

var AWS = require('aws-sdk');

AWS.config.update({

    maxRetries: 2,

    httpOptions: {

        timeout: 30000,

        connectTimeout: 5000

    }

});

재시도 횟수 및 제한 시간 설정을 변경하는 예제 Java 명령

// setMaxErrorRetry(): retry count / setSocketTimeout(): socket timeout / setConnectionTimeout(): new connection timeout

ClientConfiguration clientConfig = new ClientConfiguration(); 

clientConfig.setSocketTimeout(60000); 
clientConfig.setConnectionTimeout(5000);
clientConfig.setMaxErrorRetry(2);

AmazonDynamoDBClient ddb = new AmazonDynamoDBClient(credentialsProvider,clientConfig);

재시도 횟수 및 제한 시간 설정을 변경하는 예제 .NET 명령

// MaxErrorRetry: retry count / ReadWriteTimeout: socket timeout / Timeout: new connection timeout

var client = new AmazonS3Client(

    new AmazonS3Config {
        Timeout = TimeSpan.FromSeconds(5),
        ReadWriteTimeout = TimeSpan.FromSeconds(60),
        MaxErrorRetry = 2
});

재시도 횟수 설정을 변경하는 예제 Go 명령

// Create Session with MaxRetry configuration to be shared by multiple service clients.
sess := session.Must(session.NewSession(&aws.Config{
    MaxRetries: aws.Int(3),
}))
 
// Create S3 service client with a specific Region.
svc := s3.New(sess, &aws.Config{
    Region: aws.String("us-west-2"),
})

요청 제한 시간 설정을 변경하는 예제 Go 명령

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// SQS ReceiveMessage
params := &sqs.ReceiveMessageInput{ ... }
req, resp := s.ReceiveMessageRequest(params)
req.HTTPRequest = req.HTTPRequest.WithContext(ctx)
err := req.Send()

(선택 사항) Lambda 함수의 제한 시간 설정 변경

Lambda 함수 제한 시간 값이 낮으면 정상적인 연결이 조기에 중단될 수 있습니다. 사용 사례에서 이런 상황이 발생하는 경우 함수 제한 시간 설정 설정을 늘려서 API 호출이 응답을 받는 데 충분한 시간을 허용해야 합니다.

다음 공식을 사용하여 함수 제한 시간에 필요한 기본 시간을 계산할 수 있습니다.

First attempt (connection timeout + socket timeout) + Number of retries x (connection timeout + socket timeout) + 20 seconds additional code runtime margin = Required Lambda function timeout

Lambda 함수 제한 시간 계산 예

참고: 다음 계산은 3번의 재시도, 10초의 연결 제한 시간 및 30초의 소켓 제한 시간으로 구성된 AWS SDK에 대한 계산입니다.

First attempt (10 seconds + 30 seconds) + Number of retries [3 * (10 seconds + 30 seconds)] + 20 seconds additional code runtime margin = 180 seconds

관련 정보

Invoke(Lambda API 참조)

AWS Lambda의 오류 처리 및 자동 재시도

Lambda 할당량

AWS 공식
AWS 공식업데이트됨 2년 전