LoginSignup
2
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-30

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 データベース認証を使わなければ、もっと簡単に接続できそうです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2