Azure Functionsをローカル実行してローカルのSQL Server(Docker)に接続したメモ

## 概要
Azure Functionsをローカル実行して、[前回](https://qiita.com/hibohiboo/items/8598d44e64562ce37ebd)作ったローカル実行されているDocker上のSQL Serverに接続したメモ。

## ソース

接続文字列は`localhost`を使わずに、`127.0.0.1`を使う。

```diff:local.settings.json
{
  // 省略
  "Values": {
   // 省略
+    "MyConnectionString": "Server=127.0.0.1,1433;Database=quickstart;User Id=SA;Password=<YourStrong@Passw0rd>;Encrypt=True;TrustServerCertificate=True;Connection Timeout=10;"
  }
}

```

```ts:src/functions/rankCharacter.ts
import {
  app,
  HttpRequest,
  HttpResponseInit,
  InvocationContext,
  output,
} from '@azure/functions';

const sqlOutput = output.sql({
  commandText: '[dbo].[Test]',
  connectionStringSetting: 'MyConnectionString',
});

export async function rankCharacter(
  request: HttpRequest,
  context: InvocationContext,
): Promise<HttpResponseInit> {
  const characterId = request.params.characterId;
  const {  data } = (await request.json()) as {
    data: string;
  };
  const ret = context.extraOutputs.set(sqlOutput, {
    id: characterId,
    data,
    updated: new Date(),
  });
  return {
    status: 201,
  };
}

app.http('rankCharacter', {
  methods: ['PUT'],
  authLevel: 'anonymous',
  route: 'rank-character/{characterId:alpha}',
  extraOutputs: [sqlOutput],
  handler: rankCharacter,
});
```


## error

### 対象のコンピューターによって拒否されたため、接続できませんでした。
`"MyConnectionString": "Server=localhost,1433;Database=quickstart;User Id=SA;Password=<YourStrong@Passw0rd>;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;"`の時のエラー。`localhost`だめなの？

```
 System.Private.CoreLib: Exception while executing function:
 System.Private.CoreLib: One or more errors occurred. (A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 0
  ```

###  信頼されていない機関によって証明書チェーンが発行されました。

`"MyConnectionString": "Server=127.0.0.1,1433;Database=quickstart;User Id=SA;Password=MyPassword123;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"`
前回同様、`TrustServerCertificate=True`の設定値にする。

```
 System.Private.CoreLib: Exception while executing function:
System.Private.CoreLib: One or more errors occurred. (The default values for encryption on connections have been changed, please review your configuration to ensure you have the correct values for your server. See https://aka.ms/afsqlext-connection for more details.). Microsoft.Azure.WebJobs.Extensions.Sql: The default values for encryption on connections have been changed, please review your configuration to ensure you have the correct values for your server. See https://aka.ms/afsqlext-connection for more details. Core Microsoft SqlClient Data Provider: A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0
```

## ( 2024.05.19 追記 ) 32bitのメッセージが出ていたことを対応したメモ

ローカル実行はできているが、下記のエラーメッセージが出ていた。

```
File 'C:\Program Files (x86)\dotnet\dotnet.exe' is not found, 'dotnet' invocation will rely on the PATH environment variable.
```

ぐぐると、dotnetがない場合に出る模様。入っているか試してみる。

```
$ dotnet --version
8.0.300
```

インストールされているじゃん。パスも通っている。

```
$ where dotnet
C:\Program Files\dotnet\dotnet.exe
```

ここまできて、[前回](https://qiita.com/hibohiboo/items/3180329b7d591fea7ba9)は` --params "'/x64'"`オプションをつけていたことを思い出した。

案の定、32bitになっている

```
Azure Functions Core Tools
Core Tools Version:       4.0.5801 Commit hash: N/A +5ac2f09758b98257e728dd1b5576ce5ea9ef68ff (32-bit)
Function Runtime Version: 4.34.1.22669
```


あらためて、インストールしなおしてみる。

```
choco uninstall -y azure-functions-core-tools
choco install -y azure-functions-core-tools --params "'/x64'"
```

無事64bit版がインストールされ、エラーメッセージもなくなった。

```
Azure Functions Core Tools
Core Tools Version:       4.0.5801 Commit hash: N/A +5ac2f09758b98257e728dd1b5576ce5ea9ef68ff (64-bit)
Function Runtime Version: 4.34.1.22669
```

[chocolatey](https://community.chocolatey.org/packages/azure-functions-core-tools)でも64bitをデフォルトにしませんかって言っている人いますね。


## 参考

[Azure Functions の HTTP トリガー](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=python-v2%2Cisolated-process%2Cnodejs-v4%2Cfunctionsv2&pivots=programming-language-typescript)
[Microsoft SQL Server (MSSQL) ストレージ プロバイダーを使用して Durable Functions を構成する](https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/quickstart-mssql)
[接続文字列の書き方をまとめてみる（2014 年版）](https://blog.shibayan.jp/entry/20140728/1406520000)

[Azure 向け開発のためのローカルリソース準備](https://zenn.dev/tan_y/articles/f213f70f2816bd)
[SQL Server Linux コンテナーをデプロイして接続する](https://learn.microsoft.com/ja-jp/sql/linux/sql-server-linux-docker-container-deployment?view=sql-server-ver16&pivots=cs1-bash)
[Azure Functions の Azure SQL 出力バインド](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-azure-sql-output?tabs=isolated-process%2Cnodejs-v4&pivots=programming-language-typescript)
[Azure Functions をローカルでコーディングしてテストする](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-develop-local)
[Azure Functions から SQL Database に書き込む (ポータル版とVS版)](https://chomado.com/programming/c-sharp/update-sql-database-from-azure-functions/)