如何使用Amazonka获得签名的放置对象URL

时间:2019-10-03 18:35:16

标签: haskell amazon-s3

我正在尝试获取一个预签名的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")))

1 个答案:

答案 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