Доступ на запись S3 запрещен — для сегментов требуется другая политика

#amazon-s3 #acl

#amazon-s3 #acl

Вопрос:

Я получаю ошибки доступа на запись при попытке загрузки во вновь созданную корзину S3, «dev-image», с моего локального компьютера разработчика. Я обнаружил, что могу (и смог) загружать из своего приложения, работающего локально, в корзину S3 prod «image», но не могу загружать в «dev-image» из той же среды. Блокировать весь общедоступный доступ отключен, владелец корзины может перечислять и записывать объекты для обоих сегментов. Мне пришлось специально добавить политику в корзину «dev-image», чтобы разрешить доступ на запись (putObject). В 2 сегментах должно быть что-то другое, но я этого не вижу. Есть идеи, где искать?

Это политики в AWS S3:

 dev-image:

{
    "Version": "2012-10-17",
    "Id": "Policy1606066621241",
    "Statement": [
        {
            "Sid": "Allow all read",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::dev-image/*"
        },
        {
            "Sid": "Allow write from dev machine",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::dev-image/*",
             }
        }
    ]
}

image:

{
    "Version": "2012-10-17",
    "Id": "Policy1445028673753",
    "Statement": [
        {
            "Sid": "Allow all read",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::image/*"
        } 
   ]
}
 

Это код формы:

 <form class="form-horizontal" name="s3Form" action=<%= s3FormAction %> method="post" enctype="multipart/form-data">

    <fieldset>

        <input type="hidden" name="key" value="<%= imageFileName %>">
        <input type="hidden" name="AWSAccessKeyId" value="<%= S3AccessKeyId %>"> 
        <input type="hidden" name="acl" value="private"> 
        <input type="hidden" name="success_action_redirect" value="<%= s3SuccessAction %>">
        <input type="hidden" name="policy" value="<%= encPolicy %>" >
        <input type="hidden" name="signature" value="<%= signature %>" >
        <input type="hidden" name="Content-Type" value="image/jpeg">
 

Это код, который я использую для кодирования политики S3:

 public static String encodeS3Policy(String s3SuccessAction, String bucket) throws Exception
    {
        String policy =
            "{"expiration": "2040-01-01T00:00:00Z","  
              ""conditions": ["  
                (bucket==null || bucket.length()==0 ? "" : "{"bucket": ""   bucket   ""}," )  
                "["starts-with", "$key", ""],"  
                "{"acl": "private"},"  
                "{"success_action_redirect": ""   s3SuccessAction   ""},"  
                "["starts-with", "$Content-Type", ""],"  
                "["content-length-range", 0, 10485760]"                                   // 10 MB max file up load
                "]"  
            "}";

        policy.replaceAll("n","").replaceAll("r","");


        // Encode the policy
        String encPolicy = Base64.getEncoder().encodeToString(policy.getBytes("UTF-8"));

        return encPolicy;
    }
 

Комментарии:

1. Не могли бы вы показать свой код или команды, которые вы использовали?

2. Я добавил политики и часть кода формы. Я использую JSP, и post to AWS отправляет им эти поля, а затем AWS отправляет обратно статус. Дело в том, что один и тот же код работает с корзиной изображений и не работает с корзиной dev-image, если в политике dev-image явно не указано разрешить запись объекта