我正在构建一个 Web 应用程序来从 Blob 存储帐户读取文件并计算特定指标。此应用程序将部署为 Azure Web 应用程序资源,仅限通过公司 VPN 连接的用户。 Web 应用程序和存储帐户配置为在专用端点上运行,确保它们无法从公共 Web 访问。
该应用程序正在通过 Azure 管道作为代码进行部署,并且我们已经创建了服务连接。
已为 Web 应用程序资源分配存储帐户资源中的 Storage Blob Data Contributor 和 Storage Queue Data Contributor 角色。
要从存储帐户读取数据,我使用配置了所有允许的服务、资源类型和权限的连接字符串,以及仅适用于允许的协议的 HTTPS。从存储中获取必要数据的脚本如下:
def fetch_access_data(connection_string, admin_container_name, access_blob_name):
blob_service_client = BlobServiceClient.from_connection_string(connection_string)
blob_client = blob_service_client.get_blob_client(container=admin_container_name, blob=access_blob_name)
stream = io.BytesIO(blob_client.download_blob().readall())
df_access = pd.read_excel(stream)
return df_access
此脚本旨在检索每个用户有权访问的文件,并作为第一次尝试连接存储帐户并从存储帐户读取数据。
错误是:
HttpResponseError:该请求无权执行该操作。 RequestId:RequestId 失败内容:
此请求无权执行此操作。 RequestId:RequestId 时间:2024-11-12T07:44:22.7022630ZAuthorizationFailure
在 Microsoft Azure 存储资源管理器中使用相同的连接字符串可以完全访问存储帐户,包括毫无问题地下载和上传文件。
同样的错误不断发生。
我能够使用 SAS 令牌在本地和 Azure Web 应用程序中从 Azure Blob 存储读取文件。
我已将 Storage Blob Data Contributor 角色分配给 Azure Web App,并将 Owner 角色分配给服务原则,如下所示。
app.py:
from azure.storage.blob import BlobServiceClient
import io
import streamlit as st
def fetch_access_data(account_url, sas_token, admin_container_name, access_blob_name):
blob_service_client = BlobServiceClient(account_url=account_url, credential=sas_token)
blob_client = blob_service_client.get_blob_client(container=admin_container_name, blob=access_blob_name)
stream = io.BytesIO(blob_client.download_blob().readall())
text_data = stream.getvalue().decode('utf-8')
return text_data
account_url = "https://<storageName>.blob.core.windows.net/"
sas_token = "<SAS_Token>"
admin_container_name = "kamcontainer"
access_blob_name = "samplekam.txt"
st.title("Azure Blob Storage Text File Viewer")
try:
text_content = fetch_access_data(account_url, sas_token, admin_container_name, access_blob_name)
st.subheader("Contents of the file:")
st.text(text_content)
except Exception as e:
st.error(f"An error occurred: {e}")
确保在 Azure 存储中的
IP address
设置下添加您的 Network
,如下所示。
在 Azure Web App 中,您可以在
public network access
下添加您的 IP 地址,连接 VNet
和 NAT gateway
,如下所示。
在 Azure Web 应用程序的
Backups
中配置您的存储帐户,如下所示。
Azure Web 应用程序输出:
我成功从 Azure Web App 中的 Azure Blob 存储读取文件,如下所示。