AWSのAurora Severlessを使いAPIを組もうかと思ったのですが、素人過ぎてデータのやり取りすらままならんかったので、その工程を残しました。
執筆時点 2021/04/17
Aurora severless 構築
- AmazonRDSのコンソールを開きます
- 「データベースを作成」を開始
- データベース作成方法: 標準作成
- エンジンのオプション: Amazon Aurora
- エディション: MySQL との互換性を持つ Amazon Aurora
- キャパシティータイプ:サーバーレス
- バージョン:Aurora(MySQL)-5.6.10a
- DB クラスター識別子: お好みのDB名(ここではtest-db1)
- マスターユーザー名: admin (本番はここもadmin以外にすべきか?)
- マスターパスワード: お好きなパスワード
- キャパシティの設定: 最小Aurora キャパシティユニット 1, 最大Aurora キャパシティユニット 1
- スケーリングの追加設定:「数分間アイドル状態のままの場合コンピューティング性能を一時停止する」にチェック、30分のアイドルで1時停止(開発用につくるため開発時間外の費用を抑えるため)
- VPC: デフォルトVPC
- サブネットグループ: デフォルトvpc-〇〇
- 既存のVPCセキュリティグループ: default
- 追加の接続設定:Data APIにチェック
- データベースを作成を押す
ここでDataAPIにチェックを入れたのは、Aurora Severlessとの交信にはこのDataAPIが必要になるためです。結構大切なオプションなのに、デフォルトでチェックが入っていないので注意。
Aurora severlessのリソースARNをメモする
- AmazonRDSのコンソールを開きます
- データベースを開く
- 作成したDBをダブルクリック
シークレットの作成
DBにアクセスする際、このシークレットを使ってユーザやパスワードの代わりにするらしい。
- Secrets Managerを開く
- 「新しいシークレットを保存する」を選択
- auroraのために設定した「ユーザ名」「パスワード」を記入
- DBインスタンスに先程作成したauroraを選択
- 次へ
- シークレットの名前や説明を適当につける。今回は名前を「test-db1-admin-secret」とした
- 次へ
- 自動ローテーションは無効のまま、次へ
- シークレットを作成する
シークレットができたら、出来上がったシークレットを開き、シークレットのARNをメモする
データベースに接続してクエリディタを開く
データベースを操作するためのエディタを開きます
- AmazonRDSに戻る
- 左側「データベース」タブを選択
- 作成したauroraDBを選択
- 右上「アクション」→「クエリ」を選択
- 以下を確認/入力
- データベースインスタンスが作成したものになっていること
- データベースユーザ名に「Secrets Manager ARNと接続する」を選択
- 前項「シークレットを作成」で作ったシークレットARNを写す
- 「データベースに接続」します
データベースにテーブルやデータを追加
作ったままのauroraには何もデータが入っていないので、テスト用のDBとテーブルを作成し、データも追加します。
- とりあえず、デフォルトでエディタに表記されているクエリ
select * from information_schema.tables;
を実行してみる- この時点ではDBが休止状態に入っている可能性があり、エラーが返ってくるかもしれません。数分経ってからもう一度実行してみましょう。
- 実行できたら、DBを追加するために
create database mydb;
を実行。mydb
はDB名なので好みで変更可-
show databases;
を実行して、dbが作成できていることを確認
-
- データテーブルを追加します
create table mydb.sample_data (id int, name varchar(20), dt datetime);
を実行。-
show tables from mydb
で作成できたことを確認
-
-
insert into mydb.sample_data (id, name, dt) values (100, 'inten', now());
を実行。適当なデータを挿入する。- 自分で複数挿入すると面白いので推奨です。
select * from mydb.sample_data;
で入力値を確認できます。
- 自分で複数挿入すると面白いので推奨です。
AWS CLI用にIAMユーザを作成
いよいよpythonを使った接続です。
しかし、このためにはAWS CLI用のユーザの作成を先に済ます必要があります。
AWS CLIは今までコンソールで行っていたことを、ローカルのPCなどの他の環境でも行うためのツールです。
pythonでAWSのサービスに接続する際も間接的にAWS CLIを使ってAWSのサービスとやり取りを行っているようです。
awsコンソールにIAMが必要なように、AWS CLIにもIAMが必要です。
- awsコンソールでIAMを開きます
- ユーザを追加を選択
- 「プログラムによるアクセス」にチェックを入れ、ユーザ名を記入する
- 権限を付与する
- 権限はそれぞれ方針があると思います。「AdministratorAccess」あたりを付けるのが楽ですが、注意は必要です。
- 確認する
- シークレットアクセスキーを保存する
AWS CLIのインストールと設定
pip install awscli
-
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にアクセスしてみましょう。
pip install pydataapi
- 次のコードをコピー/編集して、実行する
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を取得できます。
以上。