如何让AWS SageMaker批量转换使用目标S3桶默认KMS密钥?
解决SageMaker批量转换输出强制使用目标S3桶默认KMS密钥的问题
问题原因
SageMaker批量转换任务默认会使用执行该任务的IAM角色所属账号的KMS密钥(即源账号密钥)加密输出对象,即使目标S3桶已配置默认加密,也不会自动触发桶的默认加密规则,导致跨账号下载时因无权限访问源账号KMS密钥而报错。
解决方案
方案一:在Transformer中显式指定目标桶的默认KMS密钥
直接在Transformer初始化时添加output_kms_key参数,指定目标S3桶默认配置的KMS密钥ARN,强制SageMaker用该密钥加密输出。
修改后的代码:
batch_output_path= f"s3://test_bucket/folder" # 替换为目标账号test_bucket的默认KMS密钥ARN TARGET_KMS_KEY_ARN = "arn:aws:kms:区域ID:目标账号ID:key/密钥UUID" from sagemaker.transformer import Transformer transformer = Transformer( model_name=step_create_model.properties.ModelName, instance_type="ml.c5.xlarge", instance_count=1, strategy='MultiRecord', assemble_with='Line', max_payload=1, max_concurrent_transforms=10, output_path=batch_output_path, output_kms_key=TARGET_KMS_KEY_ARN, # 新增:指定目标KMS密钥 sagemaker_session=pipeline_session )
权限配置要求:
- 目标账号的KMS密钥策略需添加源账号SageMaker执行角色的ARN,允许以下权限:
kms:GenerateDataKey(用于加密输出对象)kms:Decrypt(若后续需要读取输出对象)
- 源账号的SageMaker执行角色需拥有目标S3桶的
s3:PutObject权限。
方案二:配置目标S3桶强制覆盖加密设置
通过S3桶级配置,强制所有上传到该桶的对象使用桶的默认加密密钥,忽略上传时指定的密钥(包括SageMaker默认的源账号密钥)。
操作步骤:
- 登录目标账号的AWS控制台,进入S3服务,找到
test_bucket。 - 切换到「属性」标签页,找到「默认加密」模块,点击「编辑」。
- 确认已选中桶的默认KMS密钥,勾选**「覆盖上传到存储桶的对象的现有加密设置」**选项。
- 点击「保存更改」完成配置。
权限配置要求:
源账号的SageMaker执行角色需拥有目标KMS密钥的kms:GenerateDataKey权限(S3会代表角色调用该密钥完成加密),需在目标账号的KMS密钥策略中添加源角色ARN并授权该权限。
总结
- 方案一适合仅针对SageMaker任务指定加密密钥的场景,需修改代码;
- 方案二是全局桶级配置,无需修改代码,所有上传到该桶的对象都会强制使用桶默认密钥,更省心。
内容的提问来源于stack exchange,提问作者Mark Andrew
相关产品推荐
相关产品推荐

