13

署名されたURLを使用して、イメージをs3バケットにアップロードしようとしています。以下は私のバケットポリシーです:presigned urlを使用してオブジェクトをamazon s3に配置するにはどうすればよいですか?

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": [ 
        "arn:aws:iam::12345678:user/myuser", 
        "arn:aws:iam::12345678:root" 
       ] 
      }, 
     "Action": [ 
       "s3:List*", 
       "s3:Put*", 
       "s3:Get*" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::myBucket", 
       "arn:aws:s3:::myBucket/*" 
      ] 
     } 
    ] 
} 

次のように私は、サーバーから署名付きURLを生成しています:

var aws = require('aws-sdk'); 
aws.config = { 
    accessKeyId: myAccessKeyId, 
    secretAccessKey: mySecretAccessKey 
}; 

var s3 = new aws.s3(); 
s3.getSignedUrl('putObject', { 
    Bucket: 'myBucket', 
    Expires: 60*60, 
    key: 'myKey' 
}, function (err, url) { 
    console.log(url); 
}); 

私はURLを取得します。私は次のエラーを取得するオブジェクト置くしようとすると、しかし:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Sid": "", 
     "Effect": "Allow", 
     "Principal": { 
      "AWS": [ 
       "arn:aws:iam::2xxxxxxxxxxx:user/myuser", 
       "arn:aws:iam::2xxxxxxxxxxx:root" 
      ] 
     }, 
     "Action": [ 
      "s3:*" 
     ], 
     "Resource": [ 
      "arn:aws:s3:::myBucket", 
      "arn:aws:s3:::myBucket/*" 
     ] 
    } 
    ] 
} 

アップデート2 私はアップロードすることができます:ここではアップデート1

<Error> 
    <Code>AccessDenied</Code> 
    <Message>Access Denied</Message> 
    <RequestId>FXXXXXXXXX</RequestId> 
    <HostId>fXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</HostId> 
</Error> 

をMYUSERのポリシーがあります次のオプションが設定されている場合。私はバケットポリシーの使い方を理解していません。

Permission for everyone

アップデート3

次のコードは動作します。今、唯一の問題は、あなたが正しくユーザーからのアクセスを許可するように、バケットのパーミッションを設定して署名したURL

#!/bin/bash 

file="$1" 

bucket="mybucket" 
resource="/${bucket}/${file}" 
contentType="image/png" 
dateValue=`date -R` 
stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}" 
s3Key="AKxxxxxxxxxxxxxxxxx" 
s3Secret="/Wuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret}  -binary | base64` 
curl -X PUT -T "${file}" \ 
    -H "Host: ${bucket}.s3.amazonaws.com" \ 
    -H "Date: ${dateValue}" \ 
    -H "Content-Type: ${contentType}" \ 
    -H "Authorization: AWS ${s3Key}:${signature}" \ 
    https://${bucket}.s3.amazonaws.com/${file} 
+0

myAccessKeyIdとmySecretAccessKeyの両方がmyuserに属しているとしますか? – Brooks

+0

はい彼らはユーザーのものです – Pravin

+0

「myKey」のURLを生成するときに「myKey」というファイルをアップロードしています。 –

答えて

6

コードを使用してファイルを正常にアップロードすることができました。ここで

は私が続く手順は次のとおりです。

以下のようにIAMユーザーのポリシーを設定し、新たなバケットと新しいIAMユーザー

  • 作成さ

    1. { 
          "Version": "2012-10-17", 
          "Statement": [ 
           { 
            "Sid": "Stmt1418647210000", 
            "Effect": "Allow", 
            "Action": [ 
             "s3:Put*" 
            ], 
            "Resource": [ 
             "arn:aws:s3:::myBucket/*" 
            ] 
           } 
          ] 
      } 
      
    2. が作成していませんバケットポリシー

    3. 使用したコードt O前の署名URL生成:画面上のURLをコピーし

      var aws = require('aws-sdk'); 
      aws.config = { 
          accessKeyId: myAccessKeyId, 
          secretAccessKey: mySecretAccessKey 
      }; 
      
      var s3 = new aws.s3(); 
      s3.getSignedUrl('putObject', { 
          Bucket: 'myBucket', 
          Expires: 60*60, 
          Key: 'myKey' 
      }, function (err, url) { 
          console.log(url); 
      }); 
      
    4. をし、以下のようにアップロードをテストするためにカール使用:私の場合は

      curl.exe -k -X PUT -T "someFile" "https://myBucket.s3.amazonaws.com/myKey?AWSAccessKeyId=ACCESS_KEY_ID&Expires=1457632663&Signature=Dhgp40j84yfjBS5v5qSNE4Q6l6U%3D" 
      

    をそれは一般的に、5-を取りましたポリシーの変更が有効になるまでに10秒かかるため、初めて失敗した場合はしばらく送信してください。

    これが役に立ちます。

  • +0

    こんにちは、あなたはmyKeyが 'getSignedUrl'関数に何であるか教えてください。 – formatkaka

    +0

    @Siddhantそれは基本的にS3上のオブジェクトの名前です。ここでパラメータの説明を確認してください:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property –

    +0

    Oy、URLの周りの引用符は本当に重要です... – chrismarx

    2

    です。

    また、ユーザーがS3サービスにアクセスできるようにするには、ユーザーのポリシーを編集する必要があります。

    資格情報を使用して自己署名付きURLを生成するユーザーのIAMポリシーを編集します。このような何か間違いなくすべてカバーします:あなたが使用IAMユーザーを選択し、右側のリストにあなたのIAMコンソールで

    { 
        "Statement": [ 
        { 
         "Sid": "AllowAllS3Access", 
         "Action": "s3:*", 
         "Effect": "Allow", 
         "Resource": "*" 
        } 
        ] 
    } 
    
    +0

    私はまだ人を理解できません。何が起こっている?それでもアクセス拒否エラーが発生します。 – Pravin

    +1

    これにより、すべてのS3バケットに対するすべての権限がユーザーに付与されます。かなり開いていて危険です。 –

    1
    1. click Users
    2. を(「myuserの」あるべき)
    3. は、上の権限を選択します。サブタブ
    4. クリックして、ポリシーを添付してAmazonS3FullAccess

    最終ページはのようになりますを選択してください。

    [セキュリティ資格情報]サブタブをオンにして、accessKeyIdをリストに追加することもできます。 secretAccessKeyはちょうど再度得ることができません。

    +0

    これは完全な管理者アクセス権限です。 s3コンソールからアップロードできます。問題は、署名されたURLを使用してアップロードできないことです。 – Pravin

    関連する問題