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: "api.ecr-public.{region}.api.aws",
114 Protocols: []string{"https"},
115 SignatureVersions: []string{"v4"},
116 },
117 {
118 Variant: endpoints.FIPSVariant,
119 }: {
120 Hostname: "api.ecr-public-fips.{region}.amazonaws.com",
121 Protocols: []string{"https"},
122 SignatureVersions: []string{"v4"},
123 },
124 {
125 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
126 }: {
127 Hostname: "api.ecr-public-fips.{region}.api.aws",
128 Protocols: []string{"https"},
129 SignatureVersions: []string{"v4"},
130 },
131 {
132 Variant: 0,
133 }: {
134 Hostname: "api.ecr-public.{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: "us-east-1",
144 }: endpoints.Endpoint{
145 Hostname: "api.ecr-public.us-east-1.amazonaws.com",
146 CredentialScope: endpoints.CredentialScope{
147 Region: "us-east-1",
148 },
149 },
150 endpoints.EndpointKey{
151 Region: "us-west-2",
152 }: endpoints.Endpoint{
153 Hostname: "api.ecr-public.us-west-2.amazonaws.com",
154 CredentialScope: endpoints.CredentialScope{
155 Region: "us-west-2",
156 },
157 },
158 },
159 },
160 {
161 ID: "aws-cn",
162 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
163 {
164 Variant: endpoints.DualStackVariant,
165 }: {
166 Hostname: "api.ecr-public.{region}.api.amazonwebservices.com.cn",
167 Protocols: []string{"https"},
168 SignatureVersions: []string{"v4"},
169 },
170 {
171 Variant: endpoints.FIPSVariant,
172 }: {
173 Hostname: "api.ecr-public-fips.{region}.amazonaws.com.cn",
174 Protocols: []string{"https"},
175 SignatureVersions: []string{"v4"},
176 },
177 {
178 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
179 }: {
180 Hostname: "api.ecr-public-fips.{region}.api.amazonwebservices.com.cn",
181 Protocols: []string{"https"},
182 SignatureVersions: []string{"v4"},
183 },
184 {
185 Variant: 0,
186 }: {
187 Hostname: "api.ecr-public.{region}.amazonaws.com.cn",
188 Protocols: []string{"https"},
189 SignatureVersions: []string{"v4"},
190 },
191 },
192 RegionRegex: partitionRegexp.AwsCn,
193 IsRegionalized: true,
194 },
195 {
196 ID: "aws-iso",
197 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
198 {
199 Variant: endpoints.FIPSVariant,
200 }: {
201 Hostname: "api.ecr-public-fips.{region}.c2s.ic.gov",
202 Protocols: []string{"https"},
203 SignatureVersions: []string{"v4"},
204 },
205 {
206 Variant: 0,
207 }: {
208 Hostname: "api.ecr-public.{region}.c2s.ic.gov",
209 Protocols: []string{"https"},
210 SignatureVersions: []string{"v4"},
211 },
212 },
213 RegionRegex: partitionRegexp.AwsIso,
214 IsRegionalized: true,
215 },
216 {
217 ID: "aws-iso-b",
218 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
219 {
220 Variant: endpoints.FIPSVariant,
221 }: {
222 Hostname: "api.ecr-public-fips.{region}.sc2s.sgov.gov",
223 Protocols: []string{"https"},
224 SignatureVersions: []string{"v4"},
225 },
226 {
227 Variant: 0,
228 }: {
229 Hostname: "api.ecr-public.{region}.sc2s.sgov.gov",
230 Protocols: []string{"https"},
231 SignatureVersions: []string{"v4"},
232 },
233 },
234 RegionRegex: partitionRegexp.AwsIsoB,
235 IsRegionalized: true,
236 },
237 {
238 ID: "aws-iso-e",
239 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
240 {
241 Variant: endpoints.FIPSVariant,
242 }: {
243 Hostname: "api.ecr-public-fips.{region}.cloud.adc-e.uk",
244 Protocols: []string{"https"},
245 SignatureVersions: []string{"v4"},
246 },
247 {
248 Variant: 0,
249 }: {
250 Hostname: "api.ecr-public.{region}.cloud.adc-e.uk",
251 Protocols: []string{"https"},
252 SignatureVersions: []string{"v4"},
253 },
254 },
255 RegionRegex: partitionRegexp.AwsIsoE,
256 IsRegionalized: true,
257 },
258 {
259 ID: "aws-iso-f",
260 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
261 {
262 Variant: endpoints.FIPSVariant,
263 }: {
264 Hostname: "api.ecr-public-fips.{region}.csp.hci.ic.gov",
265 Protocols: []string{"https"},
266 SignatureVersions: []string{"v4"},
267 },
268 {
269 Variant: 0,
270 }: {
271 Hostname: "api.ecr-public.{region}.csp.hci.ic.gov",
272 Protocols: []string{"https"},
273 SignatureVersions: []string{"v4"},
274 },
275 },
276 RegionRegex: partitionRegexp.AwsIsoF,
277 IsRegionalized: true,
278 },
279 {
280 ID: "aws-us-gov",
281 Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
282 {
283 Variant: endpoints.DualStackVariant,
284 }: {
285 Hostname: "api.ecr-public.{region}.api.aws",
286 Protocols: []string{"https"},
287 SignatureVersions: []string{"v4"},
288 },
289 {
290 Variant: endpoints.FIPSVariant,
291 }: {
292 Hostname: "api.ecr-public-fips.{region}.amazonaws.com",
293 Protocols: []string{"https"},
294 SignatureVersions: []string{"v4"},
295 },
296 {
297 Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
298 }: {
299 Hostname: "api.ecr-public-fips.{region}.api.aws",
300 Protocols: []string{"https"},
301 SignatureVersions: []string{"v4"},
302 },
303 {
304 Variant: 0,
305 }: {
306 Hostname: "api.ecr-public.{region}.amazonaws.com",
307 Protocols: []string{"https"},
308 SignatureVersions: []string{"v4"},
309 },
310 },
311 RegionRegex: partitionRegexp.AwsUsGov,
312 IsRegionalized: true,
313 },
314 }
315
View as plain text