Skip to content

Commit a39132c

Browse files
author
awstools
committed
feat(client-dynamodb): Generate account endpoint for DynamoDB requests when the account ID is available
1 parent 118987c commit a39132c

File tree

7 files changed

+1293
-69
lines changed

7 files changed

+1293
-69
lines changed

clients/client-dynamodb/src/DynamoDBClient.ts

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// smithy-typescript generated code
2+
import { AccountIdEndpointMode } from "@aws-sdk/core/account-id-endpoint";
23
import {
34
EndpointDiscoveryInputConfig,
45
EndpointDiscoveryResolvedConfig,
@@ -402,6 +403,11 @@ export interface ClientDefaults extends Partial<__SmithyConfiguration<__HttpHand
402403
*/
403404
region?: string | __Provider<string>;
404405

406+
/**
407+
* Defines if the AWS AccountId will be used for endpoint routing.
408+
*/
409+
accountIdEndpointMode?: AccountIdEndpointMode | __Provider<AccountIdEndpointMode>;
410+
405411
/**
406412
* The provider populating default tracking information to be sent with `user-agent`, `x-amz-user-agent` header
407413
* @internal

clients/client-dynamodb/src/endpoint/EndpointParameters.ts

+6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ export interface ClientInputEndpointParameters {
99
useDualstackEndpoint?: boolean | Provider<boolean>;
1010
useFipsEndpoint?: boolean | Provider<boolean>;
1111
endpoint?: string | Provider<string> | Endpoint | Provider<Endpoint> | EndpointV2 | Provider<EndpointV2>;
12+
accountId?: string | Provider<string>;
13+
accountIdEndpointMode?: string | Provider<string>;
1214
}
1315

1416
export type ClientResolvedEndpointParameters = ClientInputEndpointParameters & {
@@ -28,14 +30,18 @@ export const resolveClientEndpointParameters = <T>(
2830

2931
export const commonParams = {
3032
UseFIPS: { type: "builtInParams", name: "useFipsEndpoint" },
33+
AccountId: { type: "builtInParams", name: "accountId" },
3134
Endpoint: { type: "builtInParams", name: "endpoint" },
3235
Region: { type: "builtInParams", name: "region" },
3336
UseDualStack: { type: "builtInParams", name: "useDualstackEndpoint" },
37+
AccountIdEndpointMode: { type: "builtInParams", name: "accountIdEndpointMode" },
3438
} as const;
3539

3640
export interface EndpointParameters extends __EndpointParameters {
3741
Region?: string;
3842
UseDualStack?: boolean;
3943
UseFIPS?: boolean;
4044
Endpoint?: string;
45+
AccountId?: string;
46+
AccountIdEndpointMode?: string;
4147
}

clients/client-dynamodb/src/endpoint/endpointResolver.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { ruleSet } from "./ruleset";
88

99
const cache = new EndpointCache({
1010
size: 50,
11-
params: ["Endpoint", "Region", "UseDualStack", "UseFIPS"],
11+
params: ["AccountId", "AccountIdEndpointMode", "Endpoint", "Region", "UseDualStack", "UseFIPS"],
1212
});
1313

1414
export const defaultEndpointResolver = (

clients/client-dynamodb/src/endpoint/ruleset.ts

+41-26
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,46 @@ import { RuleSetObject } from "@smithy/types";
66
or see "smithy.rules#endpointRuleSet"
77
in codegen/sdk-codegen/aws-models/dynamodb.json */
88

9-
const w="required",
10-
x="fn",
11-
y="argv",
12-
z="ref";
13-
const a=true,
9+
const H="required",
10+
I="type",
11+
J="fn",
12+
K="argv",
13+
L="ref",
14+
M="url",
15+
N="properties",
16+
O="headers";
17+
const a=false,
1418
b="isSet",
15-
c="booleanEquals",
16-
d="error",
17-
e="endpoint",
18-
f="tree",
19-
g="PartitionResult",
20-
h="getAttr",
21-
i="stringEquals",
22-
j={[w]:false,"type":"String"},
23-
k={[w]:true,"default":false,"type":"Boolean"},
24-
l={[z]:"Endpoint"},
25-
m={[x]:c,[y]:[{[z]:"UseFIPS"},true]},
26-
n={[x]:c,[y]:[{[z]:"UseDualStack"},true]},
27-
o={},
28-
p={[z]:"Region"},
29-
q={[x]:h,[y]:[{[z]:g},"supportsFIPS"]},
30-
r={[z]:g},
31-
s={[x]:c,[y]:[true,{[x]:h,[y]:[r,"supportsDualStack"]}]},
32-
t=[m],
33-
u=[n],
34-
v=[p];
35-
const _data={version:"1.0",parameters:{Region:j,UseDualStack:k,UseFIPS:k,Endpoint:j},rules:[{conditions:[{[x]:b,[y]:[l]}],rules:[{conditions:t,error:"Invalid Configuration: FIPS and custom endpoint are not supported",type:d},{conditions:u,error:"Invalid Configuration: Dualstack and custom endpoint are not supported",type:d},{endpoint:{url:l,properties:o,headers:o},type:e}],type:f},{conditions:[{[x]:b,[y]:v}],rules:[{conditions:[{[x]:"aws.partition",[y]:v,assign:g}],rules:[{conditions:[m,n],rules:[{conditions:[{[x]:c,[y]:[a,q]},s],rules:[{endpoint:{url:"https://dynamodb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}",properties:o,headers:o},type:e}],type:f},{error:"FIPS and DualStack are enabled, but this partition does not support one or both",type:d}],type:f},{conditions:t,rules:[{conditions:[{[x]:c,[y]:[q,a]}],rules:[{conditions:[{[x]:i,[y]:[{[x]:h,[y]:[r,"name"]},"aws-us-gov"]}],endpoint:{url:"https://dynamodb.{Region}.amazonaws.com",properties:o,headers:o},type:e},{endpoint:{url:"https://dynamodb-fips.{Region}.{PartitionResult#dnsSuffix}",properties:o,headers:o},type:e}],type:f},{error:"FIPS is enabled but this partition does not support FIPS",type:d}],type:f},{conditions:u,rules:[{conditions:[s],rules:[{endpoint:{url:"https://dynamodb.{Region}.{PartitionResult#dualStackDnsSuffix}",properties:o,headers:o},type:e}],type:f},{error:"DualStack is enabled but this partition does not support DualStack",type:d}],type:f},{conditions:[{[x]:i,[y]:[p,"local"]}],endpoint:{url:"http://localhost:8000",properties:{authSchemes:[{name:"sigv4",signingName:"dynamodb",signingRegion:"us-east-1"}]},headers:o},type:e},{endpoint:{url:"https://dynamodb.{Region}.{PartitionResult#dnsSuffix}",properties:o,headers:o},type:e}],type:f}],type:f},{error:"Invalid Configuration: Missing Region",type:d}]};
19+
c="error",
20+
d="endpoint",
21+
e="tree",
22+
f="PartitionResult",
23+
g="stringEquals",
24+
h="not",
25+
i={[H]:false,[I]:"String"},
26+
j={[H]:true,"default":false,[I]:"Boolean"},
27+
k={[J]:"booleanEquals",[K]:[{[L]:"UseFIPS"},true]},
28+
l={[J]:"booleanEquals",[K]:[{[L]:"UseDualStack"},true]},
29+
m={},
30+
n={[L]:"Region"},
31+
o={[J]:b,[K]:[{[L]:"AccountIdEndpointMode"}]},
32+
p={[L]:"AccountIdEndpointMode"},
33+
q={[J]:b,[K]:[{[L]:"AccountId"}]},
34+
r={[L]:"AccountId"},
35+
s={[J]:g,[K]:[{[J]:"getAttr",[K]:[{[L]:f},"name"]},"aws"]},
36+
t={[J]:"getAttr",[K]:[{[L]:f},"name"]},
37+
u={[J]:h,[K]:[k]},
38+
v={[J]:h,[K]:[l]},
39+
w={[J]:"booleanEquals",[K]:[{[J]:"getAttr",[K]:[{[L]:f},"supportsFIPS"]},true]},
40+
x={[J]:"booleanEquals",[K]:[{[J]:"getAttr",[K]:[{[L]:f},"supportsDualStack"]},true]},
41+
y={[M]:"https://dynamodb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}",[N]:{},[O]:{}},
42+
z={"conditions":[o,{[J]:g,[K]:[p,"disabled"]}],[d]:{[M]:"https://dynamodb.{Region}.{PartitionResult#dnsSuffix}",[N]:{},[O]:{}},[I]:d},
43+
A={[d]:{[M]:"https://dynamodb.{Region}.{PartitionResult#dnsSuffix}",[N]:{},[O]:{}},[I]:d},
44+
B={[M]:"https://dynamodb-fips.{Region}.{PartitionResult#dnsSuffix}",[N]:{},[O]:{}},
45+
C={[M]:"https://dynamodb.{Region}.{PartitionResult#dualStackDnsSuffix}",[N]:{},[O]:{}},
46+
D=[k],
47+
E=[l],
48+
F=[n],
49+
G=[o,{[J]:g,[K]:[p,"disabled"]}];
50+
const _data={version:"1.0",parameters:{Region:i,UseDualStack:j,UseFIPS:j,Endpoint:i,AccountId:i,AccountIdEndpointMode:i},rules:[{conditions:[{[J]:b,[K]:[{[L]:"Endpoint"}]}],rules:[{conditions:D,error:"Invalid Configuration: FIPS and custom endpoint are not supported",[I]:c},{conditions:E,error:"Invalid Configuration: Dualstack and custom endpoint are not supported",[I]:c},{endpoint:{[M]:"{Endpoint}",[N]:m,[O]:m},[I]:d}],[I]:e},{conditions:[{[J]:b,[K]:F}],rules:[{conditions:[{[J]:"aws.partition",[K]:F,assign:f}],rules:[{conditions:[{[J]:g,[K]:[n,"local"]}],rules:[{conditions:D,error:"Invalid Configuration: FIPS and local endpoint are not supported",[I]:c},{conditions:E,error:"Invalid Configuration: Dualstack and local endpoint are not supported",[I]:c},{endpoint:{[M]:"http://localhost:8000",[N]:{authSchemes:[{name:"sigv4",signingName:"dynamodb",signingRegion:"us-east-1"}]},[O]:m},[I]:d}],[I]:e},{conditions:[o,{[J]:g,[K]:[p,"required"]},{[J]:h,[K]:[q]}],error:"AccountIdEndpointMode is required but no AccountID was provided or able to be loaded.",[I]:c},{conditions:[q,s,u,v,{[J]:h,[K]:[{[J]:"isValidHostLabel",[K]:[r,a]}]}],error:"Credentials-sourced account ID parameter is invalid",[I]:c},{conditions:[k,l],rules:[{conditions:[w,x],rules:[{conditions:G,endpoint:y,[I]:d},{endpoint:y,[I]:d}],[I]:e},{error:"FIPS and DualStack are enabled, but this partition does not support one or both",[I]:c}],[I]:e},{conditions:D,rules:[{conditions:[w],rules:[{conditions:[{[J]:g,[K]:[t,"aws-us-gov"]}],rules:[z,A],[I]:e},{conditions:G,endpoint:B,[I]:d},{endpoint:B,[I]:d}],[I]:e},{error:"FIPS is enabled but this partition does not support FIPS",[I]:c}],[I]:e},{conditions:E,rules:[{conditions:[x],rules:[{conditions:G,endpoint:C,[I]:d},{endpoint:C,[I]:d}],[I]:e},{error:"DualStack is enabled but this partition does not support DualStack",[I]:c}],[I]:e},z,{conditions:[q,s,u,v],endpoint:{[M]:"https://{AccountId}.ddb.{Region}.{PartitionResult#dnsSuffix}",[N]:m,[O]:m},[I]:d},A],[I]:e}],[I]:e},{error:"Invalid Configuration: Missing Region",[I]:c}]};
3651
export const ruleSet: RuleSetObject = _data;

clients/client-dynamodb/src/runtimeConfig.browser.ts

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import packageInfo from "../package.json"; // eslint-disable-line
44

55
import { Sha256 } from "@aws-crypto/sha256-browser";
6+
import { DEFAULT_ACCOUNT_ID_ENDPOINT_MODE } from "@aws-sdk/core/account-id-endpoint";
67
import { defaultUserAgent } from "@aws-sdk/util-user-agent-browser";
78
import { DEFAULT_USE_DUALSTACK_ENDPOINT, DEFAULT_USE_FIPS_ENDPOINT } from "@smithy/config-resolver";
89
import { FetchHttpHandler as RequestHandler, streamCollector } from "@smithy/fetch-http-handler";
@@ -26,6 +27,7 @@ export const getRuntimeConfig = (config: DynamoDBClientConfig) => {
2627
...config,
2728
runtime: "browser",
2829
defaultsMode,
30+
accountIdEndpointMode: config?.accountIdEndpointMode ?? (() => Promise.resolve(DEFAULT_ACCOUNT_ID_ENDPOINT_MODE)),
2931
bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength,
3032
credentialDefaultProvider:
3133
config?.credentialDefaultProvider ?? ((_: unknown) => () => Promise.reject(new Error("Credential is missing"))),

clients/client-dynamodb/src/runtimeConfig.ts

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import packageInfo from "../package.json"; // eslint-disable-line
44

55
import { emitWarningIfUnsupportedVersion as awsCheckVersion } from "@aws-sdk/core";
6+
import { NODE_ACCOUNT_ID_ENDPOINT_MODE_CONFIG_OPTIONS } from "@aws-sdk/core/account-id-endpoint";
67
import { defaultProvider as credentialDefaultProvider } from "@aws-sdk/credential-provider-node";
78
import { NODE_ENDPOINT_DISCOVERY_CONFIG_OPTIONS } from "@aws-sdk/middleware-endpoint-discovery";
89
import { defaultUserAgent } from "@aws-sdk/util-user-agent-node";
@@ -38,6 +39,8 @@ export const getRuntimeConfig = (config: DynamoDBClientConfig) => {
3839
...config,
3940
runtime: "node",
4041
defaultsMode,
42+
accountIdEndpointMode:
43+
config?.accountIdEndpointMode ?? loadNodeConfig(NODE_ACCOUNT_ID_ENDPOINT_MODE_CONFIG_OPTIONS),
4144
bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength,
4245
credentialDefaultProvider: config?.credentialDefaultProvider ?? credentialDefaultProvider,
4346
defaultUserAgentProvider:

0 commit comments

Comments
 (0)