У меня возникла проблема при загрузке изображения в частную корзину s3 с использованием nodejs aws sdk. Это то, что я делал до сих пор.
import aws from 'aws-sdk';
aws.config.update({
signatureVersion: 'v4',
region: 'ap-southeast-1',
accessKeyId: process.env.AWS_S3_ACCESS_KEY,
secretAccessKey: process.env.AWS_S3_SECRET_KEY,
});
const s3 = new aws.S3();
export const generate_pre_ssigned_url_write = async (req, res, next) => {
try {
const { Key, ContentType } = req.query;
const { userId } = req;
const params = {
Bucket: 'test-bucket',
Key: `${userId}/${Key}`,
Expires:200,
};
const preSignedUrl = await s3.getSignedUrl('putObject', params);
res.send({preSignedUrl});
}
catch(err){
console.log(err);next(err);
}
}
- Я знаю, что, создав политику корзины в моем ведре s3, можно загрузить изображение. в настоящее время у меня есть следующая политика корзины:
{
"Id": "Policy1592575147579",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1592575144175",
"Action": [
"s3:GetObject",// Thinking to
"s3:PutObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::test-bucket/*",
"Principal": "*" // here what must this value for aws ec2 instance which is present //in different region from s3 buckets region.
},
{
"Sid": "Stmt1592575144176",
"Action": [
"s3:GetObject",// Thinking
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::test-bucket/*",
"Principal": "*" // having a * here makes the bucket public which I don't want
}
]
}
В приведенной выше политике
Для первого случая, каким должен быть атрибут Принципал , если я хочу только putObject в ведре из указанного c AWS Экземпляр EC2 или Есть ли другой способ, которым я могу вставить объекты в ведро s3 с использованием предварительно подписанного URL.
Для второго случая, если у меня есть Principal as *, тогда корзина становится publi c, что нежелательно, поэтому я подумал о написании предварительно подписанного URL-адреса, подобного приведенному выше фрагменту javascript, например s3.getSignedUrl('getObject', params)
. Но у меня есть много изображений, которые нужно показать в интерфейсе, что определенно увеличит нагрузку на мой сервер, поскольку каждое изображение будет делать предварительный URL-запрос на сервер, поэтому я также хочу избежать этого подхода. Хотелось бы узнать, есть ли другой подход к этому?