class Idlc::AWSRestClient

Public Class Methods

new(credentials= { access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], session_token: ENV['AWS_SESSION_TOKEN'] }, region=ENV['AWS_REGION'] ) click to toggle source
# File lib/idlc-sdk-core/restclient.rb, line 58
def initialize(credentials=  {
      access_key_id: ENV['AWS_ACCESS_KEY_ID'],
      secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
      session_token: ENV['AWS_SESSION_TOKEN']
    },
    region=ENV['AWS_REGION']
  )
  @service_name = 'execute-api'
  @credentials = credentials
  @region = region
  @backend_services = Idlc::SERVICES[region]
end

Public Instance Methods

fetch(request) click to toggle source
# File lib/idlc-sdk-core/restclient.rb, line 71
def fetch(request)
  request = JSON.parse(request)

  endpoint = 'https://' + @backend_services[request['service']]['endpoint'] + '/' + @backend_services[request['service']]['stage']

  body = ''
  body = request['body'].to_json if request['body']

  retries = 0
  max_retries = 5
  sleep_time = 5
  exp_backoff = 2
  result = nil

  loop do
    begin
      resp = send_signed_request(
        request['method'],
        "#{endpoint.strip}#{request['path']}",
        body
      )

      result = JSON.parse(resp.body)
      message = "status: #{resp.code}, response: #{result}"
      raise message unless resp.code == '200'
      break
    rescue Exception => e
      break if retries >= max_retries
      retries += 1
      msg("RequestFailed: #{e} - Waiting #{sleep_time}s then retrying... (#{retries} of #{max_retries})")


      sleep sleep_time
      sleep_time *= exp_backoff # use an exponential backoff when retrying requests
    end
  end

  # if request has 'outfile' param, write response body to file
  to_file(result, request['outfile']) if request['outfile']

  # return response body obj
  result
end
to_file(obj, filename) click to toggle source
# File lib/idlc-sdk-core/restclient.rb, line 115
def to_file(obj, filename)
  File.open(filename, 'w') do |f|
    f.write(obj.to_json)
  end
end

Private Instance Methods

http_request(method, path, signature, payload) click to toggle source
# File lib/idlc-sdk-core/restclient.rb, line 144
def http_request(method, path, signature, payload)
  case method.downcase
  when 'put'
    request = Net::HTTP::Put.new(path)
  when 'post'
    request = Net::HTTP::Post.new(path)
  when 'get'
    request = Net::HTTP::Get.new(path)
  when 'delete'
    request = Net::HTTP::Delete.new(path)
  else
    request = Net::HTTP::Put.new(path)
  end

  set_headers(request, signature)
  request.body = payload

  request
end
send_signed_request(method, url, payload) click to toggle source
# File lib/idlc-sdk-core/restclient.rb, line 123
def send_signed_request(method, url, payload)
  uri = URI.parse(url)
  https = Net::HTTP.new(uri.host, uri.port)
  https.use_ssl = true
  signature = sigv4_signature(method, url, payload)
  path = uri.path
  path = path + '?' + uri.query if uri.query
  request = http_request(method, path, signature, payload)

  response = https.request(request)
end
set_headers(request, signature) click to toggle source
# File lib/idlc-sdk-core/restclient.rb, line 135
def set_headers(request, signature)
  request.add_field 'content-type', 'application/json'
  request.add_field 'host', signature.headers['host']
  request.add_field 'x-amz-date', signature.headers['x-amz-date']
  request.add_field 'x-amz-security-token', signature.headers['x-amz-security-token'] unless (signature.headers['x-amz-security-token'].nil?)
  request.add_field 'x-amz-content-sha256', signature.headers['x-amz-content-sha256']
  request.add_field 'authorization', signature.headers['authorization']
end
signer() click to toggle source
# File lib/idlc-sdk-core/restclient.rb, line 164
def signer
  Aws::Sigv4::Signer.new(
    service: @service_name,
    region: @region,
    access_key_id: @credentials[:access_key_id],
    secret_access_key: @credentials[:secret_access_key],
    session_token: @credentials[:session_token]
  )
end
sigv4_signature(method, url, payload) click to toggle source
# File lib/idlc-sdk-core/restclient.rb, line 174
def sigv4_signature(method, url, payload)
  signer.sign_request(
    http_method: method,
    url: url,
    headers: {
      'content-type' => 'application/json'
    },
    body: payload
  )
end