PPCWISER 琼仁智度 LogoPPCWISER琼仁智度
AWS + Marketing Stream 教程 · 第 2/5 步

第 2 步:用官方模板,为 4 个数据集建好 S3 + Firehose

亚马逊官方提供了一份 CloudFormation 模板:选好数据集、填个桶名,它就把 S3 桶、Firehose 流和订阅所需的 3 个 IAM 角色一次建好,而且默认不压缩、按 year= / month= / day= 分区——正好是琼仁智度读取需要的格式。4 个数据集各跑一次即可。

30 天免费试用¥99/月/店铺起凭证只存你自己的电脑
先规划好名字

4 个堆栈怎么填:建议命名表

把 yourshop 换成你的店铺或品牌缩写。桶名须全部小写,并且不能与任何人的桶重名。

数据集(StreamDatasetId)Stack nameS3Storage(新桶名)StreamDestinationFirehose(顶层目录名)StreamRealm
sp-trafficams-na-sp-trafficyourshop-ams-sp-trafficsp-traffic-naNA
sp-conversionams-na-sp-conversionyourshop-ams-sp-conversionsp-conversion-naNA
sb-trafficams-na-sb-trafficyourshop-ams-sb-trafficsb-traffic-naNA
sb-conversionams-na-sb-conversionyourshop-ams-sb-conversionsb-conversion-naNA

S3 桶名只能用小写字母、数字、点和连字符,3–63 个字符 [5];模板参数本身允许大写,但 S3 不接受 [2]。顶层目录名里只写本数据集的名字,不要混写其他数据集名。

分步演示

跟着动画创建 sp-traffic 堆栈(其余 3 个照做)

字段名以 AWS 英文控制台为准。点左侧任一步可单独查看。

示意动画,界面文字可能随 AWS 改版变化,以 AWS 控制台为准。
图文步骤

用官方模板配置 Firehose + S3:详细步骤

在控制台右上角选 us-east-1

控制台右上角 → US East (N. Virginia)

必须先登录到与广告区域对应的 AWS 区域,北美(NA)是 us-east-1 [1]。模板内置区域校验,不一致会直接失败 [2]。

从亚马逊官方 GitHub 下载模板

github.com/amzn/ads-advanced-tools-docs → amazon_marketing_stream

下载 Stream_Firehose_CF_Template.yaml [2]。它只支持 S3 输出,每次部署创建 1 个 S3 桶、1 个 Firehose 流和 3 个 IAM 角色 [1],外加 1 个保留 30 天的错误日志组 [2]。

新建堆栈,上传模板文件

CloudFormation → Stacks → Create stack → With new resources (standard)

Prerequisite 选 Choose an existing template,Specify template 选 Upload a template file,选中刚下载的文件后点 Next [6]。

填写 4 个参数

Specify stack details → Parameters

按上方命名表填写 S3Storage、StreamDatasetId、StreamDestinationFirehose、StreamRealm [1]。StreamDestinationFirehose 会成为桶根下的顶层目录名,也是 Firehose 流名称的一部分 [2]。

勾选 IAM 确认并提交

Review and create → Capabilities → Submit

勾选“允许 CloudFormation 创建带自定义名称的 IAM 资源”后提交 [1][6]。在 Events 标签等待 CREATE_COMPLETE。

4 个数据集各重复一次

CloudFormation → Create stack

sp-conversion、sb-traffic、sb-conversion 各用不同的桶名与目录名。每个数据集都要单独建、单独订阅。

整理 12 个 ARN

Stacks → 选中堆栈 → Outputs;Amazon Data Firehose → Firehose streams

订阅时每个数据集需要 3 个 ARN:Firehose 流 ARN(在 Firehose 控制台选中流复制),后缀为 -FirehoseSubscriptionRole 与 -FirehoseSubscriberRole 的两个 IAM 角色 ARN [7]。

为每个桶设置生命周期规则

