آپلود اصلی فایل امن به AWS S3 در Node.js با Express و Multer

آپلود فایل ها به صورت ایمن بخش کلیدی حفاظت از داده های کاربر در هر برنامه وب است. در این وبلاگ، شما را با ایجاد یک سیستم آپلود فایل امن با استفاده از Node.js، Express، Multer و AWS S3 راهنمایی می کنیم. برای اطمینان از ایمن بودن آپلودهای شما و ایمن ماندن برنامه شما، روی بهترین شیوه ها تمرکز خواهیم کرد. این راهنما برای مبتدیانی که میخواهند یاد بگیرند که چگونه با آپلود فایلها مدیریت کنند و امنیت را در اولویت قرار دهند، عالی است.
حالا بیایید شیرجه بزنیم
پیش نیازها
- دانش اولیه Node.js/Javascript
- دانش اولیه AWS و CloudFormation
- حساب AWS. یکی را در اینجا به صورت رایگان ایجاد کنید
- صبر
مرحله 1: تنظیم محیط
1. Node.js و npm را نصب کنید:
- Node.js را از nodejs.org دانلود و نصب کنید.
- تأیید نصب:
$ node -v
#v20.18.1
$ npm -v
#10.8.2
2. AWS CLI را نصب کنید:
- AWS CLI را از aws.amazon.com/cli دانلود و نصب کنید.
- AWS CLI را با اعتبار خود پیکربندی کنید:
$ aws configure
#AWS Access Key ID [****************H53C]:
#AWS Secret Access Key [****************1CcY]:
#Default region name [us-east-1]:
#Default output format [json]:
مرحله 2: برنامه Node.js را ایجاد کنید
1. یک پروژه Node.js جدید را راه اندازی کنید:
$ mkdir node-file-upload-api
$ cd node-file-upload-api
$ npm init -y
2. بسته های لازم را نصب کنید:
$ npm install express aws-sdk multer dotenv uuid
3. فایل برنامه را ایجاد کنید (app.js
):
- ایجاد یک
app.js
فایل - کد جاوا اسکریپت زیر را اضافه کنید
- در اینجا ما در حال ایجاد یک تابع برای ارسال یک درخواست POST برای آپلود فایل ما و ایجاد یک URL presigned برای فایل آپلود شده هستیم.
// app.js
// Import the required packages
const express = require('express');
const multer = require('multer');
const AWS = require('aws-sdk');
const { v4: uuidv4 } = require('uuid');
// Load environment variables from a .env file
require('dotenv').config();
// Create an Express application
const app = express();
// Create an S3 instance with the specified region
const s3 = new AWS.S3({ region: process.env.AWS_REGION });
// Configure Multer to save uploaded files to the 'uploads/' directory
const upload = multer({ dest: 'uploads/' });
app.post('/upload', upload.single('file'), (req, res) => {
// Get the uploaded file from the request
const file = req.file;
const fileKey = `${uuidv4()}-${file.originalname}`;
const s3Params = {
Bucket: process.env.S3_BUCKET,
Key: fileKey,
Body: require('fs').createReadStream(file.path), // Create a readable stream from the uploaded file
ContentType: file.mimetype
};
s3.upload(s3Params, (err, data) => {
if (err) {
return res.status(500).send(err);
}
// Generate presigned URL
const presignedUrlParams = {
Bucket: process.env.S3_BUCKET,
Key: fileKey,
Expires: 60 * 60 // URL expiration time in seconds (e.g., 1 hour)
};
s3.getSignedUrl('getObject', presignedUrlParams, (err, presignedUrl) => {
if (err) {
return res.status(500).send(err);
}
res.status(200).send({
message: 'File uploaded successfully',
url: data.Location,
presignedUrl: presignedUrl
});
});
});
});
// Start the server on port 3000
app.listen(3000, () => {
console.log('Server running on port 3000');
});
4. ایجاد یک .env
فایل برای متغیرهای محیطی:
- ایجاد یک
.env
فایل - اطلاعات زیر را اضافه کنید
AWS_REGION=us-east-1
S3_BUCKET=my-node-app-bucket-382c-c803-a96a-49f1
- مطمئن شوید که نام سطل شما منحصر به فرد است. میتوانید از Online UUID Generator برای ایجاد یک UUID منحصربهفرد برای اضافه کردن به نام استفاده کنید.
مرحله 3: قالب CloudFormation را ایجاد کنید
1. فایلی به نام ایجاد کنید s3-file-upload.yml
و مطالب زیر را اضافه کنید
- ایجاد یک
s3-file-upload.yml
فایل - کد زیر را اضافه کنید
AWSTemplateFormatVersion: "2010-09-09"
Resources:
S3Bucket:
Type: "AWS::S3::Bucket" # Defines an S3 bucket resource
Properties:
BucketName: !Sub "my-node-app-bucket-382c-c803-a96a-49f1" # Sets the bucket name
PublicAccessBlockConfiguration: # Configures public access settings for the bucket
BlockPublicAcls: true # Blocks public ACLs
BlockPublicPolicy: false # Allows custom bucket policies
IgnorePublicAcls: true # Ignores public ACLs
RestrictPublicBuckets: true # Restricts public bucket access
VersioningConfiguration:
Status: Enabled # Enables versioning for the bucket
S3BucketPolicy:
Type: "AWS::S3::BucketPolicy" # Defines a bucket policy resource
Properties:
Bucket: !Ref S3Bucket # References the S3 bucket created above
PolicyDocument:
Version: "2012-10-17" # Specifies the version of the policy language
Statement:
- Effect: Allow # Allows the specified actions
Principal: "*" # Applies to all principals (users)
Action: "s3:GetObject" # Allows the GetObject action
Resource: !Sub "${S3Bucket.Arn}/*" # Applies to all objects in the bucket
Condition:
Bool:
aws:SecureTransport: "true" # Requires requests to use HTTPS
- Effect: Allow # Allows the specified actions
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:role/MyAppRole" # Allows the IAM role to access the bucket
Action: "s3:PutObject" # Allows the PutObject action
Resource: !Sub "${S3Bucket.Arn}/*" # Applies to all objects in the bucket
MyAppIAMRole:
Type: AWS::IAM::Role # Defines an IAM Role resource
Properties:
RoleName: MyAppRole # Assigns a name to the IAM role
AssumeRolePolicyDocument:
Version: "2012-10-17" # Specifies the version of the policy language
Statement:
- Effect: Allow # Allows the following action
Principal:
Service: "ec2.amazonaws.com" # Specifies that the EC2 service can assume this role
Action: "sts:AssumeRole" # Allows EC2 instances to assume the role
Policies:
- PolicyName: S3AccessPolicy # Names the inline policy for the role
PolicyDocument:
Version: "2012-10-17" # Specifies the version of the policy language
Statement:
- Effect: Allow # Allows the following actions
Action: "s3:PutObject" # Grants permission to upload objects to S3
Resource: !Sub "${S3Bucket.Arn}/*" # Applies to all objects in the specified S3 bucket
- در قالب CloudFormation فوق، ما در حال ایجاد یک سطل S3 با نامی هستیم که شامل شناسه حساب AWS می شود تا آن را منحصر به فرد کند. تمام دسترسی های عمومی را مسدود می کند و نسخه سازی را فعال می کند. این الگو همچنین خطمشی اضافه میکند که به هر کسی اجازه میدهد اشیاء را از سطل بارگیری کند، اما فقط از طریق HTTPS برای انتقال امن دادهها.
مرحله 4: استقرار منابع AWS با CloudFormation
1. استقرار پشته:
- ما اکنون پشته AWS CloudFormation خود را با استفاده از فایل قالبی که در بالا ایجاد کردیم، مستقر خواهیم کرد.
$ aws cloudformation deploy --template-file s3-file-upload.yml --stack-name S3FileUploadStack --capabilities CAPABILITY_NAMED_IAM
#Waiting for changeset to be created..
#Waiting for stack create/update to complete
#Successfully created/updated stack - S3FileUploadStack
- در اینجا به تفکیک هر بخش می پردازیم:
aws cloudformation deploy
: این دستور AWS CLI برای استقرار یک پشته CloudFormation است.--template-file s3-file-upload.yml
: مسیر فایل قالب CloudFormation (s3-file-upload.yml) را مشخص می کند که منابع و تنظیمات را تعریف می کند.--stack-name S3FileUploadStack
: نام پشته CloudFormation را روی S3FileUploadStack قرار می دهد.--capabilities CAPABILITY_NAMED_IAM
: تصدیق میکند که پشته به منابع IAM با نامهای سفارشی نیاز دارد، که به استقرار اجازه میدهد نقشها و خطمشیهای IAM را ایجاد یا تغییر دهد.
2. ایجاد سطل S3 را تأیید کنید:
- پس از استقرار، وارد کنسول AWS خود شوید و تأیید کنید که سطل S3 از پشته CloudFormation تهیه شده است.
مرحله 5: برنامه Node.js خود را اجرا کنید
- تأیید کنید که متغیرهای محیطی را در فایل .env با نام سطل S3 درست تنظیم کرده اید.
- برنامه را شروع کنید:
$ node app.js
#Server running on port 3000
مرحله 6: یک فایل آپلود کنید
1. از Postman یا cURL برای ارسال درخواست POST به آن استفاده کنید http://localhost:3000/upload
با یک فایل
با استفاده از پستچی
- یک درخواست POST جدید ایجاد کنید.
- URL را روی http://localhost:3000/upload تنظیم کنید.
- در برگه “Body”، “form-data” را انتخاب کنید، یک فایل کلیدی اضافه کنید و یک فایل را برای آپلود انتخاب کنید.
با استفاده از Curl
$ curl -F "file=@/tmp/files/test-upload.png" http://localhost:3000/upload
2. آدرس فایل را در پاسخ دریافت کنید که نشان دهنده آپلود موفقیت آمیز است. پاسخ در قالب زیر خواهد بود.
{
"message": "File uploaded successfully",
"url": "https://my-node-app-bucket-382c-c803-a96a-49f1.s3.amazonaws.com/87587526-e70b-451d-a405-ceab366016a8-test-upload.png",
"presignedUrl": "https://my-node-app-bucket-382c-c803-a96a-49f1.s3.amazonaws.com/87587526-e70b-451d-a405-ceab366016a8-test-upload.png?AWSAccessKeyId=AKIATA6LX4GWXV6MH53C&Expires=1736370100&Signature=66dKUQRW%2F47La3MPPngITEhFE%2FA%3D"
}
نتیجه گیری
در خاتمه، تسلط بر آپلودهای امن فایل در AWS S3 در Node.js با Express و Multer فراتر از عملکردهای اولیه است – نیاز به تمرکز قوی روی امنیت دارد. با ادغام Multer برای مدیریت کارآمد فایل، استفاده از ویژگیهای امنیتی قوی AWS S3 مانند خطمشیهای سطل و نشانیهای اینترنتی تعیینشده، و اجرای اتصالات HTTPS، اطمینان حاصل میکنیم که فایلهای آپلود شده بهطور ایمن مدیریت و قابل دسترسی هستند. این رویکرد نه تنها از دادههای حساس محافظت میکند، بلکه به جلوگیری از دسترسی غیرمجاز و آسیبپذیریهای احتمالی کمک میکند و آن را به یک راهحل مطمئن و امن برای برنامههای کاربردی وب مدرن تبدیل میکند.