Tengo un depósito S3 que funciona perfectamente con las credenciales de raíz ( AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY ) para cargar archivos en el depósito.
He creado un usuario de IAM .
Intenté darle a este usuario de IAM el privilegio de cargar archivos en este depósito creando esta política y adjuntándola a ese depósito:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement2", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::122xxxxxxxx28:user/iam-user-name" }, "Action": "s3:*", "Resource": "arn:aws:s3:::bucket-name" } ] }Sin embargo, cuando intento cargar un archivo, aparece este error:
> PUT > https://bucket-name.s3.region-code.amazonaws.com/images/60ded1353752602bf4b364ee.jpeg?Content-Type=image%2F%2A&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIARZARRPPIBMVEWKUW%2F20220128%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20220128T123229Z&X-Amz-Expires=300&X-Amz-Signature=dfdc3d92f6e52da5387c113ddd793990d1033fdd7318b42b2573594835c01643&X-Amz-SignedHeaders=host%3Bx-amz-acl&x-amz-acl=public-read > 403 (Forbidden)Así es como funciona la carga:
var getImageSignedUrl = async function (key) { return new Promise((resolve, reject) => { s3.getSignedUrl( "putObject", { Bucket: AWS_BUCKET_NAME, Key: key, ContentType: "image/*", ACL: "public-read", Expires: 300, }, (err, url) => { if (err) { reject(err); } else { resolve(url); } } ); }); }; await axios.put(uploadConfig.url, file, { headers: { "Content-Type": file.type, "x-amz-acl": "public-read", }, transformRequest: (data, headers) => { delete headers.common["Authorization"]; return data; }, });Es posible que deba reemplazar:
"Resource": "arn:aws:s3:::bucket-name"Con:
"Resource": ["arn:aws:s3:::bucket-name","arn:aws:s3:::bucket-name/*"]Acciones como S3:PutObject se aplican a objetos específicos en el depósito como: nombre-depósito/imagen_1.png, por lo que agregar un recurso comodín permite el acceso a esas operaciones de objetos.