Skip to content

Commit 7cabc1e

Browse files
authored
fix(endpoint): instruct rds middleware to wait for endpoint resolution (#4120)
* fix(endpoint): instruct rds middleware to wait for endpoint resolution * fix(endpoint): add endpointv2 checks to middleware that request the endpoint
1 parent 299d245 commit 7cabc1e

File tree

4 files changed

+39
-13
lines changed

4 files changed

+39
-13
lines changed

packages/middleware-sdk-ec2/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
},
2121
"license": "Apache-2.0",
2222
"dependencies": {
23+
"@aws-sdk/middleware-endpoint": "*",
2324
"@aws-sdk/protocol-http": "*",
2425
"@aws-sdk/signature-v4": "*",
2526
"@aws-sdk/types": "*",

packages/middleware-sdk-ec2/src/index.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,28 @@
1+
import { toEndpointV1 } from "@aws-sdk/middleware-endpoint";
12
import { HttpRequest } from "@aws-sdk/protocol-http";
23
import { SignatureV4 } from "@aws-sdk/signature-v4";
34
import {
45
Credentials,
56
Endpoint,
7+
HandlerExecutionContext,
68
HashConstructor,
79
InitializeHandler,
810
InitializeHandlerArguments,
9-
InitializeHandlerOptions,
1011
InitializeHandlerOutput,
1112
InitializeMiddleware,
1213
MemoizedProvider,
1314
MetadataBearer,
1415
Pluggable,
1516
Provider,
1617
RegionInfoProvider,
18+
RelativeMiddlewareOptions,
19+
SerializeHandlerOptions,
1720
} from "@aws-sdk/types";
1821
import { formatUrl } from "@aws-sdk/util-format-url";
1922

2023
interface PreviouslyResolved {
2124
credentials: MemoizedProvider<Credentials>;
22-
endpoint: Provider<Endpoint>;
25+
endpoint?: Provider<Endpoint>;
2326
region: Provider<string>;
2427
sha256: HashConstructor;
2528
signingEscapePath: boolean;
@@ -30,12 +33,16 @@ const version = "2016-11-15";
3033

3134
//an initialize middleware to add PresignUrl to input
3235
export function copySnapshotPresignedUrlMiddleware(options: PreviouslyResolved): InitializeMiddleware<any, any> {
33-
return <Output extends MetadataBearer>(next: InitializeHandler<any, Output>): InitializeHandler<any, Output> =>
36+
return <Output extends MetadataBearer>(
37+
next: InitializeHandler<any, Output>,
38+
context: HandlerExecutionContext
39+
): InitializeHandler<any, Output> =>
3440
async (args: InitializeHandlerArguments<any>): Promise<InitializeHandlerOutput<Output>> => {
3541
const { input } = args;
3642
if (!input.PresignedUrl) {
3743
const region = await options.region();
38-
const resolvedEndpoint = await options.endpoint();
44+
const resolvedEndpoint =
45+
typeof options.endpoint === "function" ? await options.endpoint() : toEndpointV1(context.endpointV2!);
3946

4047
if (typeof options.regionInfoProvider === "function") {
4148
const regionInfo = await options.regionInfoProvider(input.SourceRegion);
@@ -83,11 +90,13 @@ export function copySnapshotPresignedUrlMiddleware(options: PreviouslyResolved):
8390
};
8491
}
8592

86-
export const copySnapshotPresignedUrlMiddlewareOptions: InitializeHandlerOptions = {
87-
step: "initialize",
93+
export const copySnapshotPresignedUrlMiddlewareOptions: SerializeHandlerOptions & RelativeMiddlewareOptions = {
94+
step: "serialize",
8895
tags: ["CROSS_REGION_PRESIGNED_URL"],
8996
name: "crossRegionPresignedUrlMiddleware",
9097
override: true,
98+
relation: "after",
99+
toMiddleware: "endpointV2Middleware",
91100
};
92101

93102
export const getCopySnapshotPresignedUrlPlugin = (config: PreviouslyResolved): Pluggable<any, any> => ({

packages/middleware-sdk-rds/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
},
2121
"license": "Apache-2.0",
2222
"dependencies": {
23+
"@aws-sdk/middleware-endpoint": "*",
2324
"@aws-sdk/protocol-http": "*",
2425
"@aws-sdk/signature-v4": "*",
2526
"@aws-sdk/types": "*",

packages/middleware-sdk-rds/src/index.ts

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
1+
import { toEndpointV1 } from "@aws-sdk/middleware-endpoint";
12
import { HttpRequest } from "@aws-sdk/protocol-http";
23
import { SignatureV4 } from "@aws-sdk/signature-v4";
34
import {
45
Credentials,
56
Endpoint,
7+
HandlerExecutionContext,
68
HashConstructor,
79
InitializeHandler,
810
InitializeHandlerArguments,
9-
InitializeHandlerOptions,
1011
InitializeHandlerOutput,
1112
InitializeMiddleware,
1213
MemoizedProvider,
1314
MetadataBearer,
1415
Pluggable,
1516
Provider,
17+
RelativeMiddlewareOptions,
18+
SerializeHandlerOptions,
1619
} from "@aws-sdk/types";
1720
import { formatUrl } from "@aws-sdk/util-format-url";
1821

@@ -30,7 +33,7 @@ const version = "2014-10-31";
3033

3134
interface PreviouslyResolved {
3235
credentials: MemoizedProvider<Credentials>;
33-
endpoint: Provider<Endpoint>;
36+
endpoint?: Provider<Endpoint>;
3437
region: Provider<string>;
3538
sha256: HashConstructor;
3639
signingEscapePath: boolean;
@@ -41,7 +44,10 @@ interface PreviouslyResolved {
4144
* The presigned URL is generated by sigV4
4245
*/
4346
export function crossRegionPresignedUrlMiddleware(options: PreviouslyResolved): InitializeMiddleware<any, any> {
44-
return <Output extends MetadataBearer>(next: InitializeHandler<any, Output>): InitializeHandler<any, Output> =>
47+
return <Output extends MetadataBearer>(
48+
next: InitializeHandler<any, Output>,
49+
context: HandlerExecutionContext
50+
): InitializeHandler<any, Output> =>
4551
async (args: InitializeHandlerArguments<any>): Promise<InitializeHandlerOutput<Output>> => {
4652
const { input } = args;
4753
const region = await options.region();
@@ -54,7 +60,14 @@ export function crossRegionPresignedUrlMiddleware(options: PreviouslyResolved):
5460
const command = sourceIdToCommandKeyMap[sourceIdKey];
5561
if (!input.PreSignedUrl && isARN(input[sourceIdKey]) && region !== getEndpointFromARN(input[sourceIdKey])) {
5662
const sourceRegion = getEndpointFromARN(input[sourceIdKey]);
57-
const resolvedEndpoint = await options.endpoint();
63+
64+
let resolvedEndpoint: Endpoint;
65+
if (typeof options.endpoint === "function") {
66+
resolvedEndpoint = await options.endpoint();
67+
} else {
68+
resolvedEndpoint = toEndpointV1(context.endpointV2!);
69+
}
70+
5871
resolvedEndpoint.hostname = `rds.${sourceRegion}.amazonaws.com`;
5972
const request = new HttpRequest({
6073
...resolvedEndpoint,
@@ -92,16 +105,18 @@ export function crossRegionPresignedUrlMiddleware(options: PreviouslyResolved):
92105
};
93106
}
94107

95-
export const crossRegionPresignedUrlMiddlewareOptions: InitializeHandlerOptions = {
96-
step: "initialize",
108+
export const crossRegionPresignedUrlMiddlewareOptions: SerializeHandlerOptions & RelativeMiddlewareOptions = {
109+
step: "serialize",
97110
tags: ["CROSS_REGION_PRESIGNED_URL"],
98111
name: "crossRegionPresignedUrlMiddleware",
99112
override: true,
113+
relation: "after",
114+
toMiddleware: "endpointV2Middleware",
100115
};
101116

102117
export const getCrossRegionPresignedUrlPlugin = (config: PreviouslyResolved): Pluggable<any, any> => ({
103118
applyToStack: (clientStack) => {
104-
clientStack.add(crossRegionPresignedUrlMiddleware(config), crossRegionPresignedUrlMiddlewareOptions);
119+
clientStack.addRelativeTo(crossRegionPresignedUrlMiddleware(config), crossRegionPresignedUrlMiddlewareOptions);
105120
},
106121
});
107122

0 commit comments

Comments
 (0)