Module: SensuPluginsHttp::AwsV4

Defined in:
lib/sensu-plugins-http/aws-v4.rb

Instance Method Summary collapse

Instance Method Details

#apply_v4_signature(http, req, options = {}) ⇒ Object

Returns a modified request object with AWS v4 signature headers and authentication options (if any)

Parameters:

  • http (Net::HTTP)

    The http object used to execute the request. Used to build uri

  • req (Net::HTTPGenericRequest)

    The http request. Used to populate headers, path, method, and body

  • options (Hash) (defaults to: {})

    Details about how to configure the request

Options Hash (options):

  • :aws_v4_service (String)

    AWS service to use in signature. Defaults to ‘execute-api’

  • :aws_v4_region (String)

    AWS region to use in signature. Defaults to ENV or ENV



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/sensu-plugins-http/aws-v4.rb', line 18

def apply_v4_signature(http, req, options = {})
  require 'aws-sdk'

  fake_seahorse = Struct.new(:endpoint, :body, :headers, :http_method)
  headers = {}
  req.each_name { |name| headers[name] = req[name] }
  protocol = http.use_ssl? ? 'https' : 'http'
  uri = URI.parse("#{protocol}://#{http.address}:#{http.port}#{req.path}")
  fake_req = fake_seahorse.new(uri, req.body || '',
                               headers, req.method)

  credentials = Aws::CredentialProviderChain.new.resolve
  service = options[:aws_v4_service] || 'execute-api'
  region = options[:aws_v4_region] || ENV['AWS_REGION'] || ENV['AWS_DEFAULT_REGION']
  signer = Aws::Signers::V4.new(credentials, service, region)

  signed_req = signer.sign(fake_req)
  signed_req.headers.each { |key, value| req[key] = value }

  req
end