AWSS3ポストオブジェクトが余分なフォームフィールドを拒否する
Nov 24 2020
アップロードされたイメージのストレージクラスをAWSS3バケットに設定しようとしています。リクエストにストレージクラスを追加する以外は機能しています。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
これがAWSS3 PostObjectのドキュメントです