AWS
Aurora
AzureFunctions

Azure functionsからAWS Auroraにつないでみる

Azure functions(python)からIAMデータベース認証でAuroraに接続してみました。

必要なもの

  • AWSのアカウント
  • Azureのアカウント

作業概要

  1. Auroraの作成
  2. DBユーザーとIAMの作成
  3. Azure functionsの作成
  4. 動作確認

1. Auroraの作成

  1. AWSマネジメントコンソールにログイン後、RDSを選択し、「Aurora(MySQL)を起動」をクリックする  
  2. 以下のパラメータを指定してAuroraを作成する
パラメータ
DBインスタンスのクラス db.t2.medium
マルチAZ配置 いいえ
VPC デフォルトVPC
サブネットグループ default
パブリックアクセス可能 はい
VPCセキュリティグループ 新しいセキュリティーグループの作成
IAMのDB認証を有効にする はい

※コスト重視の設定です。
 
3. セキュリティグループの編集

自動作成されたセキュリティグループは、自分のPCのグルーバルアドレスからアクセスのみ許可する設定になっているので、どこからのアクセスでも許可するように編集します。

3-1. 作成したAuroraインスタンスの詳細画面のセキュリティーグループをクリックする

06_func.png

3-2. 「インバウンド」-「編集」をクリックし、ソースを「任意の場所」に変更し保存する

07_func.png

2. DBユーザーとIAMの作成

  1. 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/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html#UsingWithRDS.IAMDBAuth.Attaching

参考(リージョン):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の作成

  1. Azure Portalにログインして、functionsリソースを作成する

    01_func.png

  2. テンプレート「HttpTrigger - Python」を選択して関数を作成する

    02_func.png

  3. Kuduに接続し、Debug consoleを開く

    03_func.png

    04_func.png

  4. 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スクリプトを書き換える

run.py
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です。

05_func.png

雑感

本当はC#で接続してみたかったのですが、Connector/NetがIAMデータベース認証に対応できないようで断念。。。pythonではバージョン周りで再びハマりましたが、Azure functionsの自由度(対AWS Lambda比)に助けられ無事Auroraに接続できました。

またIAM データベース認証を使わなければ、もっと簡単に接続できそうです。