AWS aurora severless 構築からpythonのpandas.DataFrameを取得するまで


AWSのAurora Severlessを使いAPIを組もうかと思ったのですが、素人過ぎてデータのやり取りすらままならんかったので、その工程を残しました。
執筆時点 2021/04/17

Aurora severless 構築

  1. AmazonRDSのコンソールを開きます
  2. 「データベースを作成」を開始
    1. データベース作成方法: 標準作成
    2. エンジンのオプション: Amazon Aurora
    3. エディション: MySQL との互換性を持つ Amazon Aurora
    4. キャパシティータイプ:サーバーレス
    5. バージョン:Aurora(MySQL)-5.6.10a
    6. DB クラスター識別子: お好みのDB名(ここではtest-db1)
    7. マスターユーザー名: admin (本番はここもadmin以外にすべきか?)
    8. マスターパスワード: お好きなパスワード
    9. キャパシティの設定: 最小Aurora キャパシティユニット 1, 最大Aurora キャパシティユニット 1
      1. スケーリングの追加設定:「数分間アイドル状態のままの場合コンピューティング性能を一時停止する」にチェック、30分のアイドルで1時停止(開発用につくるため開発時間外の費用を抑えるため)
    10. VPC: デフォルトVPC
    11. サブネットグループ: デフォルトvpc-〇〇
    12. 既存のVPCセキュリティグループ: default
    13. 追加の接続設定:Data APIにチェック
  3. データベースを作成を押す

ここでDataAPIにチェックを入れたのは、Aurora Severlessとの交信にはこのDataAPIが必要になるためです。結構大切なオプションなのに、デフォルトでチェックが入っていないので注意。

Aurora severlessのリソースARNをメモする

  1. AmazonRDSのコンソールを開きます
  2. データベースを開く
  3. 作成したDBをダブルクリック

シークレットの作成

DBにアクセスする際、このシークレットを使ってユーザやパスワードの代わりにするらしい。
1. Secrets Managerを開く
1. 「新しいシークレットを保存する」を選択
1. auroraのために設定した「ユーザ名」「パスワード」を記入
1. DBインスタンスに先程作成したauroraを選択
1. 次へ
1. シークレットの名前や説明を適当につける。今回は名前を「test-db1-admin-secret」とした
1. 次へ
1. 自動ローテーションは無効のまま、次へ
1. シークレットを作成する

シークレットができたら、出来上がったシークレットを開き、シークレットのARNをメモする

データベースに接続してクエリディタを開く

データベースを操作するためのエディタを開きます

  1. AmazonRDSに戻る
  2. 左側「データベース」タブを選択
  3. 作成したauroraDBを選択
  4. 右上「アクション」→「クエリ」を選択
  5. 以下を確認/入力
    1. データベースインスタンスが作成したものになっていること
    2. データベースユーザ名に「Secrets Manager ARNと接続する」を選択
    3. 前項「シークレットを作成」で作ったシークレットARNを写す
  6. 「データベースに接続」します

データベースにテーブルやデータを追加

作ったままのauroraには何もデータが入っていないので、テスト用のDBとテーブルを作成し、データも追加します。

  1. とりあえず、デフォルトでエディタに表記されているクエリselect * from information_schema.tables;を実行してみる
    1. この時点ではDBが休止状態に入っている可能性があり、エラーが返ってくるかもしれません。数分経ってからもう一度実行してみましょう。
  2. 実行できたら、DBを追加するためにcreate database mydb;を実行。mydbはDB名なので好みで変更可
    1. show databases;を実行して、dbが作成できていることを確認
  3. データテーブルを追加しますcreate table mydb.sample_data (id int, name varchar(20), dt datetime);を実行。
    1. show tables from mydbで作成できたことを確認
  4. insert into mydb.sample_data (id, name, dt) values (100, 'inten', now());を実行。適当なデータを挿入する。
    1. 自分で複数挿入すると面白いので推奨です。select * from mydb.sample_data;で入力値を確認できます。

僕は最終的に次のようなテーブルを作成しました。

AWS CLI用にIAMユーザを作成

いよいよpythonを使った接続です。

しかし、このためにはAWS CLI用のユーザの作成を先に済ます必要があります。
AWS CLIは今までコンソールで行っていたことを、ローカルのPCなどの他の環境でも行うためのツールです。
pythonでAWSのサービスに接続する際も間接的にAWS CLIを使ってAWSのサービスとやり取りを行っているようです。
awsコンソールにIAMが必要なように、AWS CLIにもIAMが必要です。

  1. awsコンソールでIAMを開きます
  2. ユーザを追加を選択
  3. 「プログラムによるアクセス」にチェックを入れ、ユーザ名を記入する
  4. 権限を付与する
    1. 権限はそれぞれ方針があると思います。「AdministratorAccess」あたりを付けるのが楽ですが、注意は必要です。
  5. 確認する
  6. シークレットアクセスキーを保存する
    1. ここで得られるシークレットアクセスキーはこの機会を逃すと二度と取得できません。念の為csvもダウンロードしておきましょう。

AWS CLIのインストールと設定

  1. pip install awscli
  2. aws configureを実行。以下のように入力
AWS Access Key ID [None]: [作成したIAMのアクセスキー]
AWS Secret Access Key [None]: [作成したIAMのシークレットアクセスキー]
Default region name [None]: ap-northeast-1
Default output format [None]: json

これでpythonがAWS CLIを使ってauroraと接続するための準備が整いました。

pydataapiを使ってpythonで接続

ここからはpydataapiを使って、ローカル環境からauroraにアクセスしてみましょう。

  1. pip install pydataapi
  2. 次のコードをコピー/編集して、実行する
from pydataapi import DataAPI, Result

database = 'mydb'
resource_arn = 'aurora severlessのリソースARN'
secret_arn = 'aurora severlessのユーザ情報のシークレットARN'
data_api = DataAPI(resource_arn=resource_arn, secret_arn=secret_arn, database=database)
result: Result = data_api.execute('select * from sample_data')
print(result.all())

きちんと、auroraDBに格納した値が見れたと思います。

data_api_execute.executeの引数のクエリを書き換えればselect以外の命令も実行できます。

pydataapiにはSQLAlchmemyと接続する方法も用意されていますからORMが使いたい方もこれでOK!

ここから先は通常のRDB同様に操作可能です。

また、単にpandas.DataFrameをRDBから読み込みたいだけの場合

from sqlalchemy.engine import create_engine
engine = create_engine(
    'mysql+pydataapi://',
    connect_args={
        'resource_arn': resource_arn,
        'secret_arn': secret_arn,
        'database': database}
)
pd.read_sql("select * from sample_data", engine, parse_dates=['dt'])

のように、read_sql関数にdataapiとsqlalchemyで作られたコネクションengineを渡すことで簡単にRDBからDataFrameを取得できます。

以上。