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

fix(lambda-at-edge): add retries for s3 calls #720

Merged
merged 1 commit into from
Oct 28, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/libs/lambda-at-edge/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
"typescript": "^3.9.6"
},
"dependencies": {
"@aws-sdk/client-s3": "1.0.0-gamma.8",
"@aws-sdk/client-s3": "1.0.0-rc.3",
"@zeit/node-file-trace": "^0.6.5",
"cookie": "^0.4.1",
"execa": "^4.0.2",
Expand Down
32 changes: 31 additions & 1 deletion packages/libs/lambda-at-edge/src/default-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
} from "./routing/redirector";
import { getRewritePath } from "./routing/rewriter";
import { addHeadersToResponse } from "./headers/addHeaders";
import type { SdkError } from "@aws-sdk/smithy-client";

const basePath = RoutesManifestJson.basePath;
const NEXT_PREVIEW_DATA_COOKIE = "__next_preview_data";
Expand Down Expand Up @@ -169,6 +170,30 @@ const router = (
};
};

// Need retries to fix https://github.com/aws/aws-sdk-js-v3/issues/1196
const buildS3RetryStrategy = async () => {
const { defaultRetryDecider, StandardRetryStrategy } = await import(
"@aws-sdk/middleware-retry"
);

const retryDecider = (err: SdkError & { code?: string }) => {
if (
"code" in err &&
(err.code === "ECONNRESET" ||
err.code === "EPIPE" ||
err.code === "ETIMEDOUT")
) {
return true;
} else {
return defaultRetryDecider(err);
}
};

return new StandardRetryStrategy(async () => 3, {
retryDecider
});
};

export const handler = async (
event: OriginRequestEvent | OriginResponseEvent
): Promise<CloudFrontResultResponse | CloudFrontRequest> => {
Expand Down Expand Up @@ -458,7 +483,12 @@ const handleOriginResponse = async ({

// Lazily import only S3Client to reduce init times until actually needed
const { S3Client } = await import("@aws-sdk/client-s3/S3Client");
const s3 = new S3Client({ region: request.origin?.s3?.region });

const s3 = new S3Client({
region: request.origin?.s3?.region,
maxAttempts: 3,
retryStrategy: await buildS3RetryStrategy()
});
let pagePath;
if (
isDataRequest(uri) &&
Expand Down
Loading