我正在尝试获取一个预签名的URL,以将对象放入我的s3存储桶中。我知道存储桶配置很好,因为我已经在节点上使用它很多次了,并且没有任何问题。我目前正在尝试将上传端点转换为个人项目的haskell端点。
我尝试使用amazonka进行此操作,但是我一直从AWS那里获取错误消息,但是我一直无法找到有关如何完成此操作的良好教程。我收到的错误消息如下:
您要访问的存储桶必须使用指定的端点进行寻址。请将来发送所有请求到该端点。
我收到包含以下内容的网址: https://s3.amazonaws.com/(my-bucket-name)
所以我将其更改为: https://(my-bucket-name).s3.us-east-2.amazonaws.com 修复上述问题的前缀后,我得到以下提示:
解析X-Amz-Credential参数时出错; “ us-east-1”区域是错误的;期待“ us-east-2”
但是我要设置我的秘密密钥,访问密钥和存储桶。
以下是可重现的示例:
module Lib
( main
) where
import ClassyPrelude
import Network.AWS.S3
import Network.AWS.S3.PutObject
import Control.Monad.Trans.AWS
import Network.AWS.Data
import Control.Lens
bNameE :: BucketName
bNameE = BucketName <my-bucket-name>
oKeyE :: ObjectKey
oKeyE = ObjectKey ("101/12345-12345-12345-12345.jpg")
-- oKeyE = ObjectKey "photo-106399.jpeg"
sKeyE :: Text
sKeyE = <my-bucket-secret>
aKeyE :: Text
aKeyE = <my-bucket-public>
main :: IO ()
main = do
r <- getPresignedURL Ohio bNameE oKeyE
print r
getPresignedURL :: Region
-> BucketName
-> ObjectKey
-> IO ByteString
getPresignedURL r b k = do
lgr <- newLogger Trace stdout
env <- newEnv $ FromKeys (AccessKey $ encodeUtf8 $ aKeyE) (SecretKey $ encodeUtf8 $ sKeyE)
ts <- getCurrentTime
let p = (putObject b k "") -- & poContentType .~ (Just "Content-Type=image/jpeg")
print p
runResourceT . runAWST env $
presignURL ts 900 p --(poContentType (Lens' (Just "Content-Type=jpeg")))
答案 0 :(得分:1)
该问题是由于未在Env变量中设置区域,您可以使用以下方法生成签名的URL:
getPresignedURL :: Region
-> BucketName
-> ObjectKey
-> IO ByteString
getPresignedURL r b k = do
lgr <- newLogger Trace stdout
env <- newEnv $ FromKeys (AccessKey $ encodeUtf8 $ aKeyE) (SecretKey $ encodeUtf8 $ sKeyE)
let nEnv = env & envRegion .~ r
ts <- getCurrentTime
runResourceT . runAWST nEnv $ presignURL ts 900 (putObject b k "Content-Type=image/jpeg")
我对镜头不是很熟悉,所以我确定有一种更简洁的方法可以进行以下操作:
env <- newEnv $ FromKeys (AccessKey $ encodeUtf8 $ aKeyE) (SecretKey $ encodeUtf8 $ sKeyE)
let nEnv = env & envRegion .~ r