我正在使用 Azure Functions 并使用自定义配置方法,而不依赖于 appsettings.json。相反,我使用名为“config”的文件夹来存储特定于环境的设置。
我当前的设置包括:
使用 HostBuilder 配置应用程序的 Program.cs 文件。 包含没有扩展名的文件的配置文件夹,其中每个文件代表一个环境变量。 其中一个文件名为“azure-bus-connection”并包含一个秘密值。 这是我的 Program.cs 代码片段:
var host = new HostBuilder()
.ConfigureAppConfiguration((context, builder) =>
{
var configFolder = Path.Combine(AppContext.BaseDirectory, "config");
context.Configuration = builder.AddDirectory(configFolder).Build();
})
// ... rest of the configuration code ...
我的函数使用此配置来设置服务总线连接:
[Function(nameof(MyWorker))]
public async Task MyWorker(
[ServiceBusTrigger("topic", nameof(MyRequest), Connection = "azure-bus-connection")]
ServiceBusReceivedMessage message)
{
var connectionString = configuration["azure-bus-connection"];
// ... rest of the function code ...
}
我在此设置中管理环境变量时遇到问题,因为我的函数无法识别使用 AddDirectory 添加的秘密。如何确保 Azure 服务总线连接字符串等敏感信息保持安全并且不会在我的代码或日志中公开?
是否有推荐的方法来处理 Azure Functions 中的秘密管理,而无需使用 appsettings.json/local.settings.json 或直接在代码中存储秘密?
其他背景 我正在使用 Microsoft.Azure.Functions.Worker 包。 我已配置 Application Insights 遥测。 我正在使用自定义中间件进行全局异常处理。 我已配置日志记录选项以删除默认的 Application Insights 记录器规则。 对于使用自定义配置在 Azure Functions 中安全管理机密的任何建议或最佳实践,我们将不胜感激。
除了机密之外,我的 AKS 部署 yaml 文件如下所示:
template:
metadata:
labels:
app: ${PROJECT_SLUG}
aadpodidbinding: ${PROJECT_SLUG}
spec:
containers:
- name: ${PROJECT_SLUG}
image: ${PROJECT_IMAGE}
imagePullPolicy: Always
volumeMounts:
- name: secrets-store-inline
mountPath: "/config"
readOnly: true
ports:
- containerPort: 443
- containerPort: 80
envFrom:
- configMapRef:
name: ${PROJECT_SLUG}-config
volumes:
- name: secrets-store-inline
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "${PROJECT_SLUG}"
要在不使用
appsettings.json
或 local.settings.json
的情况下配置应用程序变量,您可以使用 .env
文件或 Azure Key Vault。
var connectionString = _configuration["azure-bus-connection"];
_logger.LogInformation(connectionString);
第一步是创建一个
.env
文件并在其中定义环境变量:
azure-bus-connection=your_connection_string_here
sampath=your_connection_string_here
添加以下示例 docker 来构建并推送 Docker 镜像
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS installer-env
COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app && \
mkdir -p /home/site/wwwroot && \
dotnet publish *.csproj --output /home/site/wwwroot
# For Azure Functions with .NET 8.0 isolated runtime
FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true
COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
要构建并运行 Docker 映像,请使用以下命令:
docker build -t hello .
docker run -e azure-bus-connection="Endpoint=sb://" -e sampath="Endpoint=sb://=" hello
我参考了这个链接来为 Pod 中运行的容器定义环境变量。
使用
az acr login -n yourregistryname
登录容器注册表,并使用 docker push imageName:tag
将镜像推送到注册表
在 Kubernetes 服务的 yml 文件中使用上述 Repositories 镜像。
创建 Kubernetes 服务并连接到它。
使用环境变量在 Kubernetes 中创建 Pod 的 YAML 配置文件如下:
apiVersion: v1
kind: Pod
metadata:
name: azure-bus-demo
labels:
purpose: demonstrate-envars
spec:
containers:
- name: azure-bus-container
image: your-image-here # Replace with your actual image, e.g., hello-world or any relevant image
env:
- name: azure-bus-connection
value: "Endpoint=sb://"
- name: sampath
value: "Endpoint=sb://"
将此文件另存为
azure-bus-pod.yaml
以应用配置并使用以下命令创建 Pod :
kubectl apply -f azure-bus-pod.yaml
接下来使用
kubectl get pods -l purpose=demonstrate-envars
确认 Pod 正在运行,然后使用 列出容器中的环境变量
kubectl exec azure-bus-demo -- printenv
使用下面的命令在pod中创建并运行特定图像
kubectl run azurebusdemo --image=sampath45.azurecr.io/hello:v1