概要
Azure SQL Database を無料で試す (プレビュー)を試してみた。
データベースの作成
基本はデフォルトの設定。認証方法は両方を使用するようにした。
その月の無料枠を超えたら止まるように設定(デフォルト)。次の月になって無料枠ができたら使えるようになるもよう。
コストはちゃんと0になっている。
日本語を扱うので照合順序はJapanese_CS_AS_KS_WS
に変更した。(参考 *2)
対象 | 区別する(Sensitive ) |
区別しない(Insensitive ) |
---|---|---|
大文字と小文字(Case ) |
CS | CI |
アクセント(Accent ) |
AS | AI |
ひらがなとカタカナ(Kana ) |
KS | KI |
半角と全角(Width ) |
WS | WI |
テスト用のテーブル作成
テスト用にテーブルを作成し、データを挿入した。
CREATE TABLE TestTable (
ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
Name NVARCHAR(20) NOT NULL,
);
INSERT INTO TestTable VALUES ('test');
INSERT INTO TestTable VALUES ('日本語テストです');
SELECT * FROM TestTable ;
Firewallの設定
もしもFirewallの穴あけをしなかった場合、関数実行時に下記のようなエラーとなる。
Cannot open server 'my-free-sqldbserver' requested by the login. Client with IP address 'x.xxx.xxx.xx' is not allowed to access the server. To enable access, use the 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.
SQL Serverのネットワークで「Azureサービスおよびリソースにこのサーバへのアクセスを許可する」にチェックを入れて、Functionsからアクセスできるようにする。
関数からSQLを発行する
Azure Functions の Azure SQL 入力バインドの手順に従ってSQLを発行する。
関数アプリの作成
関数の作成はポータルから行った。
基本設定
プロパティ | 値 |
---|---|
OS | Linux |
ランタイムバージョン | 4.31.1.1 |
発行モデル | コード |
コンテナイメージ | Node-20 |
環境変数
環境変数にSQL Serverの接続文字列を格納する必要がある。
環境変数にいれずに直接ソースに書くと、ConnectionStringSetting 'hoge' is missing in your function app settings, please add the setting with a valid SQL connection string.
のエラーとなる。
SQLデータベースから接続文字列取得
今回はSQL認証で接続する。接続文字列をコピーし、{your_password}
をデータベース作成時に決めたパスワードに置き換える。
Functionsアプリに設定
関数のデプロイ
TypescriptをVSCodeの拡張経由でデプロイした。
ソースコード
Azure Functions の Azure SQL 入力バインドより
import { app, HttpRequest, HttpResponseInit, InvocationContext,input } from "@azure/functions";
const sqlInput = input.sql({
commandText: 'select [ID], [Name] from TestTable',
commandType: 'Text',
connectionStringSetting: 'MyConnectionString',
});
export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
context.log(`Http function processed request for url "${request.url}"`);
const toDoItems = context.extraInputs.get(sqlInput);
return {
jsonBody: toDoItems,
};
};
app.http('httpTrigger1', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
extraInputs: [sqlInput],
handler: httpTrigger1
});