[英]How can I stub a chain of calls to an AWS client object using AWS SDK V2 tests?
[英]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
在這里,我可以追蹤到一切的原因:
presigned_url
將其params
參數傳遞給@client.build_request
( presigner.rb#L48 )。
build_request
最終將這些參數推送到它返回的請求的request.context.params
上(記錄在client / base_spec.rb#L91中 )。
從這里我的理解是模糊的。 我希望類似Aws :: Rest :: Request :: Builder的所有參數一起創建Endpoint
並且該操作的特定規則(我無法找到)允許將version_id
添加到查詢字符串中。
無論如何,它都在工作。 感謝邁克爾的指導!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.