如何将Azure Batch输出文件迁移至Data Lake且不上传本地存储密钥
Azure Batch 输出文件迁移至Data Lake的无密钥实现方案
完全不需要将存储密钥作为资源文件上传,也不需要让密钥离开你的本地计算机,通过Batch托管标识+服务原生鉴权能力就能实现,全程不需要手动传递密钥,也支持通过服务内置环境变量完成权限配置,具体操作如下:
- 前置权限配置(全程本地操作,无密钥传输)
先在本地给你使用的Batch账户开启系统分配托管标识(也可以用用户分配托管标识),之后到对应存储账户的IAM权限面板,给这个托管标识分配Storage Blob Data Contributor角色,授予它对目标Data Lake容器的读写权限。这一步所有配置操作都在你本地通过Azure门户/CLI/SDK完成,不需要向Batch服务上传任何包含密钥的文件或配置。 - 方案1:用Batch原生输出文件自动同步,零额外代码
你在本地通过Python SDK提交Batch任务的时候,直接配置任务的OutputFiles规则即可,Batch服务会自动用之前绑定的托管标识完成存储访问,不需要你提供任何存储密钥。配置时指定目标Data Lake容器地址、需要匹配的输出文件规则、上传触发条件就行,示例配置代码:from azure.batch import models as batchmodels output_config = batchmodels.OutputFile( # 匹配任务运行生成的目标输出文件,按实际路径改 file_pattern="output/**/*", destination=batchmodels.OutputFileDestination( container=batchmodels.OutputFileBlobContainerDestination( container_url="https://<你的存储账户名>.dfs.core.windows.net/<你的Data Lake容器名>", # 指定用Batch账户的托管标识鉴权,不需要填密钥 identity_reference=batchmodels.ComputeNodeIdentityReference( resource_id="/subscriptions/<你的订阅ID>/resourceGroups/<资源组名>/providers/Microsoft.Batch/batchAccounts/<你的Batch账户名>" ) ) ), upload_options=batchmodels.OutputFileUploadOptions( # 任务运行完成就自动上传,也可以选任务失败/成功时上传 upload_condition=batchmodels.OutputFileUploadCondition.task_completion ) ) # 提交任务时把output_config加到任务的output_files参数列表里即可 - 方案2:自定义脚本迁移,通过内置环境变量自动鉴权
如果你需要在自己运行的Python脚本里自定义迁移逻辑,不需要靠Batch自动上传,也不需要传密钥:Batch计算节点启动后会自动注入托管标识鉴权所需的内置环境变量,你在脚本里直接用Azure Identity的默认凭据链就能自动完成鉴权,不需要手动配置任何带密钥的环境变量。脚本内的鉴权代码示例:from azure.storage.filedatalake import DataLakeServiceClient from azure.identity import DefaultAzureCredential # 无需硬编码或传入存储密钥,自动读取节点内置环境变量完成鉴权 dl_client = DataLakeServiceClient( account_url="https://<你的存储账户名>.dfs.core.windows.net", credential=DefaultAzureCredential() ) # 后续按你的业务逻辑写文件遍历、上传到Data Lake的逻辑即可
注意:不要尝试把存储密钥作为自定义环境变量从本地提交到Batch任务,这种方式会让密钥经过Batch控制面流转,不符合密钥不离开本地的要求。上面两种方案全程只传递资源ID、容器地址这类非敏感信息,存储访问权限通过Azure AD后台的托管标识机制完成校验,密钥全程不会流出你的本地计算机,甚至你全程都不需要手动导出存储账户的访问密钥。
内容的提问来源于stack exchange,提问作者Javier Perez Tobia
相关产品推荐
相关产品推荐

