#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 явно не указано разрешить запись объекта