S3 → General purpose buckets → 选桶 → Management → Create lifecycle rule

勾选 Expire current versions of objects,填写对象创建后天数 [4]。规则对已有和新增对象都生效,删除异步进行,但到期后即不再计存储费 [4][8]。建议 30–90 天,留足中转离线后补同步的余量(运维建议)。

备选:手动创建

不用模板、手动建 Firehose?这些设置填错,系统就读不到

官方强烈建议输出到 S3 时使用模板 [10]。如果你坚持手动创建,下表以 sp-traffic 为例,其余数据集把目录名换掉即可。

设置项必须这样填依据
Source / DestinationDirect PUT / Amazon S3[9][10]
Firehose stream name含数据集名,如 NA-sp-traffic-stream文件名以流名称开头 [11]
S3 bucket prefixsp-traffic-na/year=!{timestamp:yyyy}/month=!{timestamp:MM}/day=!{timestamp:dd}/hour=!{timestamp:HH}/官方示例就是这种格式 [12];不填则默认 YYYY/MM/dd/HH,系统找不到 [11]
S3 bucket error output prefixsp-traffic-na-error/!{firehose:error-output-type}/year=!{timestamp:yyyy}/month=!{timestamp:MM}/day=!{timestamp:dd}/前缀含表达式时必须填,且必须含 error-output-type [12]
前缀时区保持默认 UTC[11]
Buffer size / interval5 MiB / 300 秒(默认值)与官方模板一致 [13][2]
Compression for data records不压缩(不要选 GZIP、Snappy、Zip)琼仁智度不解压压缩文件 [13][14]
记录转换 / 格式转换保持关闭(不转 Parquet/ORC、不接 Lambda)系统按 JSON 文本读取
S3 file extension format留空填写会覆盖默认扩展名 [11]
Service access(IAM 角色)让控制台新建角色[15]
订阅角色、订阅者角色严格照官方《手动设置》页逐项创建涉及亚马逊固定账号与按数据集区分的 SNS 资源 [10]
注意事项

3 个容易忽略的隐患

① 官方模板年份写的是大写 YYYY,年末年初可能落到相邻年份目录官方模板的前缀用 year=!{timestamp:YYYY} [2],而 AWS 文档示例用小写 yyyy [12]。按 Java 日期格式定义,小写 y 是日历年,大写 Y 是按周计算的年份 [16],两者在每年最后几天或年初几天可能不同,个别文件可能落进相邻年份的 year= 目录(推断,未实测)。手动创建请一律用小写 yyyy;用官方模板的,如在跨年前后发现个别日期缺数,请联系顾问排查。
② 一个桶只放一个广告账户(profile)的数据系统按桶读取,桶里有什么就读什么。只为本店的美国站 profile 订阅;你的加拿大站、墨西哥站或另一家店铺,都要另建一套,不能订阅到同一个 Firehose。
③ 多店铺建议每店一个 AWS 账号官方模板里的 IAM 角色名按“区域-数据集”固定 [2],同一账号同一区域为同一数据集重复部署,可能因角色重名而失败(推断)。每家店铺使用独立的 AWS 账号最省事,也与 一店一机一出口 的隔离原则一致。

建 S3 与 Firehose 的常见问题

