javascript - nombre - s3 cname
¿Cómo le pongo el objeto a amazon s3 usando url presignado? (4)
- En su consola IAM, haga clic en Usuarios
- En la lista de la derecha, elija el usuario IAM que usó (debería ser ''miusuario'')
- Elija permisos en las sub pestañas
- Haga clic en Adjuntar política y elija AmazonS3FullAccess
La página final será así.
También puede marcar la subpestaña Credenciales de seguridad, su clave de acceso debe estar en la lista. El secretAccessKey simplemente no puede obtener de nuevo.
Estoy tratando de usar una URL firmada para subir imágenes a s3 bucket. La siguiente es mi política de cubo:
{
"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/*"
]
}
]
}
Estoy generando la url firmada desde el servidor de la siguiente manera:
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);
});
Me sale la url Pero cuando intento colocar un objeto, aparece el siguiente error:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>FXXXXXXXXX</RequestId>
<HostId>fXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</HostId>
</Error>
Actualización 1
Aquí está la política de 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/*"
]
}
]
}
Actualización 2 Puedo cargar solo cuando se establece la siguiente opción. No entiendo cuál es el uso de la política de depósito si solo la selección manual de permisos funciona.
Actualización 3
El siguiente código funciona. Ahora el único problema es la url firmada.
#!/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}
Ha configurado correctamente los permisos en el depósito, para permitir el acceso del usuario.
Pero también debe editar la política del usuario para permitirle acceder al servicio S3.
Edite la política de IAM del usuario cuyas credenciales está utilizando para generar la URL autofirmada. Algo como esto definitivamente cubrirá todo:
{
"Statement": [
{
"Sid": "AllowAllS3Access",
"Action": "s3:*",
"Effect": "Allow",
"Resource": "*"
}
]
}
Logré subir un archivo con éxito usando tu código.
Aquí están los pasos que seguí:
Creé un nuevo cubo y un nuevo usuario de IAM.
Establezca la política del usuario de IAM de la siguiente manera:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1418647210000", "Effect": "Allow", "Action": [ "s3:Put*" ], "Resource": [ "arn:aws:s3:::myBucket/*" ] } ] }
NO creó una política de depósito
Utiliza tu código para generar la URL pre-firmada:
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); });
Copié la URL en la pantalla y usé curl para probar la carga como se muestra a continuación:
curl.exe -k -X PUT -T "someFile" "https://myBucket.s3.amazonaws.com/myKey?AWSAccessKeyId=ACCESS_KEY_ID&Expires=1457632663&Signature=Dhgp40j84yfjBS5v5qSNE4Q6l6U%3D"
En mi caso, por lo general, tomaron de 5 a 10 segundos para que los cambios en la política entraran en vigencia, por lo que si falla la primera vez, asegúrese de seguir enviándolo por un tiempo.
Espero que esto ayude.
También te puede ayudar :) Añade una propiedad ContentType :
s3.getSignedUrl(''putObject'', {
Bucket: ''myBucket'',
Expires: 60*60,
Key: ''myKey'',
ContentType: ''image/jpeg'',
}, function (err, url) {
console.log(url);
});