Estoy siguiendo las instrucciones de esta respuesta para generar la siguiente política de depósito S3:
{ "Id": "Policy1495981680273", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1495981517155", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::surplace-audio", "Principal": "*" } ] }me devuelve el siguiente error:
La acción no se aplica a ningún recurso(s) en la declaración
¿Qué me falta en mi póliza?
Debe verificar el patrón del arn definido en la etiqueta de recurso para la política-
"Recurso": "arn:aws:s3:::s3mybucketname/*"
Agregar "/*" al final ayudaría a resolver el problema si lo enfrenta incluso después de haber desbloqueado su política de acceso público para su depósito.
También me he enfrentado a un problema similar al crear el depósito.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AddPerm", "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::mrt9949" ] } ] }He cambiado el código anterior a
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AddPerm", "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::mrt9949/*" ] } ] }agregue /* al nombre de su depósito, resolverá el problema
Aquí mi nombre de cubo es mrt9949
En mi caso la solución a este error fue intentar eliminar algunas de las Acciones que estaba aplicando. Algunos de ellos no son relevantes o no pueden funcionar con este recurso. En este caso no me dejaría incluir estos:
GetBucketAcl ListBucket ListBucketMultipartUploads
También puede configurar ListBuckets para cada carpeta, así
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSESPuts-1521238702575", "Effect": "Allow", "Principal": { "Service": "ses.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::buckets.email/*", "Condition": { "StringEquals": { "aws:Referer": "[red]" } } }, { "Sid": "Stmt1586754972129", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::596322993031:user/[red]" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::buckets.email", "Condition": { "StringEquals": { "s3:delimiter": "/", "s3:prefix": [ "", "domain.co", "domain.co/user" ] } } }, { "Sid": "Stmt1586754972129", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::596322993031:user/[red]" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::buckets.email", "Condition": { "StringLike": { "s3:prefix": "domain.co/user/*" } } }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::596322993031:user/[red]" }, "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::buckets.email/domain.co/user/*" } ] }Estas reglas se usan junto con SES para recibir un correo electrónico, pero permiten que un usuario externo vea los archivos que SES colocó en el depósito. Seguí las instrucciones de aquí: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/
Además, debe especificar el prefijo como domain.co/user/ CON una barra inclinada al final cuando use el SDK; de lo contrario, se le denegará el acceso. espero que ayude a alguien
Siempre que intente aplicar políticas de depósito de uso. Recuerde esto, si está utilizando acciones como "s3:ListBucket", "s3:GetBucketPolicy", "s3:GetBucketAcl", etc. que están relacionadas con el depósito, el atributo de recurso en la política debe mencionarse como <"Resource": " arn:aws:s3:::nombre_depósito">.
Ex.
{ "Version": "2012-10-17", "Id": "Policy1608224885249", "Statement": [ { "Sid": "Stmt1608226298927", "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetBucketPolicy", "s3:GetBucketAcl", "s3:ListBucket" ], "Resource": "arn:aws:s3:::bucket_name" } ] }Si utiliza acciones como "s3:GetObject", "s3:DeleteObject", "s3:GetObject", etc., que están relacionadas con el objeto, el atributo de recurso en la política debe mencionarse como <"Resource": "arn:aws: s3:::nombre_depósito/*">.
ex.
{ "Id": "Policy1608228066771", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1608228057071", "Action": [ "s3:DeleteObject", "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::bucket_name/*", "Principal": "*" } ] }Finalmente, si usa acciones como "s3:ListBucket", "s3:GetObject", etc., estas acciones están relacionadas tanto con el depósito como con el objeto, entonces el atributo de recurso en la política debe mencionarse como <"Recurso": ["arn:aws: s3:::bucket_name/*", "Resource": "arn:aws:s3:::bucket_name">.
ex.
{ "Version": "2012-10-17", "Id": "Policy1608224885249", "Statement": [ { "Sid": "Stmt1608226298927", "Effect": "Allow", "Principal": "*", "Action": [ "s3:ListBucket", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::bucket_name", "arn:aws:s3:::bucket_name/*" ] } ] }Esto es tan simple que solo agrega "/*" al final. Solo ha proporcionado el enlace del directorio raíz, pero la acción debe aplicarse al objeto.
Escriba, "Recurso": "arn:aws:s3:::surplace-audio/*"
Desde AWS > Documentación > AWS Identity and Access Management > Guía del usuario https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html
Está claramente definido en una nota. Algunos servicios no le permiten especificar acciones para recursos individuales.
usa el comodín * en el elemento Resource
"Recurso": "arn:aws:s3:::surplace-audio/*"
De los documentos de IAM, http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Action
Algunos servicios no le permiten especificar acciones para recursos individuales; en su lugar, cualquier acción que enumere en el elemento Action o NotAction se aplica a todos los recursos de ese servicio. En estos casos, utiliza el comodín * en el elemento Resource.
Con esta información, el recurso debería tener un valor como el siguiente:
"Resource": "arn:aws:s3:::surplace-audio/*"La acción de error no se aplica a ningún recurso en la declaración
Simplemente significa que la acción (que escribió en la política) no se aplica al recurso. Estaba tratando de hacer público mi cubo para que cualquiera pueda descargarlo. Recibía un error hasta que eliminé ("s3:ListBucket") de mi estado de cuenta.
{ "Id": "Policyxxxx961", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmtxxxxx4365", "Action": [ "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::bucket-name/*", "Principal": "*" } ] }Debido a que el depósito de lista no se aplica dentro del depósito, al eliminar esta política de acción funcionó bien.
Me encontré con este problema y encontré una solución más corta para aquellos que desean tener ListBucket y GetObject en la misma política. Lo importante es enumerar tanto el nombre del depósito como el nombre del depósito/* en Recurso.
{ "Id": "Policyxxxx961", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmtxxxxx4365", "Action": [ "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ], "Principal": "*" } ] }Simplemente quitar el permiso s3:ListBucket no fue realmente una solución lo suficientemente buena para mí, y probablemente no lo sea para muchos otros.
Si desea el permiso s3:ListBucket , solo necesita tener el arn simple del depósito (sin /* al final), ya que este permiso se aplica al depósito en sí y no a los elementos dentro del depósito.
Como se muestra a continuación, debe tener el permiso s3:ListBucket como una declaración separada de los permisos relacionados con elementos dentro del depósito como s3:GetObject y s3:PutObject :
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Principal": { "AWS": "[IAM ARN HERE]" }, "Resource": "arn:aws:s3:::my-bucket-name" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Principal": { "AWS": "[IAM ARN HERE]" }, "Resource": "arn:aws:s3:::my-bucket-name/*" } ] }Solo haga un cambio en el recurso de política json.
"Resource": ["arn:aws:s3:::bucket-name/*"]Nota: agregue /* después del nombre del depósito
Documentos de referencia: https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html
Para solucionar este problema, lo que debe hacer en la regla de política es ubicar el Resource y agregar su arn en la matriz, uno con * y el segundo sin * al final. Esto solucionará el error.
{ "Version": "2012-10-17", "Id": "Policy3783783783738", "Statement": [ { "Sid": "Stmt1615891730703", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::76367367633:user/magazine-demo-root-user" }, "Action": [ "s3:ListBucket", "s3:ListBucketVersions", "s3:GetBucketLocation", "s3:DeleteObject", "s3:AbortMultipartUpload", "s3:Get*", "s3:Put*" ], "Resource": [ "arn:aws:s3:::magazine-demo", "arn:aws:s3:::magazine-demo/*" ] } ] }Es posible que tenga varias declaraciones de política y este error es muy genérico. Lo mejor es comentar todas las demás declaraciones excepto cualquiera (como solo GetObject, ListBuckets o PutObject) y ejecutar el código y ver. Si funciona bien, significa que la ruta del ARN es correcta. De lo contrario, el ARN debe incluir solo el nombre del depósito o un nombre de depósito con /*.
Algunos recursos como ListBucket aceptan ARN con el nombre completo como "arn:aws:s3:::bucket_name", mientras que GetObject o PutObject esperan /* después de bucket_name. ¡Cambie los ARN de acuerdo con el servicio y debería funcionar ahora!