簡體   English   中英

適用於 AWS 個性化的開發工具包是否可以與 Ruby 一起使用?

[英]Does the SDK for AWS personalize work with Ruby?

我正在 docker 容器內的 ruby on rails 應用程序中設置 Web 客戶端,我希望它使用 Amazon Personalize SDK。 該文檔是為 Python 和 AWS CLI 編寫的。 我正在使用 Net::HTTP 庫在 ruby 中編寫示例請求並遇到問題。

目前我的請求返回一個 403 和一個<InvalidSignatureException> <Message>Credential should be scoped to correct service: 'personalize'. </Message> <InvalidSignatureException> <Message>Credential should be scoped to correct service: 'personalize'. </Message>錯誤。 我認為我的問題是我沒有使用正確的host

但是,當我捆綁aws-sdk gem 時,我看到許多aws-sdk gem 被捆綁在一起,看起來像aws-sdk-#{name_of_aws_service} ,但沒有aws-sdk-personalize 所以我的問題是,這是為什么? 我試圖用 Ruby 做這件事是不是找錯了樹? 我需要學習 Python 嗎?

host = # removed because SO
service = 'es'
region = '' #removed because SO

signer = Aws::Sigv4::Signer.new(
  service: service,
  region: region,
  access_key_id: ENV['AWS_ACCESS_KEY_ID'],
  secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
)
document = {
  # removed because SO
}

signature = signer.sign_request(
  http_method: 'PUT',
  url: host,
  body: document.to_json
)

uri = URI(host)

Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
  request = Net::HTTP::Put.new uri
  request.body = document.to_json
  request['Host'] = signature.headers['host']
  request['X-Amz-Date'] = signature.headers['x-amz-date']
  request['X-Amz-Security-Token'] = signature.headers['x-amz-security-token']
  request['X-Amz-Content-Sha256']= signature.headers['x-amz-content-sha256']
  request['Authorization'] = signature.headers['authorization']
  request['Content-Type'] = 'application/json'
  response = http.request request
  puts response.code
  puts response.body
end

我仔細閱讀文檔得到的答案是否定的。 而且 AWS Personalize 無論如何都不適用於一般發布。 所以我要把它標記為已解決並繼續。

另一種解決方案是使用這個 gem,假設您有密鑰 ID、密鑰和會話令牌

https://github.com/winebarrel/faraday_middleware-aws-sigv4

conn = Faraday.new(url: API_BASE_URL) do |faraday|
    faraday.request :aws_signers_v4,
         credentials: Aws::Credentials.new(response["access_key_id"], response["secret_key"], response["session_token"]),
          service_name: 'execute-api',
          region: 'us-east-1'
  faraday.adapter Faraday.default_adapter
end
puts conn.headers
response = conn.post('/orders') do |req|
    req.headers['Content-Type'] = 'application/json'
end
puts response.body

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM