亚马逊AWS官方博客

使用 CloudFront 的边缘计算能力动态打包渠道包

背景

应用推广渠道的日益增多,通过渠道包的方式分发应用程序的安装包文件,用户通过安装不同的渠道包,可以确定每一个推广渠道在转化中的贡献度的过程,用于衡量不同渠道的推广效果,满足多渠道的投放时数据归因的需要。

在传统的渠道包打包过程中,我们需要针对不同的渠道生成对应的渠道包并进行上传分发。使用 Amazon CloudFront 全球边缘节点的计算能力,支持在用户请求时动态为不同渠道生成安装包,大大简化了多渠道打包流程。相比传统的打包方式,它可以显著缩短打包时间,满足大规模多渠道推广的需求,同时利用 CloudFront 加速分发提高下载速度。

方案介绍

桌面端应用动态打包

桌面端通过访问带有相应渠道标识的 URL 进行访问,即可下载到同源文件的带有渠道标识的安装包,具体流程如下:

  1. 桌面端通过带有渠道标识的 URL 访问 CloudFront。
  2. CloudFront Functions 在查看器请求中,将 URL 重定向为不带有渠道标识的 URL。
  3. 使用不带有渠道标识的 URL 对源站发起请求,已经在 CloudFront Edge Cache 中缓存的情况下,直接返回内容。
  4. 客户端获得带有渠道标识的安装包。

安卓端应用动态打包

安卓端通过带有 key 和 channel 参数的 URL 进行访问,即可下载到拥有渠道签名的 APK 包,具体流程如下:

  1. CloudFront 将请求转发到 Amazon API Gateway,API Gateway 调用 Lambda 动态打包函数。
  2. Lambda 先判断在临时存放打包 APK 的 Amazon Simple Storage Service(S3)中是否已经有相应的内容,存在的情况下即返回相应下载链接地址。
  3. 在相应的 APK 包不存在的情况下,通过在存储原始 APK 包的位置找到动态打包的母包,使用 URL 的渠道参数进行处理,并上传到存放打包 APK 的 S3 中,返回相应的下载链接地址。
  4. 安卓端获得具有渠道标识的 APK 包。

部署指南

桌面端应用动态打包部署

点击链接 installer-distribution 在 AWS Serverless Application Repository 打开应用页面。输入存放下载包的 S3 存储桶名称,勾选确定该应用将创建相应的资源策略,点击 Deploy 按钮进行安装。

注意:存放下载包的 S3 存储桶必须已经创建。

安装完成后,你可以在 CloudFormation 的控制台页面中,选择对应的堆栈,并选中 Outputs 查看到相应的 CloudFront 域名。

在浏览器中输入 https://<your-cloudfront-domain>/test_channel.exe 进行下载测试。

注意:使用您查看到的 CloudFront 域名代替<your-cloudfront-domain>,在 S3 存储桶中需要存在 test.exe 文件。

(可选)根据需要调整 CloudFront Functions 中的正则表达式。

在 CloudFront 控制台页面中,选择 Functions 并选中 ReURL-Function 函数。修改 Function code 中的代码,针对需要转换访问的 URL 为源站的 URL。

在修改完并测试通过后,在页面的 Publish 选项卡中,点击 Publish function 按钮即可发布。

安卓端应用动态打包部署

点击链接 apk-distribution 在 AWS Serverless Application Repository 打开应用页面。输入存放下载包的 S3 存储桶名称,勾选确定该应用将创建相应的资源策略,点击 Deploy 按钮进行安装。

注意:存放 APK 包的 S3 存储桶必须已经创建。对访问链接进行签名验证的情况下需要填写 APPkey,具体参考项目 GitHub – turmind/apk-distribution

安装完成后,你可以在 CloudFormation 的控制台页面中,选择对应的堆栈,并选中 Outputs 查看到相应的 CloudFront 域名。

在浏览器中输入 https://<your-cloudfront-domain>?key=test.apk&channel=aws 进行下载测试。

注意:使用您查看到的 CloudFront 域名代替<your-cloudfront-domain>,在 S3 存储桶中需要存在 test.apk 文件。

运行以下命令查看 APK 包中的渠道信息,walle-cli-all.jar 在该链接中进行下载。

java -jar walle-cli-all.jar show test_aws.apk

清理环境

为避免产生不必要的费用,在 CloudFormation 的 Stacks 中,选择对应的堆栈进行并点击 Delete

总结

在这篇文章中,您通过在 Serverless Application Repository 中安装应用,实现对桌面端应用及安卓端应用进行动态打包并利用 CloudFront 对内容进行加速分发。这让您在应用推广的时候,能够快速分发到不同渠道中,并为后续数据归因的需要提供基础功能。

深蓝互动在新游戏《重返未来 1999》的推广期间,使用了 installer-distribution 生成随机 URL 指向同一个安装包文件,用于跟踪不同渠道用户的下载和使用行为。通过在 URL 中嵌入唯一 ID,可以将用户与谷歌广告等推广渠道建立关联,从而计算推广转换率和用户行为数据。这种方式避免了为不同渠道打包并分发不同安装包的复杂度,简化了深蓝互动的发布和运营流程。同时利用 CloudFront 加速了安装包下载速度,提升了用户体验。相比自建分发服务,使用无服务器的 installer-distribution 不仅降低了开发和运维成本,还让深蓝互动能更专注于游戏本身的品质提升。

参考资料

walle: https://github.com/Meituan-Dianping/walle

本篇作者

黄际东

AWS 解决方案架构师,有过银行、旅游、直播、教育等行业的十多年项目经验。曾独立主导实现从零到千万用户级别的教育类应用,也参与研发过月活跃用户过千万的全球知名直播平台。在互联网领域拥有多年的研发及运维经验,是一个喜欢编程的解决方案架构师。

蔡文健

广州深蓝互动运维总监,DevOps 领域先行者,负责深蓝游戏技术支撑体系的设计和建设,结合微服务、云、大数据等理念及前沿技术,实现研发、运维、运营一体化,助力运维团队的转型升级,推动了公司 DevOps 智能化运维的落地。