You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:15:26