Azure Database for MariaDB - 基本操作（Python）

# DBサーバ作成

[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/mariadb/quickstart-create-mariadb-server-database-using-azure-portal#create-an-azure-database-for-mariadb-server)参照

**作成時に設定したパスワード**はDBアクセス時に使用する

![image-20210807160616611.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/fc71bbdb-d548-7539-ec93-574422b77cf3.png)

以下、作成されたDBサーバ概要

![image-20210807161013418.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/f698fcf9-4d36-1959-b47e-1f919d25a362.png)



**サーバ名**、**サーバー管理者ログイン名**はDBアクセス時に使用する
SSL接続を有効に設定している場合は、以下からSSL証明書を取得する

[SSL 証明書を取得する](https://docs.microsoft.com/ja-jp/azure/mariadb/howto-configure-ssl#obtain-ssl-certificate)
https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem

# DBのファイアウォール設定



## クライアントツールからのアクセス許可

**＋ 現在のクラインとIPアドレスを追加する（xxx.xxx.xxx.xxx）**をクリックすることでIPアドレスが自動的に登録される

![image-20210807164940799.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/19c0ce5d-b651-0bf2-89d0-42f354879e5c.png)


## Azure Functionsからのアクセス許可

**Azure サービスへのアクセスを許可**を**はい**に設定する

![image-20210807164956472.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/2f67911c-860f-3c7d-267c-4ad90e502446.png)


# クライアントツールからのアクセス

[公式ドキュメント](クライアントツール)

## HeidiSQLの場合

![image-20210807162922868.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/6fe59e45-9b2f-23e6-ff6e-55b5ad165f23.png)


ホスト名/IP：DBサーバ概要の**サーバ名**
ユーザー： DBサーバ概要の**サーバー管理者ログイン名**
パスワード： **作成時に設定したパスワード**

SSL接続を有効にしている場合は、SSL CA証明書にダウンロードしたSSL証明書のパスを設定

![image-20210807162901623.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/a9593e53-d668-2014-d5a5-3bee6fa3b547.png)




今回は、以下のように適当なデータベース、テーブルを作成し、適当なデータを追加済

![image-20210807165305756.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/fdc536ea-be54-2a7c-486a-e4834615c295.png)


データベース名： testdb
テーブル名： testtable

# Azure Functions（Python）からのDBアクセス

[クイック スタート:Python を使用して Azure Database for MySQL に接続してデータを照会する](https://docs.microsoft.com/ja-jp/azure/mysql/connect-python)

今回はHTTPトリガー、関数名`HttpTrigger1`で作成

## 実装コード

```python:__init__.py
import logging
import os
import azure.functions as func
import mysql.connector
from mysql.connector import errorcode

def main(req: func.HttpRequest) -> func.HttpResponse:

  logging.info('Python HTTP trigger function processed a request.')

  config = {
    'host': os.environ["MARIADB_HOST"],
    'user': os.environ["MARIADB_USER"],
    'password': os.environ["MARIADB_PASSWORD"],
    'database': 'testdb',
    'client_flags': [mysql.connector.ClientFlag.SSL],
    'ssl_ca': os.environ["MARIADB_SSL_CA"]
  }

  try:
    conn = mysql.connector.connect(**config)
    logging.info("Connection established")
  except mysql.connector.Error as err:
    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
      logging.info("Something is wrong with the user name or password")
    elif err.errno == errorcode.ER_BAD_DB_ERROR:
      logging.info("Database does not exist")
    else:
      logging.info(err)
  else:
    cursor = conn.cursor()

    cursor.execute("SELECT * FROM testtable;")
    rows = cursor.fetchall()
    logging.info(f'Read: {cursor.rowcount}, row(s) of data.')

    # logging.info all rows
    for row in rows:
      logging.info(f'Data row = {row}')

  return func.HttpResponse(
      "This HTTP triggered function executed successfully.",
      status_code=200
  )
```



## 環境変数、その他設定

ファイル構成

```
xxx
 ├─ HttpTrigger1
 │    ├─ __init__.py
 │    ├─ function.json
 │    ├─ sample.dat
 │    └─ cert
 │         └─ BaltimoreCyberTrustRoot.crt.pem
 │
 ├─ local.settings.json
 └─ requirements.txt
```

SSL接続を有効にしている場合は、SSL証明書を`HttpTrigger1`以下の任意の場所に格納する



### 環境変数

`local.settings.json`にDBアクセスに必要な値を定義しておく
Pythonコード上からは `os.environ["MARIADB_HOST"]`のようにアクセスする

```json:local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "MARIADB_HOST": "<mydemoserver>.mysql.database.azure.com",
    "MARIADB_USER": "<myadmin>@<mydemoserver>",
    "MARIADB_PASSWORD": "<mypassword>",
    "MARIADB_SSL_CA": "HttpTrigger1/cert/BaltimoreCyberTrustRoot.crt.pem"
  }
}
```

`local.settings.json`はローカル環境実行用の環境変数のため、
Azure Functionsの構成から以下のようにアプリケーション設定を追加する
追加するアプリケーション設定の値は`local.settings.json`と同様

![image-20210807172426741.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/766614a8-fedc-5443-6111-ad8d3156daea.png)




### パッケージ

`requirements.txt`に以下のように`mysql-connector-python`を追加する

```:requirements.txt
# DO NOT include azure-functions-worker in this file
# The Python Worker is managed by Azure Functions platform
# Manually managing azure-functions-worker may cause unexpected issues

azure-functions
mysql-connector-python
```



## 実行結果

![image-20210807173023507.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/38116a16-176a-b265-e38d-5687670e13b0.png)