Azure Blob Storage(WASBS)访问权限获取及代码实现咨询
解决Blob存储权限拒绝问题:使用Access Key访问文本文件
你遇到的permission denied when access stream错误,是因为自定义Blob容器未开启匿名访问,而公共容器默认允许匿名访问所以能正常运行。下面两种方法可以通过存储账户Access Key实现授权访问:
方法1:在Input路径中拼接SAS令牌(基于Access Key生成)
SAS令牌是用Access Key生成的临时访问凭证,拼接在Blob路径后即可让Azure ML作业获得访问权限:
步骤1:生成SAS令牌
可以用Python代码生成SAS令牌(也可通过Azure门户生成):
from azure.storage.blob import generate_blob_sas, BlobSasPermissions from datetime import datetime, timedelta # 替换为你的存储账户信息 storage_account_name = "mystorageaccount" storage_account_key = "你的存储账户Access Key" container_name = "mycontainername" blob_name = "read1.txt" # 生成有效期24小时的只读SAS令牌 sas_token = generate_blob_sas( account_name=storage_account_name, container_name=container_name, blob_name=blob_name, account_key=storage_account_key, permission=BlobSasPermissions(read=True), expiry=datetime.utcnow() + timedelta(hours=24) ) # 拼接带SAS的Blob路径 blob_csv_path_with_sas = f"wasbs://{container_name}@{storage_account_name}.blob.core.windows.net/{blob_name}?{sas_token}"
步骤2:修改作业代码提交
将原代码中的blob_csv_path替换为带SAS的路径,然后提交作业:
# 替换原路径变量 blob_csv_path = blob_csv_path_with_sas job = command( inputs={ "csv_file" : Input(type=AssetTypes.URI_FILE, path=blob_csv_path, mode=InputOutputModes.RO_MOUNT), }, compute=gpu_compute_target, environment=curated_env_name, code="./src/", command="python test2.py --data-file ${{inputs.csv_file}}", experiment_name="tf-test-expname", display_name="tensorflow-test_displayname", ) ml_client.jobs.create_or_update(job)
方法2:在作业代码(test2.py)中直接用Access Key读取Blob
如果不想在路径中暴露SAS令牌,可在作业执行代码中用Access Key初始化Blob客户端,直接读取文件内容:
修改test2.py代码
import argparse from azure.storage.blob import BlobServiceClient def main(): parser = argparse.ArgumentParser() parser.add_argument("--storage-account-name", type=str) parser.add_argument("--storage-account-key", type=str) parser.add_argument("--container-name", type=str) parser.add_argument("--blob-name", type=str) args = parser.parse_args() # 初始化Blob服务客户端 blob_service_client = BlobServiceClient( account_url=f"https://{args.storage_account_name}.blob.core.windows.net", credential=args.storage_account_key ) # 读取Blob内容 blob_client = blob_service_client.get_blob_client(container=args.container_name, blob=args.blob_name) with blob_client.open_read() as stream: text_content = stream.read().decode("utf-8") # 在这里处理你的文本内容 print(text_content) if __name__ == "__main__": main()
修改作业提交代码
将存储账户信息作为参数传入作业,避免硬编码:
job = command( inputs={ "storage_account_name": "mystorageaccount", "storage_account_key": "你的存储账户Access Key", "container_name": "mycontainername", "blob_name": "read1.txt" }, compute=gpu_compute_target, environment=curated_env_name, code="./src/", command="""python test2.py \ --storage-account-name ${{inputs.storage_account_name}} \ --storage-account-key ${{inputs.storage_account_key}} \ --container-name ${{inputs.container_name}} \ --blob-name ${{inputs.blob_name}} """, experiment_name="tf-test-expname", display_name="tensorflow-test_displayname", ) ml_client.jobs.create_or_update(job)
安全提示
- Access Key是存储账户的敏感信息,不要直接硬编码在代码或配置文件中,建议用Azure Key Vault存储机密,再在作业中引用Key Vault的机密值。
- 生成SAS令牌时,尽量设置较短的有效期,降低凭证泄露后的风险。
内容的提问来源于stack exchange,提问作者Bubble
相关产品推荐
相关产品推荐

