Skip to content
This repository was archived by the owner on Jan 28, 2025. It is now read-only.

Commit 72252fc

Browse files
authored
fix(lambda-at-edge): add retries for s3 calls (#720)
1 parent 9a2451c commit 72252fc

File tree

3 files changed

+485
-449
lines changed

3 files changed

+485
-449
lines changed

packages/libs/lambda-at-edge/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
"typescript": "^3.9.6"
5555
},
5656
"dependencies": {
57-
"@aws-sdk/client-s3": "1.0.0-gamma.8",
57+
"@aws-sdk/client-s3": "1.0.0-rc.3",
5858
"@zeit/node-file-trace": "^0.6.5",
5959
"cookie": "^0.4.1",
6060
"execa": "^4.0.2",

packages/libs/lambda-at-edge/src/default-handler.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
} from "./routing/redirector";
3232
import { getRewritePath } from "./routing/rewriter";
3333
import { addHeadersToResponse } from "./headers/addHeaders";
34+
import type { SdkError } from "@aws-sdk/smithy-client";
3435

3536
const basePath = RoutesManifestJson.basePath;
3637
const NEXT_PREVIEW_DATA_COOKIE = "__next_preview_data";
@@ -169,6 +170,30 @@ const router = (
169170
};
170171
};
171172

173+
// Need retries to fix https://github.com/aws/aws-sdk-js-v3/issues/1196
174+
const buildS3RetryStrategy = async () => {
175+
const { defaultRetryDecider, StandardRetryStrategy } = await import(
176+
"@aws-sdk/middleware-retry"
177+
);
178+
179+
const retryDecider = (err: SdkError & { code?: string }) => {
180+
if (
181+
"code" in err &&
182+
(err.code === "ECONNRESET" ||
183+
err.code === "EPIPE" ||
184+
err.code === "ETIMEDOUT")
185+
) {
186+
return true;
187+
} else {
188+
return defaultRetryDecider(err);
189+
}
190+
};
191+
192+
return new StandardRetryStrategy(async () => 3, {
193+
retryDecider
194+
});
195+
};
196+
172197
export const handler = async (
173198
event: OriginRequestEvent | OriginResponseEvent
174199
): Promise<CloudFrontResultResponse | CloudFrontRequest> => {
@@ -458,7 +483,12 @@ const handleOriginResponse = async ({
458483

459484
// Lazily import only S3Client to reduce init times until actually needed
460485
const { S3Client } = await import("@aws-sdk/client-s3/S3Client");
461-
const s3 = new S3Client({ region: request.origin?.s3?.region });
486+
487+
const s3 = new S3Client({
488+
region: request.origin?.s3?.region,
489+
maxAttempts: 3,
490+
retryStrategy: await buildS3RetryStrategy()
491+
});
462492
let pagePath;
463493
if (
464494
isDataRequest(uri) &&

0 commit comments

Comments
 (0)