簡體   English   中英

如何使用Ruby AWS SDK v2創建指向特定版本對象的預簽名鏈接?

[英]How do I create a presigned link to a particular version of an object using the Ruby AWS SDK v2?

我正在使用Ruby AWS SDK(v2)將日志文件上傳到版本為S3的存儲桶。 日志文件不是公開的,但是我想生成一個指向日志的預簽名鏈接,以便通過聊天集成在有限的時間內可用。 我想鏈接到特定版本, 此答案表示可以通過S3控制台進行鏈接。

有關Aws::S3::Presigner文檔, Aws::S3::Presigner了如何對未版本控制的對象(或版本控制的對象的Aws::S3::Presigner執行此操作,但不針對特定版本執行此操作。 #presigned_url的可能參數沒有得到很好的記錄,讀取源代碼看起來像參數只是傳遞給了不是S3特定的Seahorse::Client::Base#build_request

我想我終於解決了這個問題,盡管我仍然不確定是否可以跟蹤整個代碼路徑。 簡而言之:您可以將options參數中的:version_id傳遞給presigned_url

#
# Uploads a log to S3 at the given key, returning a URL
# to the file that's good for one hour.
#
# @param [String] bucket
# @param [String] key
# @param [String] body of the log to be uploaded
# @param [Hash] options
# @return [String] public URL of uploaded log, valid for one hour
# @raise [Exception] if the S3 upload fails
#
def upload_log(bucket, key, body, options={})
  # Upload log
  result = AWS::S3.create_client.put_object(
    options.merge(
      bucket: bucket,
      key: key,
      body: body
    )
  )

  # Get presigned URL that expires in one hour
  options = {bucket: bucket, key: key, expires_in: 3600}
  options[:version_id] = result[:version_id] unless result[:version_id].nil?
  Aws::S3::Presigner.new.presigned_url(:get_object, options)
end

在這里,我可以追蹤到一切的原因:

  1. presigned_url將其params參數傳遞給@client.build_requestpresigner.rb#L48 )。

  2. build_request最終將這些參數推送到它返回的請求的request.context.params上(記錄在client / base_spec.rb#L91中 )。

  3. 從這里我的理解是模糊的。 我希望類似Aws :: Rest :: Request :: Builder的所有參數一起創建Endpoint並且該操作的特定規則(我無法找到)允許將version_id添加到查詢字符串中。

無論如何,它都在工作。 感謝邁克爾的指導!

暫無
暫無

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

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