[AWS - S3] Tạo tài khoản IAM để sử dụng cho S3

Kết nối với s3 bằng tài khoản IAM

    Xin chào các bạn, hôm nay chúng ta sẽ tìm hiểu một chút về IAM (Identity and Access Management) trong AWS. Mình đoán chắn chắn rằng khi mới tiếp xúc với AWS các bạn đều nghe tới thuật ngữ này, vì vậy hôm nay mình sẽ hướng dẫn sử dụng IAM để download và upload file lên S3 nhé.




    Đặt vấn đề: Khi sử dụng S3 như ở bài viết trước mình đã giới thiệu thì có một vấn đề xảy ra là bạn đặt 1 bucket là private và chỉ có tài khoản AWS Console của bạn mới có quyền truy cập. Theo các bạn biết thì tài khoản AWS có thể truy cập rất nhiều thứ ngoài S3 ra còn EC2, DBS,.... Nhưng giờ bạn muốn dùng S3 cho ứng dụng nhưng không muốn chia sẻ toàn bộ tài khoản của mình thì phải làm sao?

    Để giải quyết vấn đề trên AWS cung cấp 1 dịch vụ giúp bạn tạo ra các tài khoản định danh tức là tài khoản theo các quyền hạn nhất định, và bạn hoàn toàn có thể quản lý đống tài khoản đó. Bạn có thể quản lý được việc tài khoản đó được sử dụng các dịch vụ nào, hoặc đơn giản bạn có thể xoá tài khoản đó vì một số lý do an ninh. Và dịch vụ đó ở AWS có tên là Identity and Access Management (IAM).
 
    Ở trong bài này mình không đi sâu vào chi tiết là IAM quản lý những gì, cài đặt quyền như nào Group ra làm sao, User là gì. Phạm vi bài viết của mình chỉ có một mục đích là tạo 1 tài khoản cấp quyền cho truy cập vào private S3 để upload file hoặc lấy ra những file theo ý muốn của mình, sử dụng trên nền tảng nodejs.

1, Cách tạo tài khoản IAM và cấp quyền truy cập vào S3

    Trước tiên hãy đọc lại bài viết trước, và tạo private bucket s3 trước nhé. Nếu đã có bucket S3 rồi bạn hãy truy cập vào đường dẫn này để tạo 1 user IAM. Các bước được tiến hành như video dưới.

    
    Mình xin được phép giải thích một xíu ở bước 1 tại màn hình tạo tài khoản, có 1 chỗ cho phép chọn Access type và có 2 lựa chọn
  • Programmatic access: Lựa chọn này thường thì bạn sẽ tạo ra 1 tài khoản IAM chỉ có ID và mã truy cập (private key) để sử dụng cho các API (Non GUI) thường sẽ dùng cho việc kết nối từ ngôn ngữ này ngôn ngữ kia vào AWS để làm gì đó và trong phạm vi bài viết mình sẽ sử dụng lựa chọn này.
  • AWS Management Console access: Lựa chọn này cho phép bạn tạo 1 tài khoản con để login vào AWS Console (GUI) để thực hiện các tác vụ sử dụng giao diện ví dụ như việc upload file ở bài viết ở mục S3.
    Ở bước số hai khi tạo tài khoản IAM, thì sẽ yêu cầu cấp quyền, nhưng hiện tại trong video mình chưa cấp quyền cho bất cứ thứ gì kể cả quyền truy cập vào S3.
    
    Và cuối cùng ở khi review và gắn tag tài khoản xong thì AWS sẽ hiện cho bạn Access key ID và Secret access key. Đoạn này các bạn hãy ngồi ngay ngắn lại và note nó vào đâu đó nhé :D vì AWS chỉ cấp một lần, nếu mà quên mất thì khá là toang đó....

    Sau khi các bạn tạo xong tài khoản IAM, giờ tới việc cài đặt quyền cho tài khoản để truy cập vào S3 để đọc và ghi. Các bạn quay lại trang chính của IAM rồi bấm vào mục users -> chọn tài khoản bạn vừa tạo và làm theo video nha
    



    Bạn sẽ thấy 3 lựa chọn ở ngay màn hình đầu tiên:
  • Add user to group: Khi bạn có 1 group user, và group đó bạn gắn quyền sẵn thì bạn hoàn toàn có thể sử dụng lựa chọn này để gắn quyền cho user, mà không phải làm bất cứ thứ gì
  • Copy permission from exist user: Tương tự với group user, cái khác là bạn copy từ một user khác và sửa lại nó nếu muốn
  • Attach existing policies directly: Nếu bạn chưa biết nhiều về các quyền của IAM đổi với các dịch vụ của họ, thì đây là nơi đầu tiên bạn sẽ hướng tới. Ở đây bạn có thể chọn được một quyền tổng quát như mình chọn quyền Amazon s3 full access tức là có quyền truy cập vào toàn bộ dịch vụ của S3, tất nhiên là bạn có thể tự custom lại ví dụ chỉ truy cập vào 1 bucket thay vì tất cả, hoặc là chỉ có đọc thôi chứ không cho ghi,...... Về mấy cái quyền này thì bạn chỉ có đọc được trên tài liệu của AWS thôi :D mình sẽ để link refercence bên dưới bài viết nhé

