AWS CLIcloudtrail create-subscription命令详解:一键创建 S3、SNS 与 CloudTrail 追踪
【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli
导读
aws cloudtrail create-subscription是 AWS CLI 为 CloudTrail 提供的高层级封装命令,它把「创建 S3 存储桶 → 创建 SNS 主题 → 创建 Trail → 开启日志记录」这一系列原本需要多次调用的底层 API 操作合并为一条命令,自动完成资源准备、策略配置与回滚清理。本文以官方示例文档 create-subscription.rst 为骨架,结合仓库中 subscribe.py 的完整实现,讲解该命令的全部参数、执行流程、输出含义,以及它与create-trail、update-subscription等命令的差异,帮助你快速落地 CloudTrail 审计日志的基础设施。
命令概览:一条命令完成 CloudTrail 全流程开通
CloudTrail 的核心功能是把账号内 API 活动记录为日志文件并投递到 S3,可选地通过 SNS 主题进行通知。要启用一条 Trail,传统方式需要依次完成:创建 S3 存储桶 → 配置桶策略(允许 CloudTrail 写入)→ 创建 SNS 主题(可选)→ 配置主题策略 → 调用CreateTrail→ 调用StartLogging。
create-subscription把上述步骤全部内聚为一条命令。官方示例(create-subscription.rst)如下:
aws cloudtrail create-subscription \ --name Trail1 \ --s3-new-bucket amzn-s3-demo-bucket \ --sns-new-topic my-topic命令执行后,控制台会依次输出:
Setting up new S3 bucket amzn-s3-demo-bucket... Setting up new SNS topic my-topic... Creating/updating CloudTrail configuration... CloudTrail configuration: { "trailList": [ { "IncludeGlobalServiceEvents": true, "Name": "Trail1", "TrailARN": "arn:aws:cloudtrail:us-east-1:123456789012:trail/Trail1", "LogFileValidationEnabled": false, "IsMultiRegionTrail": false, "S3BucketName": "amzn-s3-demo-bucket", "SnsTopicName": "my-topic", "HomeRegion": "us-east-1" } ], "ResponseMetadata": { "HTTPStatusCode": 200, "RequestId": "f39e51f6-c615-11e5-85bd-d35ca21ee3e2" } } Starting CloudTrail service... Logs will be delivered to my-bucket从输出可以清晰地看到该命令的五个阶段:建桶 → 建主题 → 写 Trail 配置 → 打印配置 → 启动日志记录,这五步与源码中_call方法的调用顺序完全对应(详见下文「底层实现」一节)。
参数详解:完整参数表与取值约束
示例文档只展示了--name、--s3-new-bucket、--sns-new-topic三个参数,但该命令实际支持的参数远不止于此。在 subscribe.py 的ARG_TABLE中定义了完整的 8 个参数:
| 参数 | 是否必填 | 说明 |
|---|---|---|
--name | 必填 | CloudTrail 追踪(Trail)名称 |
--s3-new-bucket | 二选一 | 创建新S3 存储桶(名称需全局唯一) |
--s3-use-bucket | 二选一 | 复用已有S3 存储桶 |
--s3-prefix | 可选 | S3 对象键前缀,日志将写入bucket/prefix/路径下 |
--sns-new-topic | 可选 | 创建新的 SNS 主题,用于日志投递通知 |
--include-global-service-events | 可选 | 是否记录全局服务事件,取值只能是true或false |
--s3-custom-policy | 可选 | 自定义 S3 桶策略(JSON 或策略模板 URL),替代自动生成的策略 |
--sns-custom-policy | 可选 | 自定义 SNS 主题策略(JSON 或策略模板 URL),替代自动生成的策略 |
其中几个关键约束来自源码逻辑:
- 存储桶必须二选一。在
_call中,如果既没有传--s3-use-bucket也没有传--s3-new-bucket,会直接抛出ValueError: You must pass either --s3-use-bucket or --s3-new-bucket to create.(见 subscribe.py)。 --s3-new-bucket优先级高于--s3-use-bucket。源码先取options.s3_use_bucket,若同时指定了--s3-new-bucket则将其覆盖为最终 bucket 名称。--include-global-service-events只接受true/false。源码对传入值做大小写不敏感比较,传入其他值会抛出ValueError: You must pass either true or false to --include-global-service-events.。- 同名字段(name)在 AWS CLI 参数中写作
--name,而对应底层 API 字段为Name;映射工作由参数解析层完成。
底层实现:五步流水线与自动回滚
create-subscription并非 CloudTrail 的原生 API,而是 AWS CLI 注入的高层级命令。在 cloudtrail/init.py 中可以看到,CLI 构建 CloudTrail 命令表时,将CloudTrailSubscribe实例注入为create-subscription,同时注入update-subscription(CloudTrailUpdate)和validate-logs(CloudTrailValidateLogs)。CloudTrailSubscribe的类注释将其职责概括为:订阅/更新账号到 CloudTrail,创建必需的 S3 桶、可选的 SNS 主题,并启动 CloudTrail 监控与日志记录。
整个执行流程对应 subscribe.py 中的以下方法调用链:
setup_services(第 71-92 行):基于会话创建 STS、S3、SNS 三个嵌套客户端,并解析--region、--verify-ssl、--endpoint-url等全局参数传给相应服务;CloudTrail 客户端单独创建。注意源码注释特别说明:若指定了 endpoint URL,它只作用于 CloudTrail 服务,其他服务仍走默认端点。setup_new_bucket(第 182-232 行):创建 S3 存储桶并写入允许 CloudTrail 写入的桶策略。实现细节包括:- 通过
get_account_id(self.sts)(见 utils.py)调用 STSGetCallerIdentity获取当前账号 ID; - 若指定了
--s3-prefix,自动补全尾部斜杠(prefix += '/'); - 策略默认从
awscloudtrail-policy-<region>桶下载官方模板(AWSCloudTrail-S3BucketPolicy-2014-12-17.json),并将<BucketName>、<CustomerAccountID>、<Prefix>占位符替换为实际值;若传了--s3-custom-policy则直接使用自定义策略; - 桶已存在时报错;创建桶后写策略失败会自动删除桶(回滚);
- 非
us-east-1区域创建桶时会带上CreateBucketConfiguration.LocationConstraint,符合 S3 的区域约束要求。
- 通过
setup_new_topic(第 234-291 行):创建 SNS 主题。会先list_topics检查重名(缺少 ListTopics 权限时仅告警不中断),下载官方 SNS 主题策略模板AWSCloudTrail-SnsTopicPolicy-2014-12-17.json,替换<Region>、<SNSTopicOwnerAccountId>、<SNSTopicName>占位符,并通过merge_sns_policy将 CloudTrail 授权语句合并进主题现有策略中,最后写入主题属性。upsert_cloudtrail_config(第 313-334 行):拼接Name、S3BucketName、S3KeyPrefix、SnsTopicName、IncludeGlobalServiceEvents等字段后调用create_trail(创建模式)或update_trail(更新模式),随后调用describe_trails返回最新配置并打印。start_cloudtrail(第 336-341 行):调用start_logging启动日志投递,最终打印Logs will be delivered to <bucket>:<prefix>。
值得强调的是回滚机制:创建 SNS 主题失败时,会删除已新建的 S3 桶;写 Trail 配置失败时,会同时删除新建的 S3 桶和 SNS 主题(见第 133-157 行)。这意味着create-subscription在任一步骤失败时都会尽量把账号状态恢复原状,避免留下半成品资源。
以上流程在仓库中有对应的单元测试覆盖,可参考 tests/unit/customizations/cloudtrail/test_subscribe.py,测试中验证了参数校验、桶/主题创建、策略替换以及回滚行为等关键路径。
输出字段解读
命令最终打印的 JSON 是describe_trails的返回结构,其中核心字段含义如下:
| 字段 | 含义 |
|---|---|
Name | Trail 名称(示例中为Trail1) |
TrailARN | Trail 的 ARN,格式为arn:aws:cloudtrail:<region>:<account-id>:trail/<name> |
S3BucketName | 日志投递目标存储桶 |
SnsTopicName | 关联的 SNS 主题名称(未配置则不出现) |
IncludeGlobalServiceEvents | 是否记录 IAM 等全局服务事件,示例为true |
IsMultiRegionTrail | 是否为多区域 Trail,create-subscription创建的单区域 Trail 为false |
LogFileValidationEnabled | 是否开启日志文件完整性校验,默认false |
HomeRegion | Trail 的归属区域 |
S3KeyPrefix、KmsKeyId、CloudWatchLogsLogGroupArn等字段在配置了前缀、KMS 加密或 CloudWatch Logs 投递后才会出现在输出中,可参考 describe-trails.rst 中更完整的返回示例。
与其他命令的关系与选型建议
create-subscriptionvscreate-trail:create-trail(见 create-trail.rst)直接调用底层CreateTrailAPI,只负责创建 Trail 配置本身,不会自动建桶、建主题,也不会自动开启日志记录,适合资源已就绪、需要精细控制的场景;create-subscription则适合从零开始、追求「一条命令开通」的场景。create-subscriptionvsupdate-subscription:两者共用CloudTrailSubscribe基类,仅通过UPDATE标志区分(见 subscribe.py)。update-subscription可更新既有 Trail 的桶、主题等配置;一个值得注意的细节是,更新模式下若不传--s3-prefix,源码会自动从describe_trails中读取既有S3KeyPrefix继续沿用(第 114-124 行)。官方示例见 update-subscription.rst。- 后续运维:日志记录开启后,可用
start-logging/stop-logging控制启停,用get-trail-status查看投递状态,用validate-logs(仓库中同目录下的CloudTrailValidateLogs实现)校验日志文件的完整性与真实性,相关示例均位于 examples/cloudtrail 目录下。
小结
aws cloudtrail create-subscription是 AWS CLI 中少见的「多服务编排型」高层命令:一条命令串起 STS、S3、SNS、CloudTrail 四个服务,自动完成建桶、策略注入、主题配置、Trail 创建与日志启动,并内建失败回滚。理解其参数语义(尤其是--s3-use-bucket/--s3-new-bucket二选一约束与--include-global-service-events的取值限制)和 subscribe.py 背后的执行流水线,可以帮助你在自动化脚本与 CI 流程中安全、高效地开通 CloudTrail 审计能力。
【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考