Hướng dẫn cấu hình Universal Link trên AWS S3 + CloudFront với OAC và CloudFront Function Chuyên mục Devops 2025-06-05 5 Lượt xem 5 Lượt thích 0 Bình luận
Universal Link là cách tối ưu nhất để liên kết web và app iOS/Android một cách mượt mà, giúp app có thể mở trực tiếp các URL nhất định, hoặc fallback về trang tải app nếu chưa cài. Để làm được điều này với domain riêng, bạn cần chuẩn bị file cấu hình trên server để các hệ điều hành xác thực link của bạn, và đồng thời xử lý chuyển hướng (redirect) linh hoạt tùy nền tảng người dùng.
Bài viết này sẽ hướng dẫn bạn:
-
Tại sao nên dùng AWS S3 + CloudFront để lưu trữ file cấu hình Universal Link (apple-app-site-association & assetlinks.json)
-
Cách cấu hình Origin Access Control (OAC) để CloudFront có quyền đọc file từ S3 một cách bảo mật
-
Cách viết và triển khai CloudFront Function để xử lý redirect thông minh theo thiết bị, thay vì phải dùng Lambda@Edge
1. Giới thiệu Universal Link và các file quan trọng
File apple-app-site-association (AASA)
Đây là file JSON KHÔNG có đuôi .json, được đặt trong thư mục .well-known của domain bạn, dùng để định nghĩa app iOS nào được phép mở link nào. Ví dụ:
{
"applinks": {
"details": [
{
"appID": "ABCXYZ.jp.yourdomain.user.dev",
"paths": [ "/user/*" ]
},
{
"appID": "ABCXYZ.jp.yourdomain.performer.dev",
"paths": [ "/performer/*" ]
}
]
}
}
File assetlinks.json
File này dùng cho Android App Link, nằm tại .well-known/assetlinks.json trên domain, định nghĩa app Android nào được phép xử lý link.
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "jp.yourdomain.user.dev",
"sha256_cert_fingerprints": ["YOUR_CERT_FINGERPRINT_HERE"]
}
},
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "jp.yourdomain.performer.dev",
"sha256_cert_fingerprints": ["YOUR_CERT_FINGERPRINT_HERE"]
}
}]
2. Tại sao dùng AWS S3 + CloudFront?
-
S3: Là nơi lưu trữ file tĩnh, dễ dàng quản lý và cập nhật file AASA, assetlinks.json.
-
CloudFront: Giúp phân phối file nhanh, giảm độ trễ trên toàn cầu, hỗ trợ HTTPS và custom domain.
-
Bảo mật: Dùng Origin Access Control (OAC) để CloudFront có quyền truy cập vào bucket S3 mà không công khai bucket cho tất cả mọi người.
-
Chức năng xử lý request: CloudFront Function cho phép xử lý, redirect request ngay tại edge location, cực kỳ nhanh và tiết kiệm chi phí hơn Lambda@Edge.
3. Cấu hình Origin Access Control (OAC)
OAC là một phương thức mới (thay cho Origin Access Identity) cho phép CloudFront truy cập S3 một cách bảo mật, không cần bucket public.
Các bước:
-
Tạo OAC trong AWS Console
-
Gán OAC này cho Origin của bạn trong distribution CloudFront
-
Cập nhật bucket policy để chỉ cho phép OAC này đọc bucket (hoặc thư mục .well-known/*)
Ví dụ policy snippet:
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Control YOUR_OAC_ID"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket/.well-known/*"
}
4. Viết CloudFront Function xử lý Redirect theo thiết bị
Thay vì phải dùng Lambda@Edge phức tạp, CloudFront Function là lựa chọn nhẹ, nhanh, chi phí thấp cho xử lý request tại edge.
Ví dụ function:
function handler(event) {
var request = event.request;
var uri = request.uri;
var headers = request.headers;
var userAgent = (headers['user-agent'] && headers['user-agent'].value) || '';
var querystring = request.querystring || '';
function redirect(url) {
return {
statusCode: 302,
statusDescription: 'Found',
headers: {
location: { value: url }
}
};
}
if (uri === '/user/verify') {
if (userAgent.match(/iPhone|iPad|iPod/i)) {
return redirect('https://apps.apple.com/app/id284882215' + (querystring ? '?' + querystring : ''));
}
if (userAgent.match(/Android/i)) {
return redirect('https://play.google.com/store/apps/details?id=jp.believestar.user.dev' + (querystring ? '?' + querystring : ''));
}
return redirect('https://yourdomain.com/user-landing' + (querystring ? '?' + querystring : ''));
}
if (uri === '/performer/verify') {
if (userAgent.match(/iPhone|iPad|iPod/i)) {
return redirect('https://apps.apple.com/app/id456789123' + (querystring ? '?' + querystring : ''));
}
if (userAgent.match(/Android/i)) {
return redirect('https://play.google.com/store/apps/details?id=jp.believestar.performer.dev' + (querystring ? '?' + querystring : ''));
}
return redirect('https://yourdomain.com/performer-landing' + (querystring ? '?' + querystring : ''));
}
return request;
}
Triển khai
-
Tạo CloudFront Function, dán code trên vào.
-
Publish function.
-
Gán function vào CloudFront distribution ở event Viewer Request.
-
Đợi deploy xong rồi test.
5. Lợi ích khi dùng CloudFront Function & OAC
-
Bảo mật: S3 bucket không cần public, chỉ CloudFront mới có quyền truy cập qua OAC.
-
Hiệu năng: CloudFront Function chạy ngay tại edge location, cực kỳ nhanh và nhẹ.
-
Chi phí thấp: Rẻ hơn Lambda@Edge rất nhiều, phù hợp cho xử lý redirect đơn giản.
-
Dễ quản lý: Mã redirect được giữ tập trung, chỉnh sửa nhanh mà không phải deploy app backend.
Kết luận
Với sự kết hợp của AWS S3 + CloudFront cùng OAC và CloudFront Function, bạn có thể:
-
Phân phối file apple-app-site-association và assetlinks.json chuẩn xác cho Universal Link.
-
Tự động xử lý redirect người dùng theo thiết bị, dẫn đến app store hoặc trang web fallback.
-
Đảm bảo bảo mật bucket S3, tối ưu hiệu năng toàn cầu và tiết kiệm chi phí vận hành.
Hãy áp dụng ngay cho dự án của bạn để nâng tầm trải nghiệm người dùng trên mobile và desktop!
Bình luận (0)