没有 appsettings.json/local.settings.json 的 Azure Functions 配置管理

问题描述 投票:0回答:1

我正在使用 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}"
c# azure-functions azure-aks
1个回答
0
投票

要在不使用

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

Build Output

我参考了这个链接来为 Pod 中运行的容器定义环境变量。

Docker Run

使用

az acr login -n yourregistryname
登录容器注册表,并使用
docker push imageName:tag

将镜像推送到注册表

Image in register

在 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

kuber apply

接下来使用

kubectl get pods -l purpose=demonstrate-envars
确认 Pod 正在运行,然后使用

列出容器中的环境变量
kubectl exec azure-bus-demo -- printenv

OutPut of

使用下面的命令在pod中创建并运行特定图像

kubectl run azurebusdemo --image=sampath45.azurecr.io/hello:v1

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.