堆栈创建失败、状态变成 ROLLBACK,怎么排查?
先看堆栈的 Events 标签里最早出现的失败原因 [6]。常见的有:控制台区域与 StreamRealm 不一致(模板会拒绝)[2];桶名含大写或已被他人占用 [5];同名桶已存在,或同一数据集在本账号本区域已部署过、IAM 角色重名(推断)。修正后删除失败的堆栈重新创建。
为什么一定不能压缩?压缩不是更省钱吗?
琼仁智度读取时不解压 gzip 等压缩文件,压缩后的数据读不出来。官方模板默认就是不压缩 [2]。存储费用建议用生命周期规则控制 [4]。
4 个数据集能放同一个桶吗?
官方模板是一个数据集一个桶,照做最简单。手动创建时可以共用一个桶,但每个数据集必须用不同的顶层目录,并在中转客户端勾选“对所有数据类型使用相同的存储桶”、为每个数据集分别填写前缀。
桶要不要打开公共访问?
不要。新建的桶默认阻止公共访问、默认使用 SSE-S3 加密 [17],保持默认即可。系统通过你在第 4 步创建的只读密钥访问。
生命周期规则会不会把还没同步的数据删掉?
只要天数留足就不会。中转客户端会持续把新文件同步走,离线期间没取到的文件回线后会补取。注意未开版本控制的桶里,到期对象会被异步删除且不可恢复 [8],所以天数不要设得太短。
模板建出来的 CloudWatch 日志组可以删吗?
不要删。它记录 Firehose 投递到 S3 的错误,排障时要用;模板设置了保留 30 天 [2]。

桶和 Firehose 建好,下一步订阅 4 个数据集

订阅需要 Amazon Ads API 凭证:可按教程自行申请,也可以请我们协助(¥499/次)。PPCWISER 琼仁智度 30 天免费试用。

入门版 ¥99/月/店铺 · 含 10 个产品 · 每增加 1 个产品 +¥10/月
继续了解

相关功能

AWS 教程

AWS 小时级数据

5 步把亚马逊小时级广告数据接进你自己的 AWS,再交给中转客户端只读读取。

查看 →
AWS 教程 · 1/5

注册 AWS 账号

advanced 方式注册全球区账号、选 Paid 计划、根用户开 MFA、不建根用户密钥。

查看 →
AWS 教程 · 3/5

订阅 4 个数据集

为本店 profile 调 4 次订阅接口,填 3 个 ARN,Firehose 无需确认,ACTIVE 即成功。

查看 →
AWS 教程 · 5/5

验证与排障

S3 里看到分区文件 → 中转填区域、桶名、前缀与密钥 → 报错对照表排障。

查看 →
多店铺

一店一机一出口

一台电脑只服务一家店,两家店共用公网出口时系统拒绝接入。

查看 →
时段与版位

168 时段分时出价

按 168 个时段的出单证据算时段加价,自动写成亚马逊官方时段规则。

查看 →
REFERENCES

参考资料与权威来源

