class OpenSearch::Aws::Sigv4Client
@attr [Aws::Sigv4::Signer] sigv4_signer Signer used to sign every request
puts client.cat.health
)
signer
{ host: ‘my-os-domain.us-east-1.es.amazonaws.com/’ },
client = OpenSearch::Aws::Sigv4Client.new(
session_token: ‘<session_token>’)
secret_access_key: ‘<secret_access_key>’,
access_key_id: ‘<access_key_id>’,
region: ‘us-east-1’,
signer = Aws::Sigv4::Signer.new(service: ‘es’,
@example
with a Sigv4 Signature with the provided signer.
This client accepts a Sigv4 Signer during initialization, and signs every request
AWS Sigv4 Wrapper for OpenSearch::Client.
def initialize(transport_args, sigv4_signer, options: {}, &block)
(**options)
-
:sigv4_debug
(Boolean
) -- whether to log debug info for Sigv4 Signing
Parameters:
-
options
(Hash
) -- -
sigv4_signer
(Aws::Sigv4::Signer
) -- an instance of AWS Sigv4 Signer. -
block
(&block
) -- code block to be passed to OpenSearch::Transport::Client. -
transport_args
(Hash
) -- arguments for OpenSearch::Transport::Client.
def initialize(transport_args, sigv4_signer, options: {}, &block) unless sigv4_signer.is_a?(::Aws::Sigv4::Signer) raise ArgumentError, "Please pass a Aws::Sigv4::Signer. A #{sigv4_signer.class} was given." end @sigv4_signer = sigv4_signer @sigv4_debug = options[:sigv4_debug] @logger = nil super(transport_args, &block) end
def log(title, message)
def log(title, message) logger.debug("#{title.upcase}:\n\e[36m#{message}\e[0m") end
def log_signature_info(signature)
-
signature
(Aws::Sigv4::Signature
) --
def log_signature_info(signature) return unless @sigv4_debug log('string to sign', signature.string_to_sign) log('canonical request', signature.canonical_request) log('signature headers', signature.headers) end
def logger
def logger return @logger if @logger require 'logger' @logger = Logger.new( $stdout, progname: 'Sigv4', formatter: proc { |_severity, datetime, progname, msg| "\e[34m(#{datetime}) #{progname} - #{msg}\e[0m\n\n" } ) end
def perform_request(method, path, params = {}, body = nil, headers = nil)
- See: OpenSearch::Transport::Transport::Base::perform_request -
def perform_request(method, path, params = {}, body = nil, headers = nil) signature_body = body.is_a?(Hash) ? body.to_json : body.to_s signature = sigv4_signer.sign_request( http_method: method, url: signature_url(path, params), headers: headers, body: signature_body ) headers = (headers || {}).merge(signature.headers) log_signature_info(signature) super(method, path, params, signature_body, headers) end
def signature_url(path, params)
def signature_url(path, params) host = @transport.transport.hosts.dig(0, :host) path = "/#{path}" unless path.start_with?('/') params = params.clone params.delete(:ignore) params.delete('ignore') query_string = params.empty? ? '' : Faraday::Utils::ParamsHash[params].to_query.to_s URI::HTTP.build(host: host, path: path, query: query_string) end
def verify_open_search
def verify_open_search @verified = true end