1
2
3 package endpoints
4
5 import (
6 "github.com/aws/aws-sdk-go-v2/aws"
7 endpoints "github.com/aws/aws-sdk-go-v2/internal/endpoints/v2"
8 "github.com/aws/smithy-go/logging"
9 "regexp"
10 )
11
12
13 type Options struct {
14
15 Logger logging.Logger
16
17
18
19 LogDeprecated bool
20
21
22
23
24
25 ResolvedRegion string
26
27
28
29 DisableHTTPS bool
30
31
32 UseDualStackEndpoint aws.DualStackEndpointState
33
34
35 UseFIPSEndpoint aws.FIPSEndpointState
36 }
37
38 func (o Options) GetResolvedRegion() string {
39 return o.ResolvedRegion
40 }
41
42 func (o Options) GetDisableHTTPS() bool {
43 return o.DisableHTTPS
44 }
45
46 func (o Options) GetUseDualStackEndpoint() aws.DualStackEndpointState {
47 return o.UseDualStackEndpoint
48 }
49
50 func (o Options) GetUseFIPSEndpoint() aws.FIPSEndpointState {
51 return o.UseFIPSEndpoint
52 }
53
54 func transformToSharedOptions(options Options) endpoints.Options {
55 return endpoints.Options{
56 Logger: options.Logger,
57 LogDeprecated: options.LogDeprecated,
58 ResolvedRegion: options.ResolvedRegion,
59 DisableHTTPS: options.DisableHTTPS,
60 UseDualStackEndpoint: options.UseDualStackEndpoint,
61 UseFIPSEndpoint: options.UseFIPSEndpoint,
62 }
63 }
64
65
66 type Resolver struct {
67 partitions endpoints.Partitions
68 }
69
70
71 func (r *Resolver) ResolveEndpoint(region string, options Options) (endpoint aws.Endpoint, err error) {
72 if len(region) == 0 {
73 return endpoint, &aws.MissingRegionError{}
74 }
75
76 opt := transformToSharedOptions(options)
77 return r.partitions.ResolveEndpoint(region, opt)
78 }
79
80
81 func New() *Resolver {
82 return &Resolver{
83 partitions: defaultPartitions,
84 }
85 }
86
87 var partitionRegexp = struct {
88 Aws *regexp.Regexp
89 AwsCn *regexp.Regexp
90 AwsIso *regexp.Regexp
91 AwsIsoB *regexp.Regexp
92 AwsIsoE *regexp.Regexp
93 AwsIsoF *regexp.Regexp
94 AwsUsGov *regexp.Regexp
95 }{
96
97 Aws: regexp.MustCompile("^(us|eu|ap|sa|ca|me|af|il)\\-\\w+\\-\\d+$"),
98 AwsCn: regexp.MustCompile("^cn\\-\\w+\\-\\d+$"),
99 AwsIso: regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"),
100 AwsIsoB: regexp.MustCompile("^us\\-isob\\-\\w+\\-\\d+$"),
101 AwsIsoE: regexp.MustCompile("^eu\\-isoe\\-\\w+\\-\\d+$"),
102 AwsIsoF: regexp.MustCompile("^us\\-isof\\-\\w+\\-\\d+$"),
103 AwsUsGov: regexp.MustCompile("^us\\-gov\\-\\w+\\-\\d+$"),
104 }
105
106 var defaultPartitions = endpoints.Partitions{
107 {
108 ID: "aws",
109 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
110 {
111 Variant: endpoints.DualStackVariant,
112 }: {
113 Hostname: "sts.{region}.api.aws",
114 Protocols: []string{"https"},
115 SignatureVersions: []string{"v4"},
116 },
117 {
118 Variant: endpoints.FIPSVariant,
119 }: {
120 Hostname: "sts-fips.{region}.amazonaws.com",
121 Protocols: []string{"https"},
122 SignatureVersions: []string{"v4"},
123 },
124 {
125 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
126 }: {
127 Hostname: "sts-fips.{region}.api.aws",
128 Protocols: []string{"https"},
129 SignatureVersions: []string{"v4"},
130 },
131 {
132 Variant: 0,
133 }: {
134 Hostname: "sts.{region}.amazonaws.com",
135 Protocols: []string{"https"},
136 SignatureVersions: []string{"v4"},
137 },
138 },
139 RegionRegex: partitionRegexp.Aws,
140 IsRegionalized: true,
141 Endpoints: endpoints.Endpoints{
142 endpoints.EndpointKey{
143 Region: "af-south-1",
144 }: endpoints.Endpoint{},
145 endpoints.EndpointKey{
146 Region: "ap-east-1",
147 }: endpoints.Endpoint{},
148 endpoints.EndpointKey{
149 Region: "ap-northeast-1",
150 }: endpoints.Endpoint{},
151 endpoints.EndpointKey{
152 Region: "ap-northeast-2",
153 }: endpoints.Endpoint{},
154 endpoints.EndpointKey{
155 Region: "ap-northeast-3",
156 }: endpoints.Endpoint{},
157 endpoints.EndpointKey{
158 Region: "ap-south-1",
159 }: endpoints.Endpoint{},
160 endpoints.EndpointKey{
161 Region: "ap-south-2",
162 }: endpoints.Endpoint{},
163 endpoints.EndpointKey{
164 Region: "ap-southeast-1",
165 }: endpoints.Endpoint{},
166 endpoints.EndpointKey{
167 Region: "ap-southeast-2",
168 }: endpoints.Endpoint{},
169 endpoints.EndpointKey{
170 Region: "ap-southeast-3",
171 }: endpoints.Endpoint{},
172 endpoints.EndpointKey{
173 Region: "ap-southeast-4",
174 }: endpoints.Endpoint{},
175 endpoints.EndpointKey{
176 Region: "aws-global",
177 }: endpoints.Endpoint{
178 Hostname: "sts.amazonaws.com",
179 CredentialScope: endpoints.CredentialScope{
180 Region: "us-east-1",
181 },
182 },
183 endpoints.EndpointKey{
184 Region: "ca-central-1",
185 }: endpoints.Endpoint{},
186 endpoints.EndpointKey{
187 Region: "ca-west-1",
188 }: endpoints.Endpoint{},
189 endpoints.EndpointKey{
190 Region: "eu-central-1",
191 }: endpoints.Endpoint{},
192 endpoints.EndpointKey{
193 Region: "eu-central-2",
194 }: endpoints.Endpoint{},
195 endpoints.EndpointKey{
196 Region: "eu-north-1",
197 }: endpoints.Endpoint{},
198 endpoints.EndpointKey{
199 Region: "eu-south-1",
200 }: endpoints.Endpoint{},
201 endpoints.EndpointKey{
202 Region: "eu-south-2",
203 }: endpoints.Endpoint{},
204 endpoints.EndpointKey{
205 Region: "eu-west-1",
206 }: endpoints.Endpoint{},
207 endpoints.EndpointKey{
208 Region: "eu-west-2",
209 }: endpoints.Endpoint{},
210 endpoints.EndpointKey{
211 Region: "eu-west-3",
212 }: endpoints.Endpoint{},
213 endpoints.EndpointKey{
214 Region: "il-central-1",
215 }: endpoints.Endpoint{},
216 endpoints.EndpointKey{
217 Region: "me-central-1",
218 }: endpoints.Endpoint{},
219 endpoints.EndpointKey{
220 Region: "me-south-1",
221 }: endpoints.Endpoint{},
222 endpoints.EndpointKey{
223 Region: "sa-east-1",
224 }: endpoints.Endpoint{},
225 endpoints.EndpointKey{
226 Region: "us-east-1",
227 }: endpoints.Endpoint{},
228 endpoints.EndpointKey{
229 Region: "us-east-1",
230 Variant: endpoints.FIPSVariant,
231 }: {
232 Hostname: "sts-fips.us-east-1.amazonaws.com",
233 },
234 endpoints.EndpointKey{
235 Region: "us-east-1-fips",
236 }: endpoints.Endpoint{
237 Hostname: "sts-fips.us-east-1.amazonaws.com",
238 CredentialScope: endpoints.CredentialScope{
239 Region: "us-east-1",
240 },
241 Deprecated: aws.TrueTernary,
242 },
243 endpoints.EndpointKey{
244 Region: "us-east-2",
245 }: endpoints.Endpoint{},
246 endpoints.EndpointKey{
247 Region: "us-east-2",
248 Variant: endpoints.FIPSVariant,
249 }: {
250 Hostname: "sts-fips.us-east-2.amazonaws.com",
251 },
252 endpoints.EndpointKey{
253 Region: "us-east-2-fips",
254 }: endpoints.Endpoint{
255 Hostname: "sts-fips.us-east-2.amazonaws.com",
256 CredentialScope: endpoints.CredentialScope{
257 Region: "us-east-2",
258 },
259 Deprecated: aws.TrueTernary,
260 },
261 endpoints.EndpointKey{
262 Region: "us-west-1",
263 }: endpoints.Endpoint{},
264 endpoints.EndpointKey{
265 Region: "us-west-1",
266 Variant: endpoints.FIPSVariant,
267 }: {
268 Hostname: "sts-fips.us-west-1.amazonaws.com",
269 },
270 endpoints.EndpointKey{
271 Region: "us-west-1-fips",
272 }: endpoints.Endpoint{
273 Hostname: "sts-fips.us-west-1.amazonaws.com",
274 CredentialScope: endpoints.CredentialScope{
275 Region: "us-west-1",
276 },
277 Deprecated: aws.TrueTernary,
278 },
279 endpoints.EndpointKey{
280 Region: "us-west-2",
281 }: endpoints.Endpoint{},
282 endpoints.EndpointKey{
283 Region: "us-west-2",
284 Variant: endpoints.FIPSVariant,
285 }: {
286 Hostname: "sts-fips.us-west-2.amazonaws.com",
287 },
288 endpoints.EndpointKey{
289 Region: "us-west-2-fips",
290 }: endpoints.Endpoint{
291 Hostname: "sts-fips.us-west-2.amazonaws.com",
292 CredentialScope: endpoints.CredentialScope{
293 Region: "us-west-2",
294 },
295 Deprecated: aws.TrueTernary,
296 },
297 },
298 },
299 {
300 ID: "aws-cn",
301 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
302 {
303 Variant: endpoints.DualStackVariant,
304 }: {
305 Hostname: "sts.{region}.api.amazonwebservices.com.cn",
306 Protocols: []string{"https"},
307 SignatureVersions: []string{"v4"},
308 },
309 {
310 Variant: endpoints.FIPSVariant,
311 }: {
312 Hostname: "sts-fips.{region}.amazonaws.com.cn",
313 Protocols: []string{"https"},
314 SignatureVersions: []string{"v4"},
315 },
316 {
317 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
318 }: {
319 Hostname: "sts-fips.{region}.api.amazonwebservices.com.cn",
320 Protocols: []string{"https"},
321 SignatureVersions: []string{"v4"},
322 },
323 {
324 Variant: 0,
325 }: {
326 Hostname: "sts.{region}.amazonaws.com.cn",
327 Protocols: []string{"https"},
328 SignatureVersions: []string{"v4"},
329 },
330 },
331 RegionRegex: partitionRegexp.AwsCn,
332 IsRegionalized: true,
333 Endpoints: endpoints.Endpoints{
334 endpoints.EndpointKey{
335 Region: "cn-north-1",
336 }: endpoints.Endpoint{},
337 endpoints.EndpointKey{
338 Region: "cn-northwest-1",
339 }: endpoints.Endpoint{},
340 },
341 },
342 {
343 ID: "aws-iso",
344 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
345 {
346 Variant: endpoints.FIPSVariant,
347 }: {
348 Hostname: "sts-fips.{region}.c2s.ic.gov",
349 Protocols: []string{"https"},
350 SignatureVersions: []string{"v4"},
351 },
352 {
353 Variant: 0,
354 }: {
355 Hostname: "sts.{region}.c2s.ic.gov",
356 Protocols: []string{"https"},
357 SignatureVersions: []string{"v4"},
358 },
359 },
360 RegionRegex: partitionRegexp.AwsIso,
361 IsRegionalized: true,
362 Endpoints: endpoints.Endpoints{
363 endpoints.EndpointKey{
364 Region: "us-iso-east-1",
365 }: endpoints.Endpoint{},
366 endpoints.EndpointKey{
367 Region: "us-iso-west-1",
368 }: endpoints.Endpoint{},
369 },
370 },
371 {
372 ID: "aws-iso-b",
373 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
374 {
375 Variant: endpoints.FIPSVariant,
376 }: {
377 Hostname: "sts-fips.{region}.sc2s.sgov.gov",
378 Protocols: []string{"https"},
379 SignatureVersions: []string{"v4"},
380 },
381 {
382 Variant: 0,
383 }: {
384 Hostname: "sts.{region}.sc2s.sgov.gov",
385 Protocols: []string{"https"},
386 SignatureVersions: []string{"v4"},
387 },
388 },
389 RegionRegex: partitionRegexp.AwsIsoB,
390 IsRegionalized: true,
391 Endpoints: endpoints.Endpoints{
392 endpoints.EndpointKey{
393 Region: "us-isob-east-1",
394 }: endpoints.Endpoint{},
395 },
396 },
397 {
398 ID: "aws-iso-e",
399 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
400 {
401 Variant: endpoints.FIPSVariant,
402 }: {
403 Hostname: "sts-fips.{region}.cloud.adc-e.uk",
404 Protocols: []string{"https"},
405 SignatureVersions: []string{"v4"},
406 },
407 {
408 Variant: 0,
409 }: {
410 Hostname: "sts.{region}.cloud.adc-e.uk",
411 Protocols: []string{"https"},
412 SignatureVersions: []string{"v4"},
413 },
414 },
415 RegionRegex: partitionRegexp.AwsIsoE,
416 IsRegionalized: true,
417 },
418 {
419 ID: "aws-iso-f",
420 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
421 {
422 Variant: endpoints.FIPSVariant,
423 }: {
424 Hostname: "sts-fips.{region}.csp.hci.ic.gov",
425 Protocols: []string{"https"},
426 SignatureVersions: []string{"v4"},
427 },
428 {
429 Variant: 0,
430 }: {
431 Hostname: "sts.{region}.csp.hci.ic.gov",
432 Protocols: []string{"https"},
433 SignatureVersions: []string{"v4"},
434 },
435 },
436 RegionRegex: partitionRegexp.AwsIsoF,
437 IsRegionalized: true,
438 },
439 {
440 ID: "aws-us-gov",
441 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
442 {
443 Variant: endpoints.DualStackVariant,
444 }: {
445 Hostname: "sts.{region}.api.aws",
446 Protocols: []string{"https"},
447 SignatureVersions: []string{"v4"},
448 },
449 {
450 Variant: endpoints.FIPSVariant,
451 }: {
452 Hostname: "sts.{region}.amazonaws.com",
453 Protocols: []string{"https"},
454 SignatureVersions: []string{"v4"},
455 },
456 {
457 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
458 }: {
459 Hostname: "sts-fips.{region}.api.aws",
460 Protocols: []string{"https"},
461 SignatureVersions: []string{"v4"},
462 },
463 {
464 Variant: 0,
465 }: {
466 Hostname: "sts.{region}.amazonaws.com",
467 Protocols: []string{"https"},
468 SignatureVersions: []string{"v4"},
469 },
470 },
471 RegionRegex: partitionRegexp.AwsUsGov,
472 IsRegionalized: true,
473 Endpoints: endpoints.Endpoints{
474 endpoints.EndpointKey{
475 Region: "us-gov-east-1",
476 }: endpoints.Endpoint{},
477 endpoints.EndpointKey{
478 Region: "us-gov-east-1",
479 Variant: endpoints.FIPSVariant,
480 }: {
481 Hostname: "sts.us-gov-east-1.amazonaws.com",
482 },
483 endpoints.EndpointKey{
484 Region: "us-gov-east-1-fips",
485 }: endpoints.Endpoint{
486 Hostname: "sts.us-gov-east-1.amazonaws.com",
487 CredentialScope: endpoints.CredentialScope{
488 Region: "us-gov-east-1",
489 },
490 Deprecated: aws.TrueTernary,
491 },
492 endpoints.EndpointKey{
493 Region: "us-gov-west-1",
494 }: endpoints.Endpoint{},
495 endpoints.EndpointKey{
496 Region: "us-gov-west-1",
497 Variant: endpoints.FIPSVariant,
498 }: {
499 Hostname: "sts.us-gov-west-1.amazonaws.com",
500 },
501 endpoints.EndpointKey{
502 Region: "us-gov-west-1-fips",
503 }: endpoints.Endpoint{
504 Hostname: "sts.us-gov-west-1.amazonaws.com",
505 CredentialScope: endpoints.CredentialScope{
506 Region: "us-gov-west-1",
507 },
508 Deprecated: aws.TrueTernary,
509 },
510 },
511 },
512 }
513
View as plain text