Goの同じことについての私の質問に関連しています。
次のバケットポリシーでのみパブリック読み取りが行われるAWSS3のバケットに事前署名されたPOSTファイルをアップロードしたいと思います。
{
"Version": "2012-10-17",
"Id": "Policy1441191234567",
"Statement": [
{
"Sid": "Stmt1441195123456",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mytestbucket/*"
}
]
}
ここで説明するように、事前に署名されたURLが作成され、それを持っている人は誰でもHTTPPOSTを使用してアップロードできます。
ここで説明する事前署名済みのPUTを正常に動作させることができました。~/aws/credentials
つまり、バケットに完全にアクセスできる適切な資格情報があります。
でAWS SDKルビー、私がありますことを発見したPresignedPost私は以下のことを試してみましたので、バケット用:
require 'aws-sdk-resources'
require 'net/http'
require 'time'
require 'uri'
s3 = Aws::S3::Resource.new(region:'eu-central-1')
bucket = s3.bucket('mytestbucket')
post = bucket.presigned_post({
key: 'larry',
acl: "public-read",
expires: Time.now() + 30,
content_length_range: 1...1024,
success_action_redirect: "https://example.com/callback",
})
puts post.url
puts post.fields
uri = URI(post.url)
fields = post.fields.merge(file: "ken sent me")
res = Net::HTTP.post_form(uri, fields)
puts res.body
残念ながら、これを実行するとエラーが発生します。
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidArgument</Code><Message>Conflicting query string parameters: acl, policy</Message><ArgumentName>ResourceType</ArgumentName><ArgumentValue>acl</ArgumentValue><RequestId>6132C47A14212345</RequestId><HostId>abcdKciFUKxvC4717Zm9w2ZB5lXJna+NSkxXzkb9123tjHZHb60JJa123KctSu862gY/j+a5+3w=</HostId></Error>
acl
フィールドを削除しようとしましたが、別のエラーが発生します。
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>MethodNotAllowed</Code><Message>The specified method is not allowed against this resource.</Message><Method>POST</Method><ResourceType>BUCKETPOLICY</ResourceType><RequestId>9B3D7AAAE45BB47F</RequestId><HostId>yk823Z12345uucETlpQaG1234T0lxqjGAX4Uka123LQ6Pf22NVf45xxMmZAlFoQHaP+C4N60oLI=</HostId></Error>
URIは次のとおりです。 https://mytestbucket.s3.eu-central-1.amazonaws.com
問題は何ですか?どうすればそれを機能させることができますか?
助けてくれてありがとう!
更新
エラーの1つが言うように、問題はおそらく競合するACLとバケットポリシーです。すべての人に読んでもらいたいのですが、アップロードは事前に署名されたURLでのみ可能です(URLを作成したのは所有者であると想定しています)。これが私がそれを設定したと思った方法です。
だから私はGoの質問を答えで更新しました、そして同じことがRubyにも当てはまります。私が抱えていた問題は、マルチパートフォームデータを正しく生成することでした。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加