Điểm:4

AWS: Làm cách nào để chuyển hướng nhiều miền đến một trang trên một miền khác?

lá cờ us
ssc

mục tiêu của tôi

Tôi có một số miền (ví dụ: 10 hoặc 20) và tôi muốn chuyển hướng không tí nào du khách đến bất cứ nơi nào trên các trang đó đến một trang trên miền khác (ví dụ: trang hồ sơ stackoverflow.com của tôi).

Điêu nay bao gôm

  1. tên miền apex bằng cách sử dụng http (ví dụ. http://mydomain01.com)
  2. tên miền apex bằng cách sử dụng https (ví dụ. https://mydomain01.com)
  3. tên miền phụ sử dụng http (ví dụ. http://www.mydomain01.com hoặc http://blog.mydomain01.com)
  4. tên miền phụ sử dụng https (ví dụ. https://www.mydomain01.com hoặc https://blog.mydomain01.com)
  5. bất kỳ đường dẫn nào (ví dụ: http://mydomain01.com/some_path hoặc https://www.mydomain01.com/another/path.html)

cộng với điều tương tự cho tất cả các miền khác của tôi (mydomain02.com, mydomain03.com, vân vân.; từng với các trường hợp sử dụng ở trên).

Nghiên cứu của tôi

  1. Bài viết AWS này giải thích cách chuyển hướng lưu lượng truy cập internet từ miền apex sang miền khác (trường hợp #1 trong Điêu nay bao gôm danh sách trên) bằng cách sử dụng AWS S3Tuyến AWS 53: Điều này làm việc cho http, nhưng không phải cho https.
  2. Bài viết AWS này giải thích cách chuyển hướng lưu lượng truy cập internet cho một số trường hợp (nhìn bề ngoài, bao gồm tất cả các trường hợp trong Điêu nay bao gôm danh sách trên) bằng cách sử dụng AWS S3, Tuyến AWS 53Mặt trận đám mây AWS: Điều này làm việc cho cả hai httphttps. (Cũng nói về việc sử dụng Cân bằng tải ứng dụng, nhưng tôi đoán điều đó nằm ngoài phạm vi ở đây...)
  3. Bài viết AWS này bổ sung thêm một số chi tiết về cách thiết lập bản phân phối CloudFront và cách xem thông tin chi tiết về các tệp nhật ký.
  4. Bài viết AWS này tài liệu quy tắc chuyển hướng để sử dụng chuyển hướng có điều kiện nâng cao: Không chắc liệu tôi có cần đến đó để hoàn thành mục tiêu của mình hay không, vì vậy tôi chưa thực sự xem xét điều đó.

Ngoài ra, rõ ràng có rất nhiều câu hỏi SO (xem Có liên quan ở bên phải của câu hỏi này) và các bài đăng khác về chủ đề này; vấn đề với hầu hết trong số đó là chúng sử dụng ảnh chụp màn hình từ các phiên bản trước của Giao diện người dùng bảng điều khiển AWS: Hầu hết nội dung vẫn giống nhau, nhưng việc so sánh các ảnh chụp màn hình đó với giao diện người dùng IMO hiện tại sẽ tạo thêm một lớp nhầm lẫn khác.

Các điểm chính rút ra từ tài liệu AWS (và các tài liệu khác):

  1. Tôi cần tạo một bộ chứa trong AWS S3 và định cấu hình chuyển hướng trong đó,
  2. Tôi cần tạo một bản phân phối trong AWS CloudFront;
  3. để sử dụng miền tùy chỉnh trong CloudFront, tôi cần tạo chứng chỉ trong AWS ACM,
  4. Tôi cần tạo một vùng được lưu trữ trong AWS Route 53 và định cấu hình các bản ghi trong đó.

công việc của tôi cho đến nay

AWS CLI mới nhất đã được cài đặt, khu vựcđầu ra được cấu hình trong ~/.aws/config, thông tin đăng nhập được thiết lập trong ~/.aws/credentials (mỗi cho mọi tài khoản AWS); AWS_* biến môi trườngxuất khẩubiên tập

Tôi đang sử dụng khu vực AWS Miền Đông Hoa Kỳ (Bắc Virginia) (US-East-1) cho mọi thứ để ngăn chặn bất kỳ sự cố nào khác do tài nguyên AWS không khả dụng trong một khu vực.

$ aws --version
aws-cli/2.2.23 Python/3.9.6 Darwin/19.6.0 source/x86_64 nhắc/tắt

Tôi bỏ qua bất kỳ dấu nhắc shell nào hoặc > các ký tự tiếp tục dòng trình bao để sao chép dễ dàng hơn từ bài đăng này vào trình bao.

Thiết lập nhóm S3

Cảnh báo: Điều này tạo ra một nhóm "tất cả công khai" mà không có bất kỳ giới hạn truy cập nào. Trong trường hợp này, điều này không thành vấn đề vì không có nội dung nào trong nhóm cần bảo vệ, nhưng nhóm chung như vậy nói chung là một cách làm không tốt. Ngoài ra, tôi đang sử dụng nhóm công khai để ngăn mọi sự cố khác do hạn chế truy cập gây ra: Đầu tiên, làm cho nó hoạt động; thứ hai, làm cho nó an toàn.

tạo thùng

aws s3api tạo thùng --bucket mydomain01.com
  • phản ứng:
{
    "Vị trí": "/mydomain01.com"
}

thiết lập chuyển hướng

aws s3api put-bucket-website --bucket mydomain01.com --website-configuration \
    '{ "RedirectAllRequestsTo": { "HostName": "stackoverflow.com/users/217844/ssc" } }'
  • không phản hồi

Hiểu rồi: Tên bộ chứa S3 phải khớp với tên miền apex.

Sử dụng bất kỳ tên nhóm nào nhưng mydomain01.com (ví dụ của tôi) dường như không thành công mà không có bất kỳ dấu hiệu nào về nguyên nhân. Các tài liệu AWS không thực sự làm rõ điều này - trên thực tế, tôi vẫn không chắc liệu mình có hiểu nhầm điều gì đó ở đây hay không, nhưng từ những gì tôi có thể nói, tài liệu chính thức của AWS thực sự hơi cẩu thả về điều đó - IMO - điểm mấu chốt quan trọng : Ví dụ, #2 chỉ cần nói

  1. Tạo một bộ chứa S3 có tên duy nhất toàn cầu.

Có thể là không tí nào tên duy nhất trên toàn cầu. #1 đề cập đến điều đó theo một cách nào đó - một khi bạn biết cách đọc những bit đó ...

Bên cạnh đó, bài báo số 2 tiếp tục làm tôi bối rối với

Nếu bạn không sử dụng miền tùy chỉnh ...

Tại sao tôi lại không phải đang sử dụng miền tùy chỉnh?!? Toàn bộ vấn đề là chuyển hướng miền tùy chỉnh của tôi, phải không?!? Chà, dù sao thì...

Hiểu rồi: Không được thêm giao thức vào tên máy chủ.

Cả Bảng điều khiển AWS và AWS CLI dường như không kiểm tra xem một giao thức (http:// hoặc https://) đã được nhập vào Tên máy chủ trường giao diện người dùng/được thông qua trong Tên máy chủ Chuỗi JSON. Tuy nhiên, nếu một cái được thêm vào trước, thì chuyển hướng không thành công; xem chuyển hướng thử nghiệm phía dưới.

Hiểu rồi: Lỗi giao diện người dùng Bảng điều khiển AWS S3.

Sau khi thiết lập chuyển hướng, Bảng điều khiển AWS hiển thị liên kết có thể nhấp trong giao diện người dùng của nó tới URL bộ chứa (http://mydomain01.com.s3-website-us-east-1.amazonaws.com) ở dưới cùng của thùng Tính chất tab, trong Lưu trữ trang web tĩnh tiết diện.

Nhấp vào liên kết đó không mở được trang, có vẻ như do Bảng điều khiển AWS làm rối URL và cố mở http://https//stackoverflow.com/users/217844/ssc/, bất kể giao thức.

chuyển hướng thử nghiệm

  • sử dụng HTTPie trong vỏ thay vì Xoăn hoặc quên đi bởi vì đó là những gì những đứa trẻ tuyệt vời dường như sử dụng ngày nay
  • sao chép liên kết từ Bảng điều khiển AWS trong trình duyệt sang shell
http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 được di chuyển vĩnh viễn
Độ dài nội dung: 0
Ngày: Thứ Hai, ngày 02 tháng 8 năm 2021 12:39:09 GMT
Vị trí: http://stackoverflow.com/users/217844/ssc/
Máy chủ: AmazonS3
x-amz-id-2: rakAqUMnRraGvo/WkSa6AnbuhWn/9YZX/CAlI/OJQKYoWp/OdQIbyhsvHSwNved3suwMdgglqpE=
x-amz-request-id: C5BBG833Q9TQ9J6X

-> dường như hoạt động

  • kiểm tra chuyển hướng nếu giao thức được thêm nhầm vào tên máy chủ; lưu ý bị hỏng Địa điểm url:
http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 được di chuyển vĩnh viễn
Độ dài nội dung: 0
Ngày: Thứ Hai, ngày 02 tháng 8 năm 2021 12:52:10 GMT
Vị trí: http://https://stackoverflow.com/users/217844/ssc/
Máy chủ: AmazonS3
x-amz-id-2: Ee2/ob0faTpRdp6mGITdmClozXNmF1Q2oTbPioms8O91VA8n5VA3MoHhveeFz7v2VS65YKFKlDA=
x-amz-request-id: ZJP653R50YD5HSRS

Câu hỏi của tôi #1

LƯU Ý: Tôi đã có những câu hỏi này khi bắt đầu viết bài này; Tôi nghĩ Tôi đã có thể tự trả lời chúng kể từ đó (xem kiểm tra www bản ghi tên miền phụ phía dưới). Ai đó hãy sửa tôi nếu tôi sai:

  1. Hỏi: Yêu cầu "tên nhóm == tên miền" có được áp dụng ngay cả khi tôi sử dụng CloudFront không?
    MỘT: Đúng.
  2. Hỏi: Tôi có cần tạo một nhóm cho mỗi tên miền apex và mọi tên miền phụ không? vì vậy, trong ví dụ của tôi
    • mydomain01.com
    • www.mydomain01.com
    • blog.mydomain01.com ?
      MỘT: Đúng.

Thiết lập vùng được lưu trữ trên Tuyến 53

tạo vùng lưu trữ

aws route53 create-hosted-zone --caller-reference "$(date '+%Y%m%d-%H%M%S')" --name mydomain01.com
  • phản ứng
{
    "Vị trí": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z123456789EXAMPLE0SKX",
    "Khu vực lưu trữ": {
        "Id": "/hostedzone/Z123456789EXAMPLE0SKX",
        "Tên": "mydomain01.com.",
        "Tham khảo người gọi": "20210802-150736",
        "Cấu hình": {
            "Khu vực riêng tư": sai
        },
        "ResourceRecordSetCount": 2
    },
    "Thông tin thay đổi": {
        "Id": "/change/C1234567890SKXEXAMPLE",
        "Tình trạng: Đang chờ",
        "Đã gửiAt": "2021-08-02T13:07:37.860000+00:00"
    },
    "Bộ ủy quyền": {
        "Máy chủ định danh": [
            "ns-1234.awsdns-12.com",
            "ns-5678.awsdns-34.co.uk",
            "ns-1234.awsdns-56.net",
            "ns-5678.awsdns-78.org"
        ]
    }
}
  • lưu ý ID vùng được lưu trữ Z123456789EXAMPLE0SKX, cần thiết trong các bước tiếp theo

tạo bản ghi cho miền apex

  • Tuyến AWS 53 thay-đổi-tài-liệu-bộ tài liệu
  • cái này nên làm việc cho http, nhưng không phải cho https
  • JSON để vượt qua hơi phức tạp; tạo một tệp tạm thời cục bộ thay đổi-batch.apex.json với nội dung bên dưới
  • nhận giá trị cho HostedZoneIdTên DNS từ Điểm cuối trang web Amazon S3: Xô được tạo ra trong Miền Đông Hoa Kỳ (Bắc Virginia), vì vậy hãy sử dụng Z3AQBSTGFYJSTF
{
  "Thay đổi": [
    {
      "Hành động": "TẠO",
      "ResourceRecordSet": {
        "Tên": "mydomain01.com.",
        "Loại": "A",
        "Mục tiêu bí danh": {
          "HostedZoneId": "Z3AQBSTGFYJSTF",
          "DNSName": "s3-website-us-east-1.amazonaws.com",
          "Đánh giá sức khỏe mục tiêu": sai
        }
      }
    }
  ]
}

Hiểu rồi: Phải dùng nguyên văn s3-website-us-east-1.amazonaws.comTên DNS.

Tài liệu AWS nói ở mọi nơi về ví dụ.com hoặc example.com.s3-website-us-east-1.amazonaws.com, v.v. Trong trường hợp này, đây không phải là một số ví dụ được thay thế bằng các giá trị riêng (ví dụ: mydomain01.com.s3-website-us-east-1.amazonaws.com), nhưng giá trị nguyên văn từ cái bàn, I E. s3-website-us-east-1.amazonaws.com.

Hiểu rồi: Không được thêm giao thức vào tên máy chủ.

Tương tự như lỗi xác thực ở trên, cả Bảng điều khiển AWS và AWS CLI đều sẵn sàng chấp nhận một giao thức (http:// hoặc https://) được thêm vào trước giá trị được nhập trong Tên máy chủ Trường giao diện người dùng/được thông qua dưới dạng Tên DNS. Ít nhất, điều này có vẻ rất sai trong Bảng điều khiển, ví dụ: http\072\057\057mydomain01.s3-website-us-east-1.amazonaws.com.

Cả hai vấn đề đều được giảm thiểu phần nào trong Bảng điều khiển AWS, nơi có thể chọn các giá trị từ hộp thả xuống khi bản ghi được tạo hoặc chỉnh sửa; khi sử dụng AWS CLI, bạn phải kiểm tra kỹ những gì mình gửi.

Gotcha và giảm thiểu tương tự áp dụng cho ghi tên trường giao diện người dùng / Tên Giá trị JSON.

tạo bản ghi cho miền apex, tiếp.

  • sử dụng jq để kiểm tra nhanh, tệp tạm thời chứa json hợp lệ
jq. < change-batch.apex.json 1> /dev/null
  • không có đầu ra -> JSON hợp lệ
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.apex.json"
  • phản ứng
{
    "Thông tin thay đổi": {
        "Id": "/change/C1234567890EXAMPLESKX",
        "Tình trạng: Đang chờ",
        "Đã gửiAt": "2021-08-02T14:20:09.370000+00:00"
    }
}

kiểm tra bản ghi tên miền apex

  • kiểm tra http
http://mydomain01.com
HTTP/1.1 301 được di chuyển vĩnh viễn
Độ dài nội dung: 0
Ngày: Thứ Hai, 02 Tháng 8 năm 2021 15:06:08 GMT
Vị trí: http://stackoverflow.com/users/217844/ssc/
Máy chủ: AmazonS3
x-amz-id-2: EfDtCxif2iV4eInskirSBAOjQS7o9arzJCeZjscF6mW7cwwmm9Nxb7QJT50x2kjdslX2fOxA+lk=
x-amz-yêu cầu-id: WM7K9TDEF75A6P1V

--> có vẻ tốt

  • kiểm tra http với một con đường
http http://mydomain01.com/some/path
 ... đầu ra tương tự như trên ...
  • kiểm tra https
http://mydomain01.com

http: lỗi: Lỗi kết nối: HTTPSConnectionPool(host='mydomain01.com', port=443):
  Đã vượt quá số lần thử lại tối đa với url: / (Nguyên nhân là do NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x101a48100>:
    Không thể thiết lập kết nối mới: [Errno 60] Thao tác đã hết thời gian chờ')) trong khi thực hiện yêu cầu GET tới URL: https://mydomain01.com/
  • (phản hồi được bao bọc để dễ đọc)

-> hết thời gian (sau 60 giây?) - như mong đợi: chuyển hướng bằng bộ chứa S3 không hoạt động với https (xem ở trên)

Hiểu rồi: Độ trễ lan truyền thay đổi DNS.

AWS và Google là rất nhanh về mặt truyền bá các thay đổi đối với cài đặt DNS (tính bằng giây hoặc phút), nhưng có thể có các máy chủ định danh khác, "chậm hơn" có liên quan. Bỏ qua chúng như mô tả đây để loại bỏ nguồn nhầm lẫn đó. Cách tiếp cận đó chỉ hoạt động trong macOS, nhưng khái niệm này giống nhau đối với mọi hệ điều hành.

Hiểu rồi: Bộ đệm của trình duyệt.

Khi kiểm tra các thay đổi DNS không phải trong trình bao mà trong trình duyệt, trình duyệt có thể nhận được kết quả từ bộ đệm của nó. Tôi thực hiện hầu hết công việc của mình bằng Chrome, nhưng sử dụng Firefox (hoặc Safari) để kiểm tra, vì vậy tôi có thể xóa toàn bộ bộ đệm trước mỗi lần kiểm tra để loại bỏ sự cố tiềm ẩn đó - mà không cần đăng xuất khỏi Google, AWS, v.v.

tạo bản ghi cho www tên miền phụ

  • sự khác biệt duy nhất là Tên giá trị JSON
sed -e 's|mydomain01.com.|www.mydomain01.com.|g' change-batch.apex.json > change-batch.www.json
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.www.json
  • phản ứng tương tự như trên

kiểm tra www bản ghi tên miền phụ

  • kiểm tra http
http://www.mydomain01.com
HTTP/1.1 404 Không tìm thấy
Độ dài nội dung: 363
Loại nội dung: văn bản/html; bộ ký tự = utf-8
Ngày: Thứ Hai, 02 Tháng 8 năm 2021 15:28:05 GMT
Máy chủ: AmazonS3
x-amz-id-2: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=
x-amz-request-id: TK83G35EMYFR8SKX

<html>
<head><title>Không tìm thấy 404</title></head>
<body>
<h1>Không tìm thấy 404</h1>
<ul>
<li>Mã: NoSuchBucket</li>
<li>Thông báo: Nhóm được chỉ định không tồn tại</li>
<li>Tên nhóm: www.mydomain01.com</li>
<li>RequestId: TK83G35EMYFR8SKX</li>
<li>Id máy chủ: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=</li>
</ul>
<hr/>
</body>
</html>
  • Tôi nghĩ rằng câu trả lời thứ hai của Câu hỏi của tôi #1 ở trên: Tôi cần một bộ chứa S3 cho mỗi miền apex/miền phụ để chuyển tiếp.

Thiết lập phân phối CloudFront

  • LƯU Ý: Bảng điều khiển AWS giúp thực sự dễ dàng yêu cầu chứng chỉ và xác thực nó bằng DNS.

tạo chứng chỉ

  • ACM AWS yêu cầu chứng chỉ tài liệu
  • chứng chỉ được cho là hoạt động cho đỉnh và tất cả các miền phụ, vì vậy cần phải thêm tên khác vào chứng chỉ này / vượt qua --subject-alternative-names; xem bài viết AWS này (hộp màu xanh phía trên).
  • thêm dấu ngoặc kép xung quanh *.mydomain01.com vì vậy Shell không giải thích *
chứng chỉ yêu cầu aws acm --tên miền mydomain01.com --phương thức xác thực DNS \
    --subject-alternative-names '*.mydomain01.com'
  • phản ứng:
{
    "Chứng chỉArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab"
}
  • 123456789012 là ID tài khoản AWS của tôi; mọi thứ sau giấy chứng nhận/ chỉ là một UUID

nhận chi tiết chứng chỉ

  • ACM AWS mô tả-chứng chỉ tài liệu
  • lưu phản hồi vào tệp cục bộ tạm thời; trích xuất ResourceRecord.NameResourceRecord.Value sử dụng jq
  • cần thiết cho bản ghi AWS Route 53 chứng tỏ tôi sở hữu mydomain01.com
  • cách khác, sử dụng --truy vấn tham số với chứng chỉ mô tả aws acm
chứng chỉ mô tả aws acm \
    --certificate-arn "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab" \
 > mô tả-chứng chỉ.json
jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Name' description-certificate.json
_1234567890abcdef1234567890abcdef.mydomain01.com.

jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Value' description-certificate.json 
_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws.

tạo bản ghi Tuyến 53 để xác thực chứng chỉ

  • sẽ được AWS ACM tự động kiểm tra và chứng chỉ sẽ được xác thực sau khi tìm thấy bản ghi này
  • như trước đây, hãy sử dụng tệp cục bộ tạm thời thay đổi-batch.cert.json, xem ví dụ tạo bản ghi cho miền apex; nội dung:
{
  "Thay đổi": [
    {
      "Hành động": "TẠO",
      "ResourceRecordSet": {
        "Tên": "_1234567890abcdef1234567890abcdef.mydomain01.com.",
        "Loại": "CNAME",
        "TTL": 300,
        "Bản ghi tài nguyên": [
          {
            "Giá trị": "_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws."
          }
        ]
      }
    }
  ]
}
  • vỏ lệnh:
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.cert.json
  • phản hồi tương tự như khi tạo bản ghi ở trên
  • LƯU Ý: Có thể mất vài phút để ACM xác thực chứng chỉ.

tạo bản phân phối CloudFront

  • Mặt trận đám mây AWS tạo-phân phối tài liệu
  • lần nữa, Người gọi tham khảo phải đơn giản là một chuỗi duy nhất; sử dụng ví dụ ngày '+%Y%m%d-%H%M%S' trong shell để tạo và sao chép vào tệp; xem tạo vùng lưu trữ
  • như trước đây, hãy sử dụng tệp cục bộ tạm thời tạo-phân phối.json cho các giá trị phức tạp; nội dung bên dưới
  • Phiên bản giao thức tối thiểu: lấy giá trị từ bài viết AWS này
  • OriginProtocolPolicy: sử dụng chỉ http bởi vì nguồn gốc (bộ chứa S3) chỉ có thể làm http
  • ViewerProtocolPolicy: sử dụng chuyển hướng đến https vì toàn bộ mục đích của việc tạo bản phân phối này là để chuyển hướng từ http đến https
  • LƯU Ý: Tôi không biết (và tài liệu AWS không cho biết) trường nào bắt buộc phải có; lệnh AWS CLI hiển thị một thông báo rõ ràng và chi tiết nếu có điều gì đó về dữ liệu đã gửi bị thiếu hoặc sai.
{
    "CallerReference": "20210802-191725",
    "Bí danh": {
        "Số lượng: 2,
        "Mục": ["mydomain01.com", "*.mydomain01.com"]
    },
    "Nguồn gốc": {
        "Số lượng: 1,
        "Vật phẩm": [
            {
                "Id": "mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725",
                "Tên miền": "mydomain01.com.s3.us-east-1.amazonaws.com",
                "CustomOriginConfig": {
                    "Cổng HTTP": 80,
                    "HTTPSPort": 443,
                    "OriginProtocolPolicy": "chỉ http"
                }
            }
        ]
    },
    "Nhóm gốc": {
        "Số lượng": 0
    },
    "Hành vi mặc địnhCache": {
        "TargetOriginId": "mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725",
        "Giá trị được chuyển tiếp": {
            "Chuỗi truy vấn": sai,
            "Bánh quy": {
                "Chuyển tiếp": "không"
            },
            "Tiêu đề": {
                "Số lượng": 0
            },
            "QueryStringCacheKeys": {
                "Số lượng": 0
            }
        },
        "Người ký đáng tin cậy": {
            "Đã bật": sai,
            "Số lượng": 0
        },
        "ViewerProtocolPolicy": "chuyển hướng đến https",
        "MinTTL": 0,
        "Phương thức được phép": {
            "Số lượng: 2,
            "Vật phẩm": [
                "CÁI ĐẦU",
                "ĐƯỢC"
            ],
            "Phương thức lưu trữ": {
                "Số lượng: 2,
                "Vật phẩm": [
                    "CÁI ĐẦU",
                    "ĐƯỢC"
                ]
            }
        },
        "SmoothStreaming": sai,
        "TTL mặc định": 86400,
        "TTL tối đa": 31536000,
        "Nén": sai,
        "LambdaFunctionAssociations": {
            "Số lượng": 0
        },
        "FieldLevelEncryptionId": ""
    },
    "Hành vi bộ đệm": {
        "Số lượng": 0
    },
    "CustomErrorResponses": {
        "Số lượng": 0
    },
    "Bình luận": "",
    "Ghi nhật ký": {
        "Đã bật": sai,
        "Bao gồmCookies": sai,
        "Gầu múc": "",
        "Tiếp đầu ngữ": ""
    },
    "PriceClass": "PriceClass_All",
    "Đã bật": đúng,
    "Chứng chỉ người xem": {
        "ACMCertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab",
        "MinimumProtocolVersion": "TLSv1.2_2021",
        "SSLSupportMethod": "chỉ sni"
    },
    "Những hạn chế": {
        "Giới hạn địa lý": {
            "Loại hạn chế": "không",
            "Số lượng": 0
        }
    },
    "WebACLId": "",
    "Phiên bản http": "http2",
    "IsIPV6Enabled": đúng
}
  • vỏ lệnh:
  • LƯU Ý: thêm --no-cli-máy nhắn tin để vô hiệu hóa phân trang và lưu trữ phản hồi trong tệp cục bộ tạm thời để kiểm tra
aws --no-cli-pager tạo phân phối trên nền tảng đám mây \
    --distribution-config "file://$(pwd)/create-distribution.json"
 > tạo-phân phối.response.json
  • phản hồi: một cấu trúc JSON lớn, chủ yếu là cấu hình được gửi cùng với một số thông tin meta phân phối

Hiểu rồi: Phân phối CloudFront mất một chút thời gian để triển khai.

bên trong phân phối tổng quan, có một Sửa đổi lần cuối trường cho biết triển khai trong một thời gian sau mỗi lần thay đổi; tùy thuộc vào độ rộng của cửa sổ trình duyệt và màn hình, trường này có thể bị ẩn, vì vậy giao diện người dùng có thể trông giống như bản phân phối đang hoạt động trong khi thực tế thì không phải vậy.

phân phối thử nghiệm

  • được Tên miền từ phản hồi
jq -r '.Distribution.DomainName' tạo-phân phối.response.json
abcdefghij1234.cloudfront.net
  • kiểm tra http
http://abcdefghij1234.cloudfront.net
HTTP/1.1 301 được di chuyển vĩnh viễn
Kết nối: giữ nguyên
Độ dài nội dung: 183
Loại nội dung: văn bản/html
Ngày: Thứ Hai, 02 Tháng 8 năm 2021 20:14:27 GMT
Vị trí: https://abcdefghij1234.cloudfront.net/
Máy chủ: CloudFront
Qua: 1.1 8640a37b586353bc916562c577770223.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ooT0Y1QvDE7_yoRmb0p0Un2Db6O713rBvudtmz1xer7YwEU0GE8smw==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Chuyển hướng từ đám mây

<html>
<head><title>301 Đã di chuyển vĩnh viễn</title></head>
<body bgcolor="white">
<center><h1>301 Đã di chuyển vĩnh viễn</h1></center>
<hr><center>CloudFront</center>
</body>
</html>

Vì vậy, phân phối chuyển hướng từ http://abcdefghij1234.cloudfront.net đến https://abcdefghij1234.cloudfront.net - như là nó phải như thế; đó là những gì nó được tạo ra cho.

  • kiểm tra https
HTTP/1.1 403 bị cấm
Kết nối: giữ nguyên
Loại nội dung: ứng dụng/xml
Ngày: Thứ Hai, ngày 02 tháng 8 năm 2021 20:14:35 GMT
Máy chủ: AmazonS3
Mã hóa truyền: chunked
Qua: 1.1 c3e656776c8a9f0e1ea24405ab1dcc85.cloudfront.net (CloudFront)
X-Amz-Cf-Id: or4SC8urWEv_8c3jDURv5IINwFU1TDVLSQ3_X7tya7Ncz8ujyz0-IQ==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Lỗi từ cloudfront
vùng x-amz-xô: chúng tôi-đông-1

<?xml version="1.0" encoding="UTF-8"?>
<Lỗi>
  <Code>Truy cập bị từ chối</Code>
  <Message>Truy cập bị từ chối</Message>
  <RequestId>EAST1CM5WJR8QM3S</RequestId>
  <HostId>zF2dJm2vsuSM633NHuzcA5VqrCrNkfYGu31FRmKKIkebuI5+6l5DlVnr4kk9be262hcqktoiROw=</HostId>
</Lỗi>
  • (xml được định dạng để dễ đọc)

Điều đó không có vẻ tốt. Không chắc liệu điều đó có được mong đợi không?!?

Cập nhật bản ghi AWS Route 53

  • thay đổi từ sử dụng bộ chứa S3 sang sử dụng phân phối CloudFront
  • như trước đây, hãy tạo một tệp cục bộ tạm thời thay đổi-batch.apex.updatejson qua seding các tập tin trước đó thay đổi-batch.apex.json
  • sử dụng UPSERT thay vì TẠO RA: Bản ghi đã tồn tại và phải được cập nhật.
  • HostedZoneId: thay thế giá trị cũ Z3AQBSTGFYJSTF (đối với S3) bởi Z2FDTNDATAQYW2, một số giá trị kỳ diệu được lấy từ thay-đổi-tài-liệu-bộ tài liệu
  • Tên DNS: trích dẫn từ thay-đổi-tài-liệu-bộ tài liệu

Chỉ định tên miền mà CloudFront đã chỉ định khi bạn tạo bản phân phối của mình.

Bản phân phối CloudFront của bạn phải bao gồm một tên miền thay thế khớp với tên của bộ bản ghi tài nguyên. Ví dụ: nếu tên của tập hợp bản ghi tài nguyên là acme.example.com, thì bản phân phối CloudFront của bạn phải bao gồm acme.example.com làm một trong các tên miền thay thế.

-> thay thế s3-website-us-east-1.amazonaws.com (đối với S3) bởi abcdefghij1234.cloudfront.net:

sed -e 's|CREATE|UPSERT|g' \
    -e 's|Z3AQBSTGFYJSTF|Z2FDTNDATAQYW2|g' \
    -e 's|s3-website-us-east-1.amazonaws.com|abcdefghij1234.cloudfront.net|g' \
    change-batch.apex.json > change-batch.apex.update.json
  • nội dung tập tin:
{
  "Thay đổi": [
    {
      "Hành động": "UPSERT",
      "ResourceRecordSet": {
        "Tên": "mydomain01.com.",
        "Loại": "A",
        "Mục tiêu bí danh": {
          "HostedZoneId": "Z2FDTNDATAQYW2",
          "DNSName": "abcdefghij1234.cloudfront.net",
          "Đánh giá sức khỏe mục tiêu": sai
        }
      }
    }
  ]
}
  • lệnh vỏ
aws route53 thay đổi-resource-record-sets \
    --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.apex.update.json"
  • phản hồi tương tự như khi tạo bản ghi ở trên

kiểm tra bản ghi tên miền apex

  • kiểm tra http
http://mydomain01.com
HTTP/1.1 301 được di chuyển vĩnh viễn
Kết nối: giữ nguyên
Độ dài nội dung: 183
Loại nội dung: văn bản/html
Ngày: Thứ Hai, ngày 02 tháng 8 năm 2021 19:08:27 GMT
Vị trí: https://mydomain01.com/
Máy chủ: CloudFront
Qua: 1.1 2408979685aa1bdb752824d292e63bf7.cloudfront.net (CloudFront)
X-Amz-Cf-Id: Ww60Ol_0fdR8SsgcHeRYUd_de1rVejX6w_wuK80aR21e3IHstB-irA==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Chuyển hướng từ đám mây

<html>
<head><title>301 Đã di chuyển vĩnh viễn</title></head>
<body bgcolor="white">
<center><h1>301 Đã di chuyển vĩnh viễn</h1></center>
<hr><center>CloudFront</center>
</body>
</html>
  • phản hồi hiện đến từ CloudFront và không còn từ S3 nữa, do đó, bản ghi DNS được cập nhật dường như hoạt động :-)
  • kiểm tra http với một con đường
http http://mydomain01.com/some/path
 ... đầu ra tương tự như trên ...

--> có vẻ tốt

  • kiểm tra https
http://mydomain01.com
HTTP/1.1 403 bị cấm
Kết nối: giữ nguyên
Loại nội dung: ứng dụng/xml
Ngày: Thứ Hai, ngày 02 tháng 8 năm 2021 18:53:51 GMT
Máy chủ: AmazonS3
Mã hóa truyền: chunked
Qua: 1.1 ea89c67081222c8c680e7a37ad75f4f0.cloudfront.net (CloudFront)
X-Amz-Cf-Id: 5prv5_g5zXOX3aRBp2Gq64JJPuwC2o5dHIp9RCAHm6Ls8hK6EFghXw==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Lỗi từ cloudfront
vùng x-amz-xô: chúng tôi-đông-1

<?xml version="1.0" encoding="UTF-8"?>
<Lỗi>
  <Code>Truy cập bị từ chối</Code>
  <Message>Truy cập bị từ chối</Message>
  <RequestId>T78ASF3FA9QGV4T5</RequestId>
  <HostId>xaEgwEtbeesL4XfxMdxVoPAt9Lpb1ZDM9Fs5W4htBbcWNbV9sMUTjVAPIuWwAQ3Xh1yRhh4b4Ts=</HostId>
</Lỗi>
  • (như trước đây, định dạng xml để dễ đọc)

LƯU Ý: Phản hồi này đến từ AmazonS3, không phải từ CloudFront như cái trước. Bộ chứa S3 không có giới hạn truy cập nào tại chỗ - vậy làm sao có thể có truy cập bị từ chối ?!?

kiểm tra kỹ quyền truy cập nhóm

aws s3api get-bucket-policy --bucket mydomain01.com

Đã xảy ra lỗi (NoSuchBucketPolicy) khi gọi thao tác GetBucketPolicy: Chính sách bộ chứa không tồn tại

Phù hợp với chỗ trống Chính sách nhóm trường trong Bảng điều khiển AWS S3 - nhưng có thực sự ổn không khi không có chính sách bộ chứa nào cả?!?

Bây giờ nhìn lại phân phối thử nghiệm ở trên, tôi thấy rằng phản hồi để truy cập abcdefghij1234.cloudfront.net trực tiếp cũng đến từ S3, không phải từ CloudFront, vì vậy vấn đề có vẻ khá rõ ràng:

Câu hỏi của tôi #2

  1. Tại sao bộ chứa S3 từ chối quyền truy cập?
  2. Việc nhóm S3 hoàn toàn không có chính sách truy cập có phải là điều bình thường không? Thường không có chính sách nhóm "công khai" cho phép truy cập rõ ràng đối với bất kỳ ai?
  3. tương tự như một nhóm S3 trên mỗi apex/tên miền phụ, tôi có cần một bản phân phối CloudFront cho mỗi apex/miền phụ không?
  4. Nếu vậy, tôi đoán thêm *.mydomain01.com làm miền thay thế cho chứng chỉ (và phân phối) không thực sự có ý nghĩa gì, phải không?!? Tôi cũng cần một chứng chỉ cho mỗi bản phân phối, dành riêng cho một miền, đúng không?
Marcin avatar
lá cờ es
Bộ chứa của bạn cần ở chế độ công khai hoặc bạn cần sử dụng người dùng OAI để truy cập CF.
Điểm:1
lá cờ mx

Bạn đang đi đúng hướng nói chung. Chỉ một nhận xét: Có thể bỏ qua Route53 nếu miền của bạn đã sử dụng một số nhà cung cấp dịch vụ DNS khác.

Hỏi: Yêu cầu "bộ chứa tên == tên miền" có áp dụng ngay cả khi tôi sử dụng CloudFront không?

Không, nếu bạn sử dụng CloudFront. CNAME được định cấu hình riêng trong CloudFront.

Câu hỏi: Tôi có cần tạo một nhóm cho mỗi miền apex và mọi miền phụ không?

Không, bạn không cần một nhóm cho mỗi miền/miền phụ.

Tại sao bộ chứa S3 từ chối quyền truy cập?

Bạn nên sử dụng của bạn s3-website-us-east-1.amazonaws.com tên miền làm nguồn gốc CF.

Việc nhóm S3 hoàn toàn không có chính sách truy cập có phải là điều bình thường không? Thường không có chính sách nhóm "công khai" cho phép truy cập rõ ràng đối với bất kỳ ai?

Nếu bạn sử dụng bộ chứa chỉ để chuyển hướng lưu lượng truy cập, thì không có chính sách truy cập nào cũng được.

Tương tự như một bộ chứa S3 trên mỗi apex/miền phụ, tôi có cần một bản phân phối CloudFront cho mỗi apex/miền phụ không?

Có, bạn cần một bản phân phối CloudFront cho mỗi miền/miền phụ vì một bản phân phối có thể đính kèm tối đa một chứng chỉ ACM.

Nếu vậy, tôi đoán thêm *.mydomain01.com làm miền thay thế cho chứng chỉ (và phân phối) không thực sự có ý nghĩa gì, phải không?!? Tôi cũng cần một chứng chỉ cho mỗi bản phân phối, dành riêng cho một miền, đúng không?

Việc thêm miền ký tự đại diện có ý nghĩa vì bản phân phối CF cũng cần xử lý lưu lượng miền phụ.

Nếu bạn có bất kỳ câu hỏi nào khác, vui lòng tham gia Trò chuyện AWS và @ tôi trong cuộc trò chuyện.

lá cờ ar
Lưu ý, AWS Console UI auto khuyến nghị sử dụng định dạng `example.com.s3.us-east-1.amazonaws.com` thay vì định dạng `example.com.s3-website-us-east-1.amazonaws.com` tùy chỉnh như bài viết nói để sử dụng là tốt: https://aws.amazon.com/premiumsupport/knowledge-center/route-53-redirect-to-another-domain/ > Ghi lại điểm cuối của nhóm (example.com.s3-website-us-east-1.amazonaws.com). Bạn sẽ sử dụng thông tin này để định cấu hình tên miền gốc cho CloudFront trong tác vụ sau.
jellycsc avatar
lá cờ mx
@ Tony-Caffe Cuộc gọi tốt!

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.