C# - Azure FunctionsからAzure SQL Databaseを利用する

マイクロソフトのクラウドサービス Azure にはデータベースサービス Azure SQL Database があります。同じAzureサービスでる Azure Functions から SQL Database を利用する方法を確認してみます。 


Azure Functionsからのデータベースアクセス

Azure SQL Database へのアクセスは Microsoft SQL Server と同じ方法で行うことができます。

 

データーベースへのアクセスは Entity Framework というライブラリを使うのが良さそうです。

参考:C# - Azure FunctionsでEntity Frameworkを利用する


Azure SQL Databaseの接続文字列を取得する

データベースにアクセスするためには接続文字列を知る必要があります。

接続文字列は Azure のポータルサイトから確認することが可能です。

ポータルサイトのメニューから「SQL データベース」を選択します。

            ↓

データベースの一覧の中から目的のデータベースを選択します。

            ↓

メニューから「接続文字列」をクリックすると接続文字列が確認できます。

表示される接続文字列はパスワードが {your_password} のようになっているので適切な値へ置き換えて使いましょう。


ファイアウォールの設定をする

Azure Functionsで作成したアプリから Azure SQL Database へアクセスしようとすると以下のような例外が発生してしまいます。

Microsoft.Data.SqlClient.SqlException: 
  Cannot open server 'xxxxxx' requested by the login. 
  Client with IP address 'xxx.xxx.xxx.xxx' is not allowed to access the server.  
  To enable access, use the Windows Azure Management Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range. 
  It may take up to five minutes for this change to take effect.

Azure SQL Database ではファイアウォールの設定により IPアドレスによるアクセス制限がかけられています。ファイアウォールの設定を変更し、Azure Functionsからアクセスできるようにする必要があります。

 

Azure SQL Database のファイアウォールの設定はAzure のポータルサイトから行います。

目的のデータベース画面へ行き、メニューの「概要」を選択して「サーバー ファイアウォールの設定」をクリックします。

      ↓

Azure サービスおよびリソースにこのサーバーへのアクセスを許可する」を「はい」に変更して、

保存」をクリックします。

 

変更が反映されるまでに数分かかるようなので、しばらく待ってから確認してみましょう。

補足

Azure Functions が利用する送信用IPアドレスは以下の方法で確認できます。

ファイアウォールの設定でこのIPアドレスを指定してアクセスを許可する方法も考えられます。

ただし、アプリを削除して再作成するなどするとIPが変更になるので注意しましょう。

参考:https://docs.microsoft.com/ja-jp/azure/app-service/overview-inbound-outbound-ips

 

Azureポータルサイトの「すべてのサービス」から「リソース エクスプローラー」を選択します。

        ↓

左側のツリーから該当の関数アプリを選択します。

右側に表示されるJSON形式のテキストから「possibleOutboundIpAddresses」を見つけましょう。

 

ちなみに

outboundIpAddresses              ・・・ 現在アプリで使用されている送信 IP アドレス

possibleOutboundIpAddresses ・・・ アプリで考えられるすべての送信 IP アドレス

という感じなようです。