Header Ads Widget

Ticker

6/recent/ticker-posts

Tạo CDN Cloudflare cho S3 AWS để giảm chi phí khi sử dụng

Keywords: How to create server download file use s3 AWS and CDN Cloudflare to reduce costs

Chắc hẳn nhiều bạn đã biết s3 là một hình thức lưu trử (Storage) của AWS khá là phổ biến, đặc biệt là sự tiện dụng của công nghệ Cloud mà phía AWS mang lại, nhưng nếu bạn dùng s3 để lưu trử hình ảnh cũng như file cho một trang web, thì các bạn cần chú ý một điều s3 tính phí dựa trên dung lượng lưu trữ và request đến file, nên vì thế chúng ta cần phải có sự kết hợp với CDN để làm giảm chi phí cho nó 

Có rất nhiều hình thức sử dụng CDN như là Cloudfront,... Nhưng tại bài viết này thì mình sẻ sử dụng Cloudflare để giải quyết nó, đơn giản là vì nó free haha, mà anh em có ai từng hiểu CDN là gì chưa nhỉ ? để mình giải thích luôn cho anh em cùng hiểu nhé, với kiến thức hẹp và nhỏ nhắn của mình, thì mình hiểu rằng CDN hay còn biết đến với tên "Content Delivery Network" là một hệ thống có nhiều máy chủ, chứa những bản sao về nội dung ở khắp nơi trên thế giới, nghĩa là sao khi bạn truy cập đến một hệ thống có CDN nó sẻ sao lưu một bản sao tại một máy chủ gần bạn nhất, chứ không phải là máy chính của bạn, việc này tránh tình trạng "thắt cổ chai" và giúp trang web trở nên nhanh hơn, để dễ hiểu mình sẻ ví dụ như sau nhé

Mình có một link đường dẫn file ảnh, khi chưa sử dụng CDN lúc có rất nhiều người truy cập đường link đó nó sẻ bị overload dẫn đến lag hoặc nhiều tình trạng hơn nữa, nhưng khi mình kết hợp link ảnh đó với CDN mọi thứ lại khác, lần đầu mình truy cập ảnh, CDN sẻ tạo một bản sao để lưu tại 1 nơi nào đó gần mình nhất, sau đó người khác truy cập ảnh, nó sẻ tạo tiếp 1 bản sao khác nữa tại một server mà người dùng đó ở gần, như vậy khi các user đó truy cập đến ảnh, họ chỉ truy cập đến các server bản sao có chứa ảnh đó chứ không phải server chính, điều này giải quyết rất nhiều cho tình trạng "thắt cổ chai", ok vậy thì nó liên quan gì đến s3 và giảm chi phí? các bạn sẻ hỏi như thế đúng không nào? đơn giản, như mình đã nói ở trên s3 tính phí dựa trên việc lưu trữ và request đến, ví dụ link ảnh lúc nảy mình lưu tại s3 đi, thì chẳng phải mình giảm rất nhiều cho tình trạng request đến link s3 hay sao ? vì nó đã thông qua CDN của Cloudflare để truy cập các bản sao của hình ảnh đó trên s3 rồi

Ok bây giờ các bạn đã biết sự lợi hại của CDN rồi chứ, gì chứ vấn đề free là ưu tiên lên hàng đầu, giảm được chi phí nào thì hay cho chi phí đó, giải thích vậy được rồi, chúng ta bắt đầu thực hiện nào
Bước 1: Tạo một bucket s3 trên tài khoản AWS của mình nhé 

Chú ý: với tên bucket chính là tên domain của chúng ta khi sử dụng add cho Cloudflare, giả sự mình muốn tạo domain cho s3 có tên là như sau: "data-service.pharmacity.io" thì trên phía s3 mình cũng sẻ tạo 1 bucket có name giống y vậy

Bước 2: Thực hiện phân quyền và cho nó public để show ảnh ra ngoài, mình thực hiện vào phần permission của bucket và chọn như sau để public
Tại phần Bucket Policy mình thực hiện tạo một Policy như sau để cho phép Bucket chỉ có quyền ReadOnly và dành cho các IP thuộc Cloudflare, chúng ta có thể tham khảo các IP của Cloudflare tại đây

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Sid": "PublicRead",
          "Effect": "Allow",
          "Principal": "*",
          "Action": [
              "s3:GetObject",
              "s3:GetObjectVersion"
          ],
          "Resource": [
              "arn:aws:s3:::data-service.pharmacity.io/pmc-upload-media/*",
              "arn:aws:s3:::data-service.pharmacity.io/favicon.ico"
          ],
          "Condition": {
              "Bool": {
                  "aws:SecureTransport": "true"
              },
              "IpAddress": {
                  "aws:SourceIp": [
                      "2400:cb00::/32",
                      "2606:4700::/32",
                      "2803:f800::/32",
                      "2405:b500::/32",
                      "2405:8100::/32",
                      "2a06:98c0::/29",
                      "2c0f:f248::/32",
                      "173.245.48.0/20",
                      "103.21.244.0/22",
                      "103.22.200.0/22",
                      "103.31.4.0/22",
                      "141.101.64.0/18",
                      "108.162.192.0/18",
                      "190.93.240.0/20",
                      "188.114.96.0/20",
                      "197.234.240.0/22",
                      "198.41.128.0/17",
                      "162.158.0.0/15",
                      "104.16.0.0/13",
                      "104.24.0.0/14",
                      "172.64.0.0/13",
                      "131.0.72.0/22"
                  ]
              }
          }
      }
  ]
}
Tiếp đến, sau khi đã cho Bucket có quyền Read rồi thì ta cần phải setting luôn cả CORS
Cross-origin resource sharing (CORS) sẻ như sau:
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST",
            "DELETE",
            "HEAD"
        ],
        "AllowedOrigins": [
            "https://data-service.pharmacity.io"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]
Mọi thứ đã chuẩn bị ok rồi đúng không
Bước 3: Thực hiện chỉnh sửa URL để Records trên Cloudflare
  • URL sẻ như sau: <bucket-name>.s3.<region>.amazonaws.com
Ở đây Bucket của mình là "data-service.pharmacity.io" và mình ở vùng "us-east-1" thì url để records của mình sẻ như sau
data-service.pharmacity.io.s3.us-east-1.amazonaws.com
Bước 4: Thêm record cho Cloudflare nhé, tại Cloudflare chọn Add record
Và điền như hình nhé, nhớ bật Proxied lên
Bây giờ thì ngon lành rồi đó, khi các bạn upload ảnh lên, thì khi truy cập path của ảnh như sau, nó sẻ show ảnh ra và thực hiện CDN rồi đó
Chúc các bạn thành công nhé, nhớ click quảng cáo để mình có thêm động lực viết bài nữa nhé haha

Post a Comment

0 Comments