AWS S3 Post 객체가 추가 양식 필드를 거부 함

Nov 24 2020

업로드 된 이미지의 스토리지 클래스를 AWS S3 버킷에 설정하려고합니다. 요청에 스토리지 클래스를 추가하는 것을 제외하고는 작동합니다. S3 포스트 개체 문서 상태는 "X-AMZ-저장소 클래스"하지만 추가이라는 폼 입력 필드, 또는 다른 필드가있을 수 있으며, 게시물에 대한 너무 많은 입력 필드가 있음을 나타내는 AWS 오류가 발생합니다. 개체 정책에 추가하려고했지만 정책 오류가 발생합니다 : "정책 조건 실패 : ["eq ","$ x-amz-storage-class ","ONEZONE_IA "]". JSP를 사용하고 있으며 양식의 입력 필드는 아래와 같습니다. 어떤 도움을 주시면 감사하겠습니다.

<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">
<input type="hidden" name="x-amz-storage-class" value="ONEZONE_IA">   ***** CAUSES ERROR ****

오류 :

Invalid according to Policy: Policy Condition failed: [“eq”, “$x-amz-storage-class”, “STANDARD_IA”]

<Error>
<Code>AccessDenied</Code>
<Message>
Invalid according to Policy: Extra input fields: x-amz-storage-class
</Message>
<RequestId>1104FC046523752C</RequestId>
<HostId>
m0xPpMKJqBG6kZsdQfl/RY92dHprnvtGtrijHLqVtieM51ew+Mkp0mXGbTwKM7OsoUq6ZZUVIc0=
</HostId>
</Error>

답변

glez Nov 24 2020 at 05:56

나는 지금 작동하고 있습니다. 정책에는 양식의 필드와 일치해야하는 필드가 있습니다. "x-amz-storage-class"를 양식 필드와 정책에 모두 추가해야합니다. 내 생각 엔 인코딩 된 정책은 보안상의 이유로 서명되어 보안을 유지하고 양식 필드가 변경되지 않았는지 확인하기 위해 정책 필드와 일치해야합니다. 둘 다 필요한 이유는 저 밖에 있습니다. 수정 된 코드는 다음과 같습니다.

<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">
    <input type="hidden" name="x-amz-storage-class" value="ONEZONE_IA">
    

public static String encodeS3Policy(String s3SuccessAction, String bucket) throws Exception
{
    String policy =
        "{\"expiration\": \"2040-01-01T00:00:00Z\"," +
          "\"conditions\": [" +
            "{\"bucket\": \"" + bucket + "\"}," +
            "[\"starts-with\", \"$key\", \"\"]," + "{\"acl\": \"private\"}," + "{\"success_action_redirect\": \"" + s3SuccessAction + "\"}," + "[\"starts-with\", \"$Content-Type\", \"\"]," +
            "{\"x-amz-storage-class\": \"ONEZONE_IA\"}," +
            "[\"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;
}

완전성을 위해 그리고 명확하지 않기 때문에 스토리지 클래스 값은 다음과 같습니다.

Default: STANDARD

STANDARD | REDUCED_REDUNDANCY | GLACIER | STANDARD_IA | ONEZONE_IA | INTELLIGENT_TIERING | DEEP_ARCHIVE 

다음은 AWS S3 Post Object 문서입니다.