#説明
個人開発中にS3の事前署名URL関連でハマった。
本当にクソしょーもないハマり方なので、記事にするべきか判断に迷いました。
でも塵も積もればということで。
先言っておくと、原因はバケットポリシー関連のやらかしです。
#事象説明
Node.js。
//事前署名URL取得
var params = {
Bucket: 'バケット名',
Expires: 3600,
Key: 'test.png',
ContentType: 'image/png'
};
var res = await new Promise((resolve, reject)=>{
S3.getSignedUrl('putObject', params, (err,url)=> {
if(err){
logger.level='error';
logger.error(err);
return reject(err);
}
else{
logger.info(url);
return resolve(url)
}
});
})
const response={'statusCode':'200',
'body':JSON.stringify({'sign_url':res }),
'headers': {'Content-Type':'application/json'},
};
callback(null,response);
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property
上記の公式リファレンスに沿ってPutObjectオペレーションに対して、3600秒の有効期限を持った事前署名urlを発行。
そして、3600秒以内に以下のコマンドでtest.pngのアップロードを試みるも
curl -H "Content-Type: image/png" --data-binary "@test.png" -X PUT "発行されたURL"
(^ω))))))))^<なんで~っ
#結論
パケットポリシーで明示的にPutObjectを禁止していると、事前署名Urlに対してのアクションも禁止されます。
されました。
この明示的禁止ポリシーを削除する事で無事アップロードに成功します。
デフォルトでも禁止なのですが、バケットポリシーの明示的禁止とデフォルトの禁止には違いがあるようです。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies.html
明示的な拒否は、ACL やユーザーポリシーなどの他の方法を使用して examplebucket バケット内のオブジェクトに付与したすべてのアクセス許可よりも優先されます。
へ~…ふ~ん…そうなんすか…
以上です。