Azure functions(python)からIAMデータベース認証でAuroraに接続してみました。
必要なもの
- AWSのアカウント
- Azureのアカウント
作業概要
- Auroraの作成
- DBユーザーとIAMの作成
- Azure functionsの作成
- 動作確認
1. Auroraの作成
- AWSマネジメントコンソールにログイン後、RDSを選択し、「Aurora(MySQL)を起動」をクリックする
- 以下のパラメータを指定してAuroraを作成する
パラメータ | 値 |
---|---|
DBインスタンスのクラス | db.t2.medium |
マルチAZ配置 | いいえ |
VPC | デフォルトVPC |
サブネットグループ | default |
パブリックアクセス可能 | はい |
VPCセキュリティグループ | 新しいセキュリティーグループの作成 |
IAMのDB認証を有効にする | はい |
※コスト重視の設定です。
3. セキュリティグループの編集
自動作成されたセキュリティグループは、自分のPCのグルーバルアドレスからアクセスのみ許可する設定になっているので、どこからのアクセスでも許可するように編集します。
3-1. 作成したAuroraインスタンスの詳細画面のセキュリティーグループをクリックする
3-2. 「インバウンド」-「編集」をクリックし、ソースを「任意の場所」に変更し保存する
2. DBユーザーとIAMの作成
- DBユーザーを作成する
作成したAuroraに接続して、下記SQLを実行します。
CREATE USER <<ユーザー名>> IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';
2. IAMポリシーを作成する
AWSマネジメントコンソールでIAMを選択後、下記JSONを指定してIAMポリシーを作成します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1503756013000",
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
"arn:aws:rds-db:<<リージョン>>:<<AWSのアカウントID>>:dbuser:<<クラスタのリソースID>>/<<DBユーザー名>>"
]
}
]
}
参考(リージョン):http://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#rds_region
3. IAMユーザーを作成し、上で作成したIAMポリシーをアタッチする
引き続きAWSマネジメントコンソール上でIAMユーザーを作成します。ユーザー名は利用しないので、ダミーで構いません。また作成するIAMユーザーはマネジメントコンソールへのログインには使わないので、AccessTypeは「Programmatic access」を指定します。
IAMユーザー作成後、アクセスキーとシークレットキーが表示されます。Azure functionsで利用するので、メモを取ります。(シークレットキーは作成時にしか確認できません。)
3. Azure functionsの作成
-
Azure Portalにログインして、functionsリソースを作成する
-
テンプレート「HttpTrigger - Python」を選択して関数を作成する
-
Kuduに接続し、Debug consoleを開く
Azure functionsのPythonのバージョンを上げる
KuduのDebug consoleで以下を入力します。
D:\home>nuget.exe install -Source https://www.siteextensions.net/api/v2/ -OutputDirectory D:\home\site\tools python362x86
D:\home>mv /d/home/site/tools/python362x86.3.6.2/content/python362x86/* /d/home/site/tools/
Azure functionのpythonのバージョンは2.7.8(2017-08-30時点)ですが、そのバージョンだと今回利用するpymysqlが下記エラーを出力するため、バージョンを3.6.2に上げます。(やや黒魔術)
AttributeError: 'module' object has no attribute 'SSLContext'
Azure functionsのpythonはまだExperimentalなので、正式リリース時にはここら辺は変わるかもしれません。
参考:https://prmadi.com/running-python-code-on-azure-functions-app/
5. Pythonのモジュールをインストールする
引き続き、KuduのDebug consoleで以下を入力します。
D:\home>cd /home/site/wwwroot/aurora
D:\home\site\wwwroot\aurora>python -m pip install boto3 -t .
D:\home\site\wwwroot\aurora>python -m pip install pymysql -t .
6. ルート証明書をダウンロードする
引き続き、KuduのDebug consoleで以下を入力します。
D:\home\site\wwwroot\aurora>curl -O https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem
参考:http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html
7. サンプルのpythonスクリプトを書き換える
import os
import boto3
import pymysql
response = open(os.environ['res'], 'w')
host = '<<Auroraのクラスタエンドポイント>>'
user = '<<DBユーザー名>>'
dbname = '<<DB名>>'
region = '<<リージョン名>>' # 例) バージニアならus-east-1
cafile = 'rds-ca-2015-root.pem' # ルート証明書
client = boto3.client(
'rds',
aws_access_key_id = '<<アクセスキー>>',
aws_secret_access_key = '<<シークレットキー>>',
region_name = region
)
token = client.generate_db_auth_token(
DBHostname = host,
Port = 3306,
DBUsername = user,
Region = region
)
connection = pymysql.connect(
host = host,
port = 3306,
user = user,
passwd = token,
ssl = {
'ca': cafile
},
db = dbname
)
try:
with connection.cursor() as cursor:
cursor.execute('select aurora_version();')
result = cursor.fetchone()
response.write("aurora version: "+result[0])
finally:
connection.close()
response.close()
4. 動作確認
「実行」をクリックした結果が以下のようになればOKです。
雑感
本当はC#で接続してみたかったのですが、Connector/NetがIAMデータベース認証に対応できないようで断念。。。pythonではバージョン周りで再びハマりましたが、Azure functionsの自由度(対AWS Lambda比)に助けられ無事Auroraに接続できました。
またIAM データベース認証を使わなければ、もっと簡単に接続できそうです。