如何在Azure ACI中获取Blob存储文件上传通知并下载至指定目录
实现Azure Blob上传通知并触发ACI下载文件到指定目录
完全可以实现这个需求,以下是两种实用方案,适合Azure新手快速落地:
方案一:事件驱动实时触发(推荐)
利用Azure Event Grid监听Blob上传事件,结合Azure Function处理逻辑,触发ACI内的服务下载文件:
配置Blob存储的Event Grid事件订阅
- 登录Azure门户,找到你的Blob存储账户,进入「事件」面板
- 创建事件订阅,事件类型选择「Blob已创建」(仅监听新上传的文件)
- 终点类型选择「Azure Function」或「Webhook」:
- 选Webhook的话,需要你的ACI服务暴露一个HTTP接口,用于接收事件通知并触发下载
- 选Azure Function的话,后续用Function来处理下载逻辑
编写事件处理逻辑
以Azure Function为例,用C#编写处理代码(其他语言同理):using Azure.Storage.Blobs; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.EventGrid; using Azure.Messaging.EventGrid; using Newtonsoft.Json; using System.Net.Http; using System.IO; public static async Task Run([EventGridTrigger] EventGridEvent eventGridEvent) { // 解析Blob上传事件的元数据 var blobUrl = eventGridEvent.Data["url"].ToString(); var blobClient = new BlobClient(new Uri(blobUrl)); // 下载Blob内容到临时路径 var tempPath = Path.Combine(Path.GetTempPath(), blobClient.Name); await blobClient.DownloadToAsync(tempPath); // 方式1:若ACI挂载了Azure Files卷,直接上传到对应共享目录(映射到ACI的c:\data\input) // var shareClient = new ShareClient("<Azure Files连接字符串>", "<共享名称>"); // var fileClient = shareClient.GetRootDirectoryClient().GetFileClient(blobClient.Name); // await fileClient.UploadAsync(tempPath); // 方式2:调用ACI服务的HTTP接口,通知服务自行下载Blob using var httpClient = new HttpClient(); await httpClient.PostAsync("http://<ACI服务IP>:<端口>/api/download", new StringContent(JsonConvert.SerializeObject(new { BlobUrl = blobUrl }))); }权限配置
- 给Azure Function分配Blob存储的「存储Blob数据读取者」角色,或者用SAS令牌访问Blob
- 如果调用ACI的HTTP接口,确保ACI的网络允许Function访问(比如通过VNet集成)
方案二:直接挂载Blob存储到ACI(更简单)
如果你的场景不需要复杂的事件触发逻辑,可以直接将Blob容器挂载为ACI的只读卷,上传到Blob的文件会直接出现在ACI的c:\data\input目录下,无需手动下载:
- 创建ACI时,在卷配置中选择「Azure Blob存储」,关联你的
SStorageContainer容器,设置挂载路径为c:\data\input - 配置ACI使用托管标识或SAS令牌访问Blob存储,确保权限足够
- 上传到Blob容器的文件会自动同步到ACI的input目录,服务直接读取即可
注意事项
- 事件驱动方案要考虑重复事件的处理(Event Grid会自动重试,需在服务中做幂等校验)
- 挂载Blob卷时该卷为只读属性,适合作为input目录;output目录推荐使用Azure Files或可写的Blob容器
- 尽量让ACI和存储账户处于同一区域,减少延迟和数据传输成本
内容的提问来源于stack exchange,提问作者sreeR
相关产品推荐
相关产品推荐

