1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
# frozen_string_literal: true
module Aws
module Plugins
# @api private
class RegionalEndpoint < Seahorse::Client::Plugin
option(:profile)
option(:region,
required: true,
doc_type: String,
docstring: <<-DOCS) do |cfg|
The AWS region to connect to. The configured `:region` is
used to determine the service `:endpoint`. When not passed,
a default `:region` is searched for in the following locations:
* `Aws.config[:region]`
* `ENV['AWS_REGION']`
* `ENV['AMAZON_REGION']`
* `ENV['AWS_DEFAULT_REGION']`
* `~/.aws/credentials`
* `~/.aws/config`
DOCS
resolve_region(cfg)
end
option(:use_dualstack_endpoint,
doc_type: 'Boolean',
docstring: <<-DOCS) do |cfg|
When set to `true`, dualstack enabled endpoints (with `.aws` TLD)
will be used if available.
DOCS
resolve_use_dualstack_endpoint(cfg)
end
option(:use_fips_endpoint,
doc_type: 'Boolean',
docstring: <<-DOCS) do |cfg|
When set to `true`, fips compatible endpoints will be used if available.
When a `fips` region is used, the region is normalized and this config
is set to `true`.
DOCS
resolve_use_fips_endpoint(cfg)
end
# This option signals whether :endpoint was provided or not.
# Legacy endpoints must continue to be generated at client time.
option(:regional_endpoint, false)
# NOTE: All of the defaults block code is effectively deprecated.
# Because old services can depend on this new core version, we must
# retain it.
option(:endpoint, doc_type: String, docstring: <<-DOCS) do |cfg|
The client endpoint is normally constructed from the `:region`
option. You should only configure an `:endpoint` when connecting
to test or custom endpoints. This should be a valid HTTP(S) URI.
DOCS
endpoint_prefix = cfg.api.metadata['endpointPrefix']
if cfg.region && endpoint_prefix
if cfg.respond_to?(:sts_regional_endpoints)
sts_regional = cfg.sts_regional_endpoints
end
# check region is a valid RFC host label
unless Seahorse::Util.host_label?(cfg.region)
raise Errors::InvalidRegionError
end
region = cfg.region
new_region = region.gsub('fips-', '').gsub('-fips', '')
if region != new_region
warn("Legacy region #{region} was transformed to #{new_region}."\
'`use_fips_endpoint` config was set to true.')
cfg.override_config(:use_fips_endpoint, true)
cfg.override_config(:region, new_region)
end
Aws::Partitions::EndpointProvider.resolve(
cfg.region,
endpoint_prefix,
sts_regional,
{
dualstack: cfg.use_dualstack_endpoint,
fips: cfg.use_fips_endpoint
}
)
end
end
def after_initialize(client)
if client.config.region.nil? || client.config.region == ''
raise Errors::MissingRegionError
end
end
class << self
private
def resolve_region(cfg)
keys = %w[AWS_REGION AMAZON_REGION AWS_DEFAULT_REGION]
env_region = ENV.values_at(*keys).compact.first
env_region = nil if env_region == ''
cfg_region = Aws.shared_config.region(profile: cfg.profile)
env_region || cfg_region
end
def resolve_use_dualstack_endpoint(cfg)
value = ENV['AWS_USE_DUALSTACK_ENDPOINT']
value ||= Aws.shared_config.use_dualstack_endpoint(
profile: cfg.profile
)
Aws::Util.str_2_bool(value) || false
end
def resolve_use_fips_endpoint(cfg)
value = ENV['AWS_USE_FIPS_ENDPOINT']
value ||= Aws.shared_config.use_fips_endpoint(profile: cfg.profile)
Aws::Util.str_2_bool(value) || false
end
end
end
end
end
|