2, Tải lên và đọc trực tiếp từ S3 thông qua tài khoản IAM với Nodejs

    Với Nodejs mình sử dụng package aws-sdk, các bạn có thể cài vào project hoặc chạy test tại đây

    Đoạn code hỗ trợ upload file lên s3, sau khi coppy về các bạn chạy lệnh node upload-file.js sẽ thấy hiện thị File uploaded successfully at https://bucket.s3.amazonaws.com/file-path là đã thành công nhé, bạn có thể coppy link nào lên trình duyệt thì sẽ thấy không truy cập được, tuy nhiên khi bạn check trên s3 thì đã tồn tại file này rồi nha.


    Đoạn code hỗ trợ việc đọc file từ s3, sau khi upload lên s3 chúng ta có thể thấy truy cập trực tiếp vào sẽ bị Access Denied. Để đọc được file này, chúng ta phải tạo ra một đường link mới chưa các xác thực của bạn đường link này được gọi là S3 Signed Urls, tức là một link chứa xác thực, và bạn có thể truy cập link này trong x thời gian, mình recommend các bạn cài đặt x càng nhỏ càng tốt nhé. 

    Sau khi bạn chạy node read-file.js nếu bạn setup đúng sẽ hiện ta 1 đường link dẫn tới S3 nhưng sẽ kèm nhiều thông số khác, và bạn có thể truy cập link này trực tiếp từ trình duyệt. Và xong!!

3, Tổng kết

    Cuối cùng cũng tới tổng kết :D, bài viết này mình hướng đã hướng dẫn các bạn cách dùng IAM với S3, cách tạo tài khoản IAM và cấp toàn bộ quyền truy cập vào S3, nhưng song với đó bạn cũng có thể tuy chỉnh chi tiết hơn cách truy cập vào S3 ví dụ như bucket truy cập hoặc thậm chí Key truy cập,...

    Ngoài ra thì mình cũng hướng dẫn các bạn dùng key tạo được từ IAM để dùng cho ứng dụng Nodejs để có thể upload file và đọc file. Bạn hãy chú ý rằng S3 Signed URL có rất nhiều tính năng, không chỉ đọc, mà bạn cũng có thể từ cái link đó upload file lên S3, hoặc làm tất cả những gì bạn muốn với S3.

    End, cảm ơn các bạn đã đọc bài nhá :D, hi vọng các bạn sẽ tiếp tục theo dõi về series blog AWS của mình.... hẹn gặp các bạn ở bài viết tiếp theo nha.