13

Я пытаюсь использовать подписанный url для загрузки изображений в ведро s3. Ниже мое ведро политика:Как поместить объект в amazon s3, используя назначенный URL?

{ 
    "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. Но когда я пытаюсь поставить объект, я получаю следующее сообщение об ошибке:

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

Update 1

Вот политика MyUser по:

{ 
    "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/*" 
     ] 
    } 
    ] 
} 

Update 2 Я могу загрузить только когда установлен следующий параметр. Я не понимаю, что такое использование политики ведра, если работает только ручной выбор разрешения.

Permission for everyone

Update 3

Следующий код работает. Теперь единственной проблемой является подписанный адрес

#!/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

Мне удалось успешно загрузить файл с помощью вашего кода.

Вот шаги, которые я затем:

  1. Создано новое ведро и новый IAM пользователя

  2. Установить политику IAM пользователя, как показано ниже:

    { 
        "Version": "2012-10-17", 
        "Statement": [ 
         { 
          "Sid": "Stmt1418647210000", 
          "Effect": "Allow", 
          "Action": [ 
           "s3:Put*" 
          ], 
          "Resource": [ 
           "arn:aws:s3:::myBucket/*" 
          ] 
         } 
        ] 
    } 
    
  3. не создавали a bucket policy

  4. Ваш код t о генерации предварительно подписанный 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); 
    }); 
    
  5. скопировали URL на экране и использовать локон, чтобы проверить загрузку, как показано ниже:

    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

@ Сиддхант Это в основном название объекта на S3. Ознакомьтесь с описаниями параметров здесь: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property –

+0

Oy, цитаты вокруг URL-адреса действительно важны здесь ... – chrismarx

2

Вы правильно настроили разрешения на ведро, чтобы разрешить доступ от пользователя.

Но вам также необходимо изменить политику пользователя, чтобы позволить пользователю получить доступ к службе S3.

Измените политику IAM пользователя, учетные данные которого вы используете для создания самозаверяющего URL. Нечто подобное, безусловно, охватывает все:

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

Я до сих пор не понимаю человека. что происходит? он по-прежнему дает доступ к ошибке отказа. – Pravin

+1

Это предоставляет пользователю все права на все ведра S3. Довольно открытый и небезопасный. –

1
  1. В вашей IAM консоли click Users
  2. На правом списке, выберите пользователя IAM использованный (должно быть «MyUser»)
  3. Выберите разрешения на суб вкладки
  4. Нажмите Вложить политику и выберите AmazonS3FullAccess

на последней странице будет как this.

Вы также можете проверить подпункты учетных данных безопасности, ваш accessKeyId должен быть в списке. Секретный доступ не может снова появиться.

+0

На данный момент у него есть полный доступ к администратору. Я могу загрузить с консоли s3. Проблема в том, что я не могу загрузить с помощью подписанного URL-адреса. – Pravin

Смежные вопросы