Chuyển đến nội dung chính

AWS S3 cp: Hướng dẫn đầy đủ về truyền tệp AWS S3

Tìm hiểu cách sao chép tệp tới và từ S3 bằng lệnh aws s3 cp. Khám phá mọi thứ từ truyền cơ bản và sao chép đệ quy đến script tự động hóa và khắc phục lỗi thường gặp – tất cả đều có ví dụ thực tế.
· 15 phút đọc

Khám phá cùng AI

Tự sao chép tệp lên hệ thống lưu trữ AWS có thể tốn công, dễ sai sót và kém hiệu quả – đặc biệt khi xử lý lượng dữ liệu lớn. Bạn chắc chắn không muốn điều đó.

AWS Command Line Interface (CLI) cung cấp một công cụ tiện lợi gọi là aws s3 cp giúp đơn giản hóa quy trình. Lệnh này cho phép bạn sao chép tệp đến và đi từ các bucket Amazon S3 bằng những câu lệnh đơn giản, có thể đưa vào script và hoạt động trên mọi hệ điều hành. Sử dụng AWS CLI không chỉ tiết kiệm thời gian mà còn cho phép tự động hóa các tác vụ truyền tệp thường xuyên.

Lệnh aws s3 cp cung cấp nhiều tùy chọn để xử lý các tình huống truyền tệp phức tạp. Bạn có thể sao chép tệp đơn lẻ, truyền đệ quy toàn bộ thư mục, lọc tệp theo mẫu, thậm chí chỉ định các lớp lưu trữ khác nhau để tối ưu chi phí.

Trong hướng dẫn này, tôi sẽ giới thiệu cho bạn mọi thứ cần biết để sử dụng aws s3 cp hiệu quả, từ lệnh cơ bản đến kỹ thuật nâng cao và chiến lược tự động hóa.

> Mới bắt đầu với AWS và còn mơ hồ về lưu trữ đám mây và S3? Bài viết hướng dẫn chi tiết về S3 và EFS là điểm khởi đầu lý tưởng. Nếu bạn chỉ quan tâm đến S3, hãy xem hướng dẫn S3 chuyên sâu của chúng tôi.

AWS S3 cp là gì?

Lệnh aws s3 cp là một tiện ích trong AWS Command Line Interface cho phép bạn sao chép tệp giữa hệ thống cục bộ và bộ nhớ Amazon S3. 

Về cơ bản, nó mang đến trải nghiệm dòng lệnh quen thuộc giống lệnh cp tiêu chuẩn của Linux, nhưng được điều chỉnh để tương tác với các bucket S3.

Cốt lõi của aws s3 cp là kết nối máy cục bộ của bạn với hạ tầng lưu trữ đám mây của AWS. Khi bạn thực thi một lệnh aws s3 cp, AWS CLI sẽ xử lý xác thực và chia nhỏ tệp cho các lần truyền lớn, đồng thời đảm bảo tính toàn vẹn dữ liệu trong quá trình sao chép. Công cụ này hỗ trợ sao chép tệp đơn lẻ, nhiều tệp bằng ký tự đại diện (wildcard), và toàn bộ cấu trúc thư mục bằng thao tác đệ quy.

aws s3 cp có thể làm được rất nhiều việc, dưới đây là vài điểm tiêu biểu:

  • Truyền hai chiều (tải lên S3 hoặc tải xuống từ S3).
  • Sao chép đệ quy toàn bộ cấu trúc thư mục.
  • Hỗ trợ nhiều lớp lưu trữ S3 (Standard, Intelligent-Tiering, Glacier, v.v.).
  • Lọc tệp bằng mẫu include/exclude.
  • Giữ nguyên metadata của tệp trong quá trình truyền.
  • Tích hợp với AWS Identity and Access Management (IAM) để bảo mật.

Điểm mạnh của aws s3 cp nằm ở tính linh hoạt và khả năng tích hợp với hệ sinh thái AWS. Bạn có thể chỉ định các tham số khác nhau để kiểm soát lớp lưu trữ, mã hóa, metadata, kiểm soát truy cập, và hơn thế nữa. Nhờ đó, nó phù hợp từ các lần truyền tệp đơn lẻ đến những giải pháp sao lưu tự động phức tạp.

Lệnh này khác với việc dùng AWS Management Console, vốn yêu cầu điều hướng và nhấp chuột thủ công. Lệnh aws s3 cp có thể chạy trực tiếp từ terminal của bạn hoặc đưa vào script và quy trình tự động. Khả năng truy cập S3 theo lập trình là thiết yếu với nhiều chuyên gia công nghệ, đặc biệt là kỹ sư DevOps và nhà khoa học dữ liệu.

Tóm lại, aws s3 cp cung cấp một giải pháp tin cậy, có thể script hóa, xử lý được truyền tải quy mô lớn mà vẫn đảm bảo hiệu năng. Nó có thể tiếp tục các phiên tải lên và tải xuống bị gián đoạn, rất hữu ích khi mạng không ổn định hoặc khi truyền tệp cực lớn.