本页所有涉及亚马逊规则、行业数据与方法论的表述均标注来源。链接指向官方文档、同行评审论文、专利或法律法规原文;访问日期 2026-09。

  1. [1]官方Amazon Data Firehose getting started guide — Amazon Ads · 2026官方 CloudFormation 模板只支持 S3 输出,会自动创建 1 个 S3 桶、1 个 Firehose 流和 3 个 IAM 角色;开始前须登录到与广告区域对应的 AWS 区域(NA 为 us-east-1);提交前须勾选允许创建带自定义名称的 IAM 资源。
  2. [2]官方amzn/ads-advanced-tools-docs · amazon_marketing_stream(Stream_Firehose_CF_Template.yaml) — Amazon(GitHub) · 2025官方模板参数为 S3Storage、StreamDatasetId、StreamDestinationFirehose、StreamRealm;Firehose 为 Direct PUT、缓冲 5MB/300 秒、不压缩,前缀为“目录名/year=/month=/day=/hour=/”(年份占位符写作大写 YYYY);区域与 StreamRealm 不一致时拒绝创建;另建一个保留 30 天的错误日志组。
  3. [3]官方Amazon Marketing Stream and Data Firehose FAQ — Amazon Ads · 2026Firehose 与 SQS 一样至少投递一次、可能重复且不保证顺序;输出到 S3 时强烈建议用 CloudFormation 模板;Marketing Stream 不支持回填历史数据;费用建议用 AWS 价格计算器按自身情况估算;停用订阅是把状态改为 ARCHIVED。
  4. [4]官方Setting an S3 Lifecycle configuration on a bucket — AWS · 2026控制台:General purpose buckets→选桶→Management→Create lifecycle rule→选择范围→Expire current versions of objects→填写对象创建后的天数;规则对已有和新增对象都生效;删除异步进行可能延后,但计费在规则满足时即变化。
  5. [5]官方General purpose bucket naming rules — AWS · 2026桶名 3–63 个字符,只能用小写字母、数字、点和连字符,须以字母或数字开头和结尾,在同一分区内不能与任何账户的桶重名;桶名会出现在 URL 中,不要包含敏感信息。
  6. [6]官方Create a stack from the CloudFormation console — AWS · 2026先在导航栏选区域→Stacks→Create stack→With new resources (standard)→Choose an existing template→Upload a template file→填写堆栈名称与参数→配置选项→确认可能创建 IAM 资源→Submit;创建进度在 Events 标签查看。
  7. [7]官方Subscribing to Amazon Marketing Stream datasets — Amazon Ads · 2026SP/SB 数据集用 POST /streams/subscriptions 订阅,请求头为 ClientId、Scope(profile ID)、Authorization 与指定的 Content-Type;请求体含 dataSetId、clientRequestToken 以及 destination.firehoseDestination 下的三个 ARN;为多个 profile 订阅须分别调用。
  8. [8]官方Expiring objects — AWS · 2026未开启版本控制的桶中,对象到期后会被排队异步删除且不可恢复;到期后的存储时间不再计费。
  9. [9]官方Choose source and destination for your Firehose stream — AWS · 2026Firehose 控制台→Create Firehose stream→来源选 Direct PUT→目的地选 Amazon S3→填写 Firehose stream name。
  10. [10]官方Setting up Amazon Data Firehose manually — Amazon Ads · 2026手动方式需依次创建 Firehose 流(来源 Direct PUT)、FIREHOSE_SUBSCRIPTION_ROLE 与 FIREHOSE_SUBSCRIBER_ROLE;除非输出到 S3 以外的目的地,官方强烈建议改用 CloudFormation 模板。
  11. [11]官方Configure Amazon S3 object name format — AWS · 2026对象键 = 前缀 + “流名称-流版本-年-月-日-时-分-秒-uuid”;不自定义时默认前缀为 YYYY/MM/dd/HH,时区默认 UTC;流配置每修改一次版本号加 1;指定文件扩展名会覆盖默认扩展名。
  12. [12]官方Understand custom prefixes for Amazon S3 objects — AWS · 2026自定义前缀可用 !{timestamp:yyyy} 等表达式(遵循 Java DateTimeFormatter),时间取记录的大致到达时间、默认 UTC;前缀含表达式时必须设置含 !{firehose:error-output-type} 的错误输出前缀;官方示例即 year=/month=/day=/hour= 形式。
  13. [13]官方Configure backup settings · Configure buffering hints — AWS · 2026S3 目的地的缓冲大小为 1–128 MB(默认 5)、缓冲间隔 0–900 秒(默认 300),先满足的条件触发投递;S3 压缩可选 GZIP 等或不压缩。
  14. [14]官方Configure destination settings(Amazon Data Firehose) — AWS · 2026S3 目的地可设置桶、自定义前缀、错误输出前缀、前缀时区、文件扩展名与压缩方式等。
  15. [15]官方Configure advanced settings(Amazon Data Firehose) — AWS · 2026Firehose 通过 IAM 角色访问 S3 等服务,控制台可新建自动分配所需权限的角色;官方强烈建议创建时开启错误日志。
  16. [16]官方DateTimeFormatter (Java Platform SE 8) — Oracle · 2026日期格式模式中,小写 y 表示纪年年份(year-of-era),大写 Y 表示按周计算的年份(week-based-year)。
  17. [17]官方Creating a general purpose bucket — AWS · 2026桶创建后不能修改名称和区域;新桶默认阻止公共访问、默认使用 SSE-S3 加密、默认不开启版本控制。