Загрузите изображение в частную корзину AWS S3, используя предварительный URL - PullRequest
0 голосов
/ 19 июня 2020

У меня возникла проблема при загрузке изображения в частную корзину 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);
}
}
  1. Я знаю, что, создав политику корзины в моем ведре 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
        }

    ]
}

В приведенной выше политике

  1. Для первого случая, каким должен быть атрибут Принципал , если я хочу только putObject в ведре из указанного c AWS Экземпляр EC2 или Есть ли другой способ, которым я могу вставить объекты в ведро s3 с использованием предварительно подписанного URL.

  2. Для второго случая, если у меня есть Principal as *, тогда корзина становится publi c, что нежелательно, поэтому я подумал о написании предварительно подписанного URL-адреса, подобного приведенному выше фрагменту javascript, например s3.getSignedUrl('getObject', params). Но у меня есть много изображений, которые нужно показать в интерфейсе, что определенно увеличит нагрузку на мой сервер, поскольку каждое изображение будет делать предварительный URL-запрос на сервер, поэтому я также хочу избежать этого подхода. Хотелось бы узнать, есть ли другой подход к этому?

...