Tiếp theo, tôi sẽ hướng dẫn bạn phần nhàm chán – thiết lập AWS CLI trên hệ thống của bạn.

Thiết lập AWS CLI và AWS S3

Trước khi đi vào lệnh aws s3 cp, bạn cần cài đặt và cấu hình đúng AWS CLI trên hệ thống. Đừng lo nếu bạn chưa từng làm việc với AWS – quá trình thiết lập đơn giản và thường mất chưa đến 10 phút.

Tôi sẽ chia thành ba giai đoạn đơn giản: cài công cụ AWS CLI, cấu hình thông tin xác thực, và tạo bucket S3 đầu tiên để lưu trữ.

Cài đặt AWS CLI

Quy trình cài đặt có đôi chút khác nhau tùy hệ điều hành bạn đang dùng.

Đối với hệ thống Windows:

Đối với hệ thống Linux:

Chạy ba lệnh sau trong Terminal:

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

Đối với hệ thống macOS:

Giả sử bạn đã cài Homebrew, chạy dòng lệnh sau trong Terminal:

brew install awscli

Nếu bạn chưa có Homebrew, hãy dùng hai lệnh này:

curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

Để xác nhận cài đặt thành công, chạy aws --version trong terminal. Bạn sẽ thấy kết quả tương tự như sau:

Hình 1 - Phiên bản AWS CLI

Hình 1 - Phiên bản AWS CLI

Cấu hình AWS CLI

Khi đã cài xong CLI, đến lúc thiết lập thông tin xác thực AWS của bạn để đăng nhập.

Trước tiên, truy cập tài khoản AWS và vào bảng điều khiển dịch vụ IAM. Tạo người dùng mới có quyền truy cập theo lập trình và gán chính sách quyền S3 phù hợp:

Hình 2 - Người dùng AWS IAM

Hình 2 - Người dùng AWS IAM

Tiếp theo, vào thẻ "Security credentials" và tạo cặp khóa truy cập mới. Hãy lưu cả Access key ID và Secret access key ở nơi an toàn – Amazon sẽ không hiển thị lại secret key sau màn hình này:

Hình 3 - Thông tin xác thực người dùng AWS IAM

Hình 3 - Thông tin xác thực người dùng AWS IAM

Giờ hãy mở terminal và chạy lệnh aws configure. Bạn sẽ được hỏi bốn thông tin: Access key ID, Secret access key, vùng mặc định (tôi dùng eu-central-1) và định dạng xuất ưa thích (thường là json):

Hình 4 - Cấu hình AWS CLI

Hình 4 - Cấu hình AWS CLI

Để chắc chắn mọi thứ kết nối đúng, xác minh danh tính của bạn bằng lệnh sau:

aws sts get-caller-identity

Nếu cấu hình chính xác, bạn sẽ thấy thông tin tài khoản của mình:

Hình 5 - Lệnh kiểm tra kết nối AWS CLI

Hình 5 - Lệnh kiểm tra kết nối AWS CLI

Tạo một bucket S3

Cuối cùng, bạn cần tạo một bucket S3 để lưu các tệp sẽ sao chép.

Vào phần dịch vụ S3 trong AWS Console và nhấp "Create bucket". Lưu ý tên bucket phải là duy nhất trên toàn AWS. Chọn một tên đủ khác biệt, tạm thời giữ nguyên các thiết lập mặc định và nhấp "Create":

Hình 6 - Tạo bucket AWS

Hình 6 - Tạo bucket AWS

Sau khi tạo, bucket mới sẽ xuất hiện trong console. Bạn cũng có thể xác nhận qua dòng lệnh:

aws s3 ls

Hình 7 - Tất cả bucket S3 hiện có

Hình 7 - Tất cả bucket S3 hiện có

Mặc định, mọi bucket S3 đều ở trạng thái riêng tư, nên hãy lưu ý. Nếu bạn muốn dùng bucket này cho tệp công khai, bạn cần điều chỉnh chính sách bucket tương ứng.

Giờ bạn đã sẵn sàng dùng lệnh aws s3 cp để truyền tệp. Tiếp theo, hãy bắt đầu với những điều cơ bản.

Cú pháp cơ bản của lệnh AWS S3 cp

Khi mọi thứ đã được cấu hình, hãy đi vào cách sử dụng cơ bản của lệnh aws s3 cp. Như thường thấy với AWS, vẻ đẹp nằm ở sự đơn giản, dù lệnh có thể xử lý nhiều kịch bản truyền tệp khác nhau.

Ở dạng cơ bản nhất, lệnh aws s3 cp có cú pháp như sau:

aws s3 cp <source> <destination> [options]

Trong đó <source> và <destination> có thể là đường dẫn cục bộ hoặc S3 URI (bắt đầu với s3://). Hãy xem ba trường hợp sử dụng phổ biến nhất.

Sao chép tệp từ cục bộ lên S3

Để sao chép tệp từ hệ thống cục bộ lên một bucket S3, nguồn là đường dẫn cục bộ và đích là S3 URI:

aws s3 cp /Users/dradecic/Desktop/test_file.txt s3://testbucket-aws-cp-dradecic/test_file.txt

Lệnh này tải lên tệp test_file.txt từ thư mục đã cho vào bucket S3 chỉ định. Nếu thao tác thành công, bạn sẽ thấy kết quả trên console tương tự sau:

Hình 8 - Kết quả console sau khi sao chép tệp cục bộ

Hình 8 - Kết quả console sau khi sao chép tệp cục bộ

Và trên AWS Management Console, bạn sẽ thấy tệp đã được tải lên:

Hình 9 - Nội dung bucket S3

Hình 9 - Nội dung bucket S3

Tương tự, nếu muốn sao chép một thư mục cục bộ lên bucket S3 và đặt nó, chẳng hạn, vào một thư mục lồng nhau khác, hãy chạy lệnh như sau:

aws s3 cp /Users/dradecic/Desktop/test_folder s3://testbucket-aws-cp-dradecic/my-desired-folder/test_folder/ --recursive

Hình 10 - Nội dung bucket S3 sau khi tải lên thư mục

Hình 10 - Nội dung bucket S3 sau khi tải lên thư mục

Cờ --recursive sẽ đảm bảo sao chép toàn bộ tệp và thư mục con bên trong.

Hãy nhớ – S3 thực tế không có thư mục – cấu trúc đường dẫn chỉ là một phần của khóa đối tượng, nhưng về mặt khái niệm nó hoạt động như thư mục.

Sao chép tệp từ S3 về cục bộ

Để sao chép tệp từ S3 về hệ thống cục bộ, chỉ cần đảo ngược thứ tự – nguồn là S3 URI và đích là đường dẫn cục bộ của bạn:

aws s3 cp s3://testbucket-aws-cp-dradecic/test_file.txt /Users/dradecic/Documents/s3-data/downloaded_test_file.txt

Lệnh này tải xuống test_file.txt từ bucket S3 của bạn và lưu thành downloaded_test_file.txt trong thư mục chỉ định. Bạn sẽ thấy ngay trên hệ thống cục bộ:

Hình 11 - Tải một tệp đơn từ S3

Hình 11 - Tải một tệp đơn từ S3

Nếu bạn bỏ qua tên tệp đích, lệnh sẽ dùng tên gốc:

aws s3 cp s3://testbucket-aws-cp-dradecic/test_file.txt .

Hình 12 - Nội dung tệp đã tải xuống

Hình 12 - Nội dung tệp đã tải xuống

Dấu chấm (.) đại diện cho thư mục hiện tại, nên lệnh này sẽ tải test_file.txt về vị trí bạn đang đứng.

Và cuối cùng, để tải xuống toàn bộ thư mục, bạn có thể dùng lệnh như sau:

aws s3 cp s3://testbucket-aws-cp-dradecic/my-desired-folder/test_folder /Users/dradecic/Documents/test_folder --recursive

Hình 13 - Nội dung thư mục đã tải xuống

Hình 13 - Nội dung thư mục đã tải xuống

Lưu ý cờ --recursive là bắt buộc khi làm việc với nhiều tệp – nếu không có, lệnh sẽ thất bại nếu nguồn là một thư mục.

Với những lệnh cơ bản này, bạn đã có thể xử lý hầu hết các tác vụ truyền tệp cần thiết. Nhưng ở phần tiếp theo, bạn sẽ học các tùy chọn nâng cao để kiểm soát quá trình sao chép tốt hơn.

Các tùy chọn và tính năng nâng cao của AWS S3 cp

AWS cung cấp một số tùy chọn nâng cao cho phép bạn tối đa hóa thao tác sao chép tệp. Trong phần này, tôi sẽ giới thiệu các cờ và tham số hữu ích nhất giúp công việc hàng ngày của bạn hiệu quả hơn.

Sử dụng các cờ --exclude và --include

Đôi khi bạn chỉ muốn sao chép những tệp khớp với các mẫu nhất định. Các cờ --exclude và --include cho phép bạn lọc tệp theo mẫu, giúp kiểm soát chính xác nội dung được sao chép.

Để tạo bối cảnh, đây là cấu trúc thư mục tôi đang dùng:

Hình 14 - Cấu trúc thư mục

Hình 14 - Cấu trúc thư mục

Giờ, giả sử bạn muốn sao chép tất cả tệp trong thư mục trừ các tệp .log:

aws s3 cp /Users/dradecic/Desktop/advanced_folder s3://testbucket-aws-cp-dradecic/advanced_folder/ --recursive --exclude "*.log"

Lệnh này sẽ sao chép tất cả tệp từ thư mục advanced_folder lên S3, ngoại trừ các tệp có phần mở rộng .log:

Hình 15 - Kết quả sao chép thư mục

Hình 15 - Kết quả sao chép thư mục

Bạn cũng có thể kết hợp nhiều mẫu. Giả sử bạn chỉ muốn sao chép các tệp HTML và CSS từ thư mục dự án:

aws s3 cp /Users/dradecic/Desktop/advanced_folder s3://testbucket-aws-cp-dradecic/advanced_folder/ --recursive --exclude "*" --include "*.html" --include "*.css"

Lệnh này trước tiên loại trừ mọi thứ (--exclude "*"), sau đó chỉ bao gồm các tệp có phần mở rộng .html và .css. Kết quả như sau:

Hình 16 - Kết quả sao chép thư mục (2)

Hình 16 - Kết quả sao chép thư mục (2)

Lưu ý thứ tự các cờ là quan trọng – AWS CLI xử lý các cờ theo tuần tự, nên nếu bạn đặt --include trước --exclude, bạn sẽ nhận kết quả khác:

aws s3 cp /Users/dradecic/Desktop/advanced_folder s3://testbucket-aws-cp-dradecic/advanced_folder/ --recursive --include "*.html" --include "*.css" --exclude "*"

Lần này, không có gì được sao chép lên bucket:

Hình 17 - Kết quả sao chép thư mục (3)

Hình 17 - Kết quả sao chép thư mục (3)

Chỉ định lớp lưu trữ S3

Amazon S3 cung cấp nhiều lớp lưu trữ, mỗi lớp có chi phí và đặc điểm truy xuất khác nhau. Theo mặc định, aws s3 cp tải tệp lên lớp Standard, nhưng bạn có thể chỉ định lớp khác bằng cờ --storage-class:

aws s3 cp /Users/dradecic/Desktop/large-archive.zip s3://testbucket-aws-cp-dradecic/archives/ --storage-class GLACIER

Lệnh này tải lên large-archive.zip vào lớp Glacier, lớp này rẻ hơn đáng kể nhưng chi phí và thời gian truy xuất cao hơn:

Hình 18 - Sao chép tệp lên S3 với các lớp lưu trữ khác nhau

Hình 18 - Sao chép tệp lên S3 với các lớp lưu trữ khác nhau

Các lớp lưu trữ sẵn có gồm:

  • STANDARD (mặc định): Lưu trữ mục đích chung với độ bền và tính sẵn sàng cao.
  • REDUCED_REDUNDANCY (không còn khuyến nghị): Độ bền thấp hơn, tiết kiệm chi phí, nay đã ngừng khuyến nghị.
  • STANDARD_IA (Infrequent Access): Chi phí thấp hơn cho dữ liệu truy cập không thường xuyên.
  • ONEZONE_IA (Single Zone Infrequent Access): Chi phí thấp, truy cập không thường xuyên trong một Vùng Sẵn sàng AWS.
  • INTELLIGENT_TIERING: Tự động chuyển dữ liệu giữa các tầng lưu trữ dựa trên mẫu truy cập.
  • GLACIER: Lưu trữ lưu trữ dài hạn chi phí thấp, thời gian truy xuất từ vài phút đến vài giờ.
  • DEEP_ARCHIVE: Lưu trữ rẻ nhất, truy xuất trong vài giờ, lý tưởng cho sao lưu dài hạn.

Nếu bạn sao lưu các tệp không cần truy cập ngay, dùng GLACIER hoặc DEEP_ARCHIVE có thể giúp tiết kiệm đáng kể chi phí lưu trữ.

Đồng bộ tệp với cờ --exact-timestamps

Khi bạn cập nhật các tệp trên S3 đã tồn tại, có thể bạn chỉ muốn sao chép các tệp đã thay đổi. Cờ --exact-timestamps giúp so sánh dấu thời gian giữa nguồn và đích.

Ví dụ như sau:

aws s3 cp /Users/dradecic/Desktop/advanced_folder s3://testbucket-aws-cp-dradecic/advanced_folder/ --recursive --exact-timestamps

Với cờ này, lệnh chỉ sao chép tệp nếu dấu thời gian khác với tệp đã có trên S3. Điều này giúp giảm thời gian truyền và băng thông khi bạn thường xuyên cập nhật bộ tệp lớn.

Vì sao điều này hữu ích? Hãy hình dung các kịch bản triển khai, nơi bạn muốn cập nhật tệp ứng dụng mà không truyền lại các tài nguyên không thay đổi.

Dù --exact-timestamps hữu ích cho một số dạng đồng bộ, nếu bạn cần giải pháp tinh vi hơn, hãy cân nhắc dùng aws s3 sync thay cho aws s3 cp. Lệnh sync được thiết kế để giữ đồng bộ thư mục và có thêm nhiều khả năng phù hợp mục đích này. Tôi đã viết chi tiết về lệnh sync trong hướng dẫn AWS S3 Sync.

Với các tùy chọn nâng cao này, bạn có quyền kiểm soát chi tiết hơn đối với thao tác tệp trên S3. Bạn có thể nhắm đến tệp cụ thể, tối ưu chi phí lưu trữ và cập nhật tệp hiệu quả. Ở phần tiếp theo, bạn sẽ học cách tự động hóa các thao tác này bằng script và tác vụ theo lịch.

Tự động hóa truyền tệp với AWS S3 cp

Đến giờ, bạn đã biết cách sao chép thủ công tệp tới và từ S3 bằng dòng lệnh. Một trong những ưu điểm lớn nhất của aws s3 cp là bạn có thể dễ dàng tự động hóa các lần truyền này, giúp tiết kiệm vô số thời gian.

Hãy xem cách tích hợp lệnh aws s3 cp vào script và công việc theo lịch để truyền tệp mà không cần can thiệp thủ công.

Sử dụng AWS S3 cp trong script

Dưới đây là ví dụ script bash đơn giản để sao lưu một thư mục lên S3, thêm dấu thời gian vào bản sao lưu, đồng thời triển khai xử lý lỗi và ghi log ra tệp:

#!/bin/bash

# Set variables
SOURCE_DIR="/Users/dradecic/Desktop/advanced_folder"
BUCKET="s3://testbucket-aws-cp-dradecic/backups"
DATE=$(date +%Y-%m-%d-%H-%M)
BACKUP_NAME="backup-$DATE"
LOG_FILE="/Users/dradecic/logs/s3-backup-$DATE.log"

# Ensure the logs directory exists
mkdir -p "$(dirname "$LOG_FILE")"

# Create the backup and log the output
echo "Starting backup of $SOURCE_DIR to $BUCKET/$BACKUP_NAME" | tee -a $LOG_FILE
aws s3 cp $SOURCE_DIR $BUCKET/$BACKUP_NAME --recursive 2>&1 | tee -a $LOG_FILE

# Check if the backup was successful
if [ $? -eq 0 ]; then
    echo "Backup completed successfully on $DATE" | tee -a $LOG_FILE
else
    echo "Backup failed on $DATE" | tee -a $LOG_FILE
fi

Lưu lại với tên backup.sh, cấp quyền thực thi bằng chmod +x backup.sh, và bạn đã có một script sao lưu có thể tái sử dụng!

Bạn có thể chạy script bằng lệnh sau:

./backup.sh

Hình 19 - Script chạy trong terminal

Hình 19 - Script chạy trong terminal

Ngay sau đó, thư mục backups trên bucket sẽ được bổ sung dữ liệu:

Hình 20 - Bản sao lưu lưu trên bucket S3

Hình 20 - Bản sao lưu lưu trên bucket S3

Hãy nâng cấp thêm bằng cách chạy script theo lịch.

Lên lịch truyền tệp với cron job

Sau khi có script, bước tiếp theo là lên lịch để chạy tự động vào thời điểm cụ thể.

Nếu bạn dùng Linux hoặc macOS, bạn có thể dùng cron để lên lịch sao lưu. Dưới đây là cách thiết lập cron job để chạy script sao lưu mỗi ngày lúc nửa đêm:

1. Mở crontab để chỉnh sửa:

crontab -e

2. Thêm dòng sau để chạy script hằng ngày lúc nửa đêm:

0 0 * * * /path/to/your/backup.sh

Hình 21 - Cron job chạy script hằng ngày

Định dạng cron job là phút giờ ngày-trong-tháng tháng ngày-trong-tuần lệnh. Dưới đây là vài ví dụ khác:

  • Chạy mỗi giờ: 0 * * * * /path/to/your/backup.sh
  • Chạy vào 9 giờ sáng mỗi thứ Hai: 0 9 * * 1 /path/to/your/backup.sh
  • Chạy vào ngày 1 hàng tháng: 0 0 1 * * /path/to/your/backup.sh

Vậy là xong! Script backup.sh sẽ chạy theo lịch đã đặt.

Tự động hóa truyền tệp S3 là hướng đi đúng. Nó đặc biệt hữu ích cho các tình huống như:

  • Sao lưu dữ liệu quan trọng hằng ngày
  • Đồng bộ hình ảnh sản phẩm lên website
  • Chuyển tệp log sang lưu trữ dài hạn
  • Triển khai các tệp website cập nhật

Những kỹ thuật tự động hóa như thế này giúp bạn thiết lập hệ thống đáng tin cậy để xử lý truyền tệp mà không cần thao tác thủ công. Viết một lần, và sau đó bạn có thể yên tâm.

Ở phần tiếp theo, tôi sẽ trình bày một số thực tiễn tốt nhất để thao tác aws s3 cp an toàn và hiệu quả hơn.

Thực tiễn tốt nhất khi dùng AWS S3 cp

Dù lệnh aws s3 cp dễ dùng, vẫn có thể gặp trục trặc.

Nếu bạn tuân theo thực tiễn tốt nhất, bạn sẽ tránh được lỗi thường gặp, tối ưu hiệu năng và giữ an toàn cho dữ liệu. Hãy cùng điểm qua để giúp thao tác truyền tệp hiệu quả hơn.

Quản lý tệp hiệu quả

Khi làm việc với S3, tổ chức tệp một cách hợp lý sẽ giúp bạn tiết kiệm thời gian và tránh rắc rối về sau.

Đầu tiên, thiết lập quy ước đặt tên bucket và tiền tố (prefix) nhất quán. Ví dụ, bạn có thể tách dữ liệu theo môi trường, ứng dụng, hoặc ngày:

s3://company-backups/production/database/2023-03-13/
s3://company-backups/staging/uploads/2023-03/

Cách tổ chức này giúp bạn dễ dàng:

  • Tìm đúng tệp khi cần.
  • Áp dụng chính sách bucket và quyền ở cấp phù hợp.
  • Thiết lập quy tắc vòng đời để lưu trữ hoặc xóa dữ liệu cũ.

Mẹo khác: Khi truyền bộ tệp lớn, hãy cân nhắc gom các tệp nhỏ (dùng zip hoặc tar) trước khi tải lên. Cách này giảm số lượng lời gọi API tới S3, giúp tiết kiệm chi phí và tăng tốc truyền.

# Instead of copying thousands of small log files
# tar them first, then upload
tar -czf example-logs-2025-03.tar.gz /var/log/application/
aws s3 cp example-logs-2025-03.tar.gz s3://testbucket-aws-cp-dradecic/logs/2025/03/

Xử lý truyền dữ liệu lớn

Khi bạn sao chép tệp lớn hoặc rất nhiều tệp cùng lúc, có vài kỹ thuật giúp quy trình ổn định và hiệu quả hơn.

Bạn có thể dùng cờ --quiet để giảm lượng thông tin xuất khi chạy trong script:

aws s3 cp large-directory/ s3://testbucket-aws-cp-dradecic/backups/ --recursive --quiet

Cờ này ẩn thông tin tiến độ cho từng tệp, giúp log dễ quản lý hơn. Nó cũng cải thiện hiệu năng đôi chút.

Với tệp rất lớn, hãy cân nhắc dùng tải lên đa phần (multipart upload) với cờ --multipart-threshold:

aws s3 cp huge-file.iso s3://testbucket-aws-cp-dradecic/backups/ --multipart-threshold 100MB

Thiết lập trên báo cho AWS CLI tách các tệp lớn hơn 100MB thành nhiều phần để tải lên. Cách này có vài lợi ích:

  • Nếu kết nối rớt, chỉ cần thử lại phần bị ảnh hưởng.
  • Có thể tải song song các phần, tiềm năng tăng thông lượng.
  • Có thể tạm dừng và tiếp tục tải lên lớn.

Khi truyền dữ liệu giữa các vùng, hãy cân nhắc dùng S3 Transfer Acceleration để tải lên nhanh hơn:

aws s3 cp large-file.zip s3://testbucket-aws-cp-dradecic/backups/ --endpoint-url https://s3-accelerate.amazonaws.com

Thiết lập trên định tuyến truyền của bạn qua mạng biên của Amazon, có thể tăng tốc đáng kể truyền tải xuyên vùng.

Đảm bảo an toàn

Bảo mật luôn phải là ưu tiên hàng đầu khi làm việc với dữ liệu trên đám mây.

Trước hết, đảm bảo quyền IAM tuân theo nguyên tắc đặc quyền tối thiểu. Chỉ cấp đúng những quyền cần thiết cho từng tác vụ.

Dưới đây là ví dụ chính sách bạn có thể gán cho người dùng:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::testbucket-aws-cp-dradecic/backups/*"
        }
    ]
}

Chính sách này cho phép sao chép tệp đến và đi chỉ trong tiền tố "backups" của "my-bucket".

Một cách nữa để tăng bảo mật là bật mã hóa cho dữ liệu nhạy cảm. Bạn có thể chỉ định mã hóa phía máy chủ khi tải lên:

aws s3 cp confidential.docx s3://testbucket-aws-cp-dradecic/ --sse AES256

Hoặc để bảo mật hơn, dùng AWS Key Management Service (KMS):

aws s3 cp secret-data.json s3://testbucket-aws-cp-dradecic/ --sse aws:kms --sse-kms-key-id myKMSKeyId

Tuy nhiên, với các thao tác cực kỳ nhạy cảm, hãy cân nhắc dùng VPC endpoint cho S3. Cách này giữ lưu lượng trong mạng AWS và tránh hoàn toàn Internet công cộng.

Ở phần tiếp theo, bạn sẽ học cách khắc phục một số vấn đề thường gặp khi làm việc với lệnh này.

Khắc phục lỗi AWS S3 cp

Điều chắc chắn – đôi lúc bạn sẽ gặp sự cố khi làm việc với aws s3 cp. Nhưng bằng cách hiểu các lỗi phổ biến và cách xử lý, bạn sẽ tiết kiệm thời gian và tránh bực bội khi mọi việc không như ý.

Trong phần này, tôi sẽ chỉ ra những vấn đề thường gặp nhất và cách khắc phục.

Lỗi phổ biến và cách sửa

Lỗi: "Access Denied"

Đây có lẽ là lỗi bạn gặp nhiều nhất:

upload failed: ./myfile.txt to s3://testbucket-aws-cp-dradecic/myfile.txt An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

Thường do một trong ba nguyên nhân:

  • Người dùng IAM của bạn không có đủ quyền để thực hiện thao tác.
  • Chính sách bucket đang hạn chế truy cập.
  • Thông tin xác thực AWS của bạn đã hết hạn.

Cách khắc phục:

  • Kiểm tra quyền IAM để đảm bảo bạn có quyền s3:PutObject (đối với tải lên) hoặc s3:GetObject (đối với tải xuống).
  • Xác minh chính sách bucket không hạn chế thao tác của bạn.
  • Chạy aws configure để cập nhật thông tin xác thực nếu đã hết hạn.

Lỗi: "No such file or directory"

Lỗi này xảy ra khi tệp hoặc thư mục cục bộ bạn cố sao chép không tồn tại:

upload failed: ./missing-file.txt to s3://testbucket-aws-cp-dradecic/missing-file.txt An error occurred (404) when calling the PutObject operation: Not Found

Giải pháp đơn giản – kiểm tra kỹ đường dẫn tệp. Đường dẫn có phân biệt chữ hoa/thường. Đồng thời, đảm bảo bạn đang đứng đúng thư mục khi dùng đường dẫn tương đối.

Lỗi: "The specified bucket does not exist"

Nếu bạn thấy lỗi này:

upload failed: ./myfile.txt to s3://testbucket-aws-cp-dradecic/myfile.txt An error occurred (NoSuchBucket) when calling the PutObject operation: The specified bucket does not exist

Hãy kiểm tra:

  • Lỗi chính tả trong tên bucket.
  • Bạn có dùng đúng vùng AWS hay không.
  • Bucket có thực sự tồn tại không (có thể đã bị xóa).

Bạn có thể liệt kê tất cả bucket bằng aws s3 ls để xác nhận tên chính xác.

Lỗi: "Connection timed out"

Sự cố mạng có thể gây hết thời gian chờ kết nối:

upload failed: ./largefile.zip to s3://testbucket-aws-cp-dradecic/largefile.zip An error occurred (RequestTimeout) when calling the PutObject operation: Request timeout

Để khắc phục:

  • Kiểm tra kết nối Internet của bạn.
  • Thử dùng tệp nhỏ hơn hoặc bật tải lên đa phần cho tệp lớn.
  • Cân nhắc dùng AWS Transfer Acceleration để có hiệu năng tốt hơn.

Xử lý lỗi tải lên

Lỗi có khả năng xảy ra cao hơn khi truyền tệp lớn. Khi đó, hãy cố gắng xử lý lỗi một cách linh hoạt.

Ví dụ, bạn có thể dùng cờ --only-show-errors để chẩn đoán lỗi dễ hơn trong script:

aws s3 cp large-directory/ s3://testbucket-aws-cp-dradecic/ --recursive --only-show-errors

Cờ này ẩn các thông điệp truyền thành công, chỉ hiển thị lỗi, giúp việc khắc phục sự cố truyền lớn dễ dàng hơn.

Để xử lý truyền bị gián đoạn, lệnh --recursive sẽ tự động bỏ qua các tệp đã tồn tại ở đích với cùng kích thước. Tuy nhiên, để kỹ hơn, bạn có thể dùng cơ chế retry tích hợp của AWS CLI cho sự cố mạng bằng cách đặt các biến môi trường sau:

export AWS_RETRY_MODE=standard
export AWS_MAX_ATTEMPTS=5
aws s3 cp large-file.zip s3://testbucket-aws-cp-dradecic/

Thiết lập này báo cho AWS CLI tự động thử lại các thao tác thất bại tối đa 5 lần.

Nhưng với bộ dữ liệu rất lớn, hãy cân nhắc dùng aws s3 sync thay vì cp, vì nó được thiết kế để xử lý gián đoạn tốt hơn:

aws s3 sync large-directory/ s3://testbucket-aws-cp-dradecic/large-directory/

Lệnh sync chỉ truyền những tệp khác so với ở đích, rất phù hợp để tiếp tục các phiên truyền lớn bị gián đoạn.

Nếu bạn hiểu các lỗi phổ biến này và triển khai xử lý lỗi phù hợp trong script, bạn sẽ làm cho các thao tác sao chép S3 vững chắc và tin cậy hơn nhiều.

Tổng kết về AWS S3 cp

Tóm lại, lệnh aws s3 cp là giải pháp một điểm đến để sao chép tệp cục bộ lên S3 và ngược lại.

Bạn đã học tất cả trong bài viết này. Bắt đầu từ nền tảng và cấu hình môi trường, và kết thúc bằng việc viết script theo lịch và tự động để sao chép tệp. Bạn cũng đã biết cách xử lý một số lỗi và thách thức thường gặp khi di chuyển tệp, đặc biệt là tệp lớn.

Vì vậy, nếu bạn là lập trình viên, chuyên gia dữ liệu, hay quản trị hệ thống, tôi nghĩ bạn sẽ thấy lệnh này hữu ích. Cách tốt nhất để quen thuộc là sử dụng thường xuyên. Hãy nắm vững những điều cơ bản, rồi dành thời gian tự động hóa những phần việc lặp lại.

Để học thêm về AWS, hãy theo các khóa học của DataCamp:

Bạn thậm chí có thể dùng DataCamp để chuẩn bị cho các kỳ thi chứng chỉ AWS - AWS Cloud Practitioner (CLF-C02).

Câu hỏi thường gặp

Lệnh aws s3 cp là gì và có thể dùng để làm gì?

Lệnh aws s3 cp là một tiện ích trong AWS Command Line Interface cho phép bạn sao chép tệp giữa hệ thống cục bộ và bộ nhớ Amazon S3. Nó được thiết kế để mang lại trải nghiệm dòng lệnh quen thuộc giống lệnh cp tiêu chuẩn của Linux, nhưng được điều chỉnh cho việc tương tác với các bucket S3. Bạn có thể dùng để truyền hai chiều, sao chép đệ quy toàn bộ cấu trúc thư mục, lọc tệp theo mẫu, và thậm chí chỉ định các lớp lưu trữ khác nhau để tối ưu chi phí. Lệnh này đặc biệt hữu ích cho kỹ sư DevOps, nhà khoa học dữ liệu và quản trị hệ thống cần quản lý dữ liệu trong các bucket S3 một cách hiệu quả.

Làm thế nào để thiết lập AWS CLI nhằm sử dụng lệnh aws s3 cp?

Thiết lập AWS CLI để dùng lệnh aws s3 cp bao gồm cài AWS CLI trên hệ thống của bạn, cấu hình với thông tin xác thực AWS, và tạo một bucket S3. Quy trình cài đặt có đôi chút khác nhau tùy hệ điều hành (Windows, Linux, hoặc macOS). Sau khi cài, bạn cần chạy lệnh aws configure và cung cấp Access key ID, Secret access key, vùng mặc định và định dạng xuất ưa thích. Cuối cùng, bạn cần tạo một bucket S3 qua AWS Management Console hoặc dùng trực tiếp AWS CLI.

Cú pháp cơ bản và các trường hợp sử dụng phổ biến của aws s3 cp là gì?

Cú pháp cơ bản của aws s3 cp là aws s3 cp <source> <destination> [options], trong đó nguồn và đích có thể là đường dẫn cục bộ hoặc S3 URI (bắt đầu với s3://). Trường hợp sử dụng phổ biến gồm tải một tệp từ hệ thống cục bộ lên S3, tải một tệp từ S3 về hệ thống cục bộ, và sao chép toàn bộ thư mục theo đệ quy bằng cờ --recursive. Bạn cũng có thể dùng lệnh để sao chép tệp giữa các bucket S3 khác nhau, chỉ định tên khác cho tệp đích, và tổ chức tệp theo cấu trúc "thư mục" lồng nhau bên trong bucket.

Tôi có thể dùng các cờ --exclude và --include để lọc tệp cụ thể như thế nào?

Các cờ --exclude và --include cho phép bạn lọc tệp theo mẫu khi dùng aws s3 cp, mang lại khả năng kiểm soát chính xác nội dung được sao chép. Chẳng hạn, bạn có thể sao chép mọi tệp từ một thư mục trừ những tệp có phần mở rộng cụ thể (như --exclude "*.log"), hoặc chỉ nhắm tới một số loại tệp nhất định (như --include "*.html" --include "*.css" sau khi loại trừ tất cả bằng --exclude "*"). Thứ tự của các cờ này rất quan trọng vì AWS CLI xử lý tuần tự. Điều đó cho phép bạn xây dựng các quy tắc lọc tinh vi cho những kịch bản truyền tệp phức tạp.

Sự khác nhau giữa aws s3 cp với --exact-timestamps và aws s3 sync là gì?

Cả hai lệnh đều có thể dùng để cập nhật tệp trên S3, nhưng mục đích và hành vi khác nhau. Lệnh aws s3 cp với cờ --exact-timestamps chỉ sao chép tệp nếu dấu thời gian khác với trên S3, giúp giảm thời gian truyền và băng thông khi cập nhật tệp. Tuy nhiên, aws s3 sync được thiết kế riêng để giữ đồng bộ thư mục và cung cấp khả năng đồng bộ hóa tinh vi hơn. Nếu bạn cần thường xuyên cập nhật bộ tệp lớn và chỉ muốn truyền những gì thay đổi, aws s3 sync thường là lựa chọn tốt hơn, dù aws s3 cp với --exact-timestamps vẫn phù hợp cho nhu cầu đồng bộ hóa đơn giản.

Dario Radečić

Tác giả

Dario Radečić

Chuyên gia Khoa học Dữ liệu Cấp cao, làm việc tại Croatia. Tác giả Công nghệ Hàng đầu với hơn 700 bài viết đã xuất bản, đạt trên 10 triệu lượt xem. Tác giả cuốn sách Tự động hóa Machine Learning với TPOT.

Chủ đề