How to get Connection String in Azure Function?

41 views Asked by At

I have an Azure Function and a PostreSQL DB in Azure Cloud.

enter image description here

From my Azure Function I want to access the Connection String, let's call it IT-PostgreSQL.

This is my Azure Function:

namespace InjectClaimsTokenFunc
{
    public class InjectClaims
    {
        private readonly ILogger<InjectClaims> _logger;
        private readonly DataContext _context;

        public InjectClaims(ILogger<InjectClaims> logger, DataContext context)
        {
            _logger = logger;
            _context = context;
        }

        [Function("InjectClaimsFunc")]
        public async Task<IActionResult> RunAsync([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req)
        {
            string username = Environment.GetEnvironmentVariable("BASIC_AUTH_USERNAME", EnvironmentVariableTarget.Process);
            _logger.LogInformation($"Username: {username}");

            string password = Environment.GetEnvironmentVariable("BASIC_AUTH_PASSWORD", EnvironmentVariableTarget.Process);
            _logger.LogInformation($"Password: {password}");

            var connectionString = Environment.GetEnvironmentVariable("CUSTOMCONNSTR_IT-PostgreSQL") ?? "Not found";
            _logger.LogInformation($"ConnectionString: {connectionString}");
        }
    }
}

I can retrieve get the BASIC_AUTH_USERNAME and BASIC_AUTH_PASSWORD from the Application Settings.

I always get "Not found" for the connection string now matter how I try to retrieve it. How can I retrieve the connection string from Connection strings? The connection string has a value set in Azure.

1

There are 1 answers

0
Thiago Custodio On

You should be able to read it using IConfiguration.

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace InjectClaimsTokenFunc
{
    public class InjectClaims
    {
        private readonly ILogger<InjectClaims> _logger;
        private readonly DataContext _context;
        private readonly IConfiguration _configuration;

        // Modified constructor to include IConfiguration
        public InjectClaims(ILogger<InjectClaims> logger, DataContext context, IConfiguration configuration)
        {
            _logger = logger;
            _context = context;
            _configuration = configuration;
        }

        [Function("InjectClaimsFunc")]
        public async Task<IActionResult> RunAsync([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req)
        {

            string username = _configuration["BASIC_AUTH_USERNAME"];
            _logger.LogInformation($"Username: {username}");

            string password = _configuration["BASIC_AUTH_PASSWORD"];
            _logger.LogInformation($"Password: {password}");

            var connectionString = _configuration.GetConnectionString("IT-PostgreSQL") ?? "Not found";
            _logger.LogInformation($"ConnectionString: {connectionConnectionString}");


            return new OkResult();
        }
    }
}

Then, to enable IConfiguration injection, you need to configure the DI container in a Startup class as follows:

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;

[assembly: FunctionsStartup(typeof(InjectClaimsTokenFunc.Startup))]

namespace InjectClaimsTokenFunc
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSingleton<IConfiguration>((s) =>
            {
                return new ConfigurationBuilder()
                    .AddEnvironmentVariables()
                    .Build();
            });


        }
    }
}