パブリックプレビューなPostgreSQL互換Amazon Auroraにアクセスしてみた

本記事はプレビュー版を評価したものです。正式サービス時には仕様が変更される可能性がある点にはご注意ください。

AWSにはAmazon Auroraというリレーショナルデータベースサービスがあります。 商業用データベースのセキュリティ、可用性、および信頼性を 10 分の 1 のコストで提供します。

リリース当初はMySQL互換のみでしたが、2016年のre:inventでPostgreSQL互換なAurora(以下「Aurora(PostgreSQL)」)が発表されました。

Announcing PostgreSQL compatibility for Amazon Aurora

2017年4月19日からパブリックプレビューの募集が始まり、利用申請が通ったため、軽く触ってみました。

Announcing Open Preview of Amazon Aurora with PostgreSQL Compatibility

本記事の執筆にあたり、次のブログに大いにインスパイアされています

Azure Database for PostgreSQLにアクセスしてみた

PostgreSQL互換Auroraのプレビュー申請方法について

次のURLからお申込み下さい。

https://pages.awscloud.com/amazon-aurora-with-postgresql-compatibility-preview-form.html

申請時にはAWSアカウントIDが必要です。お持ち出ない場合、まずはAWSアカウントをお作り下さい。

私の場合、次の件名で申請通過のメールが届きました。

Welcome to the Preview of Amazon Aurora with PostgreSQL compatibility!

プレビュー版Aurora(PostgreSQL)について

  • プレビューとGAでは仕様が異なる可能性があります
  • プレビュー版Aurora(PostgreSQL)の起動はサンドボックスリージョンで提供されます
  • インスタンスの起動・ストレージに関する費用は発生しません
  • PostgreSQL 9.6.2互換です
  • 以下のインスタンスクラスが提供されています
    • db.r3.8xlarge
    • db.r4.2xlarge (NEW@2017/05/27)
    • db.r4.4xlarge
    • db.r4.8xlarge
    • db.r4.16xlarge
  • AWSアカウントあたり3インスタンスまで作成可能です
  • リードノードに対応しています
  • 2相コミットには対応していません
  • RDS PostgreSQL 9.6.2で対応しているすべてのエクステンションに対応しています
  • EC2/EBS上に構築したPostgreSQLに比べて、1−2倍のパフォーマンスを発揮します

また、GAでは対応予定の以下の機能は現時点のプレビューでは対応していません

  • "Survivable" キャッシュウォーミング(インスタンスをリスタートしてもキャッシュが生き続ける)
  • Amazon RDS PostgreSQLのスナップショットからのAuroraインスタンス作成

それでは試してみましょう

Aurora(PostgreSQL)のリソースを作成する

プレビュー申請通過メールにサンドボックスリージョンへのリンクが含まれています。

クリックしてサンドボックスリージョンにアクセスします。

aws-pg-top

Instances からAurora(PostgreSQL)の作成画面に遷移します。

Step 1 : Select Engine(エンジンを選択)

サンドボックスリージョンのため、選択可能なDBエンジンは「Aurora(PostgreSQL)」のみでした。

step1-selec-region

Up to 3 times the throughput of PostgreSQL" としらっと書いてあります。

Step 2 : Specify DB Details(DBの詳細を指定)

step2-specify-db-details

  • インスタンスクラス
  • インスタンスID
  • ユーザー名
  • パスワード

などを設定します。

Step 3 : Configure Advanced Settings(発展的な設定を指定)

step3-configure-advanced-settings

RDS インスタンス作成時におなじみの

  • Network & Security
  • Database Options
  • Failover
  • Backup
  • Monitoring
  • Maintenance

などを設定します。

"Publicly Accessible"を"Yes"にしておくと、インスタンスにアクセスしやすくなります。

"Launch DB Instance" ボタンをクリックすると、インスタンスが作成されます。

step4-instance-created

Aurora(PostgreSQL)に接続する

PostgreSQL互換AuroraにはMySQL互換Auroraと同じく2種類のエンドポイントが存在します。

  • Cluster Endpoint : 書き込み用のエンドポイント
  • Reader Endpoint : 読み取り専用のエンドポイント

エンドポイントはインスタンス詳細ページで確認できます

aws-pg-instance-detail

今回は psql でAuroraに接続します

クラスターエンドポイントにアクセス

$ CLUSTER_HOST=XXX.YYY.***.rds.amazonaws.com
$ psql -h $CLUSTER_HOST -U username dbname
Password for user username:
psql (9.5.4, server 9.6.2)
WARNING: psql major version 9.5, server major version 9.6.
         Some psql features might not work.
SSL connection (protocol: TLSv1.2, cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

test=> select version();
                                 version
------------------------------------------------------------------------------
PostgreSQL 9.6.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.9.3, 64-bit
(1 row)

バージョン情報を信じると、接続先のPostgreSQLのバージョンは9.6.2となっています。 "Aurora"の文字は見当たりません。

ウィザードにしたがってセキュリティグループを新規作成すると、デフォルトではAMCにアクセスしているIPアドレスのみがアクセス元として許可されていました。 他の環境からAuroraにアクセスする場合は、セキュリティグループを修正してください。

リーダーエンドポイント

$ READER_HOST=XXX.YYY.***.rds.amazonaws.com
$ psql -h $READER_ENDPOINT -U username dbname
Password for user username:
psql (9.5.4, server 9.6.2)
WARNING: psql major version 9.5, server major version 9.6.
         Some psql features might not work.
SSL connection (protocol: TLSv1.2, cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

test=>

リーダーノードに対して更新処理を流してみましょう

test=> create table foo(bar integer);
ERROR:  cannot execute CREATE TABLE in a read-only transaction

read-only のため、成功しませんでした。

PostgreSQLユーザー

RDSメンテ用のPostgreSQLスーパーユーザー(rdsadmin)とは別に「Step 2 : Specify DB Details」で作成したユーザー(username)も確認できます。

test=> select * from pg_user;
usename  | usesysid | usecreatedb | usesuper | userepl | usebypassrls |  passwd  | valuntil |                                               useconfig

----------+----------+-------------+----------+---------+--------------+----------+----------+---------------------------------------------------------------------------------------
-----------------
username |    16393 | t           | f        | f       | f            | ******** | infinity |
rdsadmin |       10 | t           | t        | t       | t            | ******** | infinity | {log_statement=all,log_min_error_statement=debug5,log_min_messages=panic,exit_on_error
=0,TimeZone=utc}
(2 rows)

collation

インスパイアされたブログに合わせて collation も確認します。

test=> \l
                                List of databases
 Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres  | username | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
rdsadmin  | rdsadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
template0 | rdsadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin          +
         |          |          |             |             | rdsadmin=CTc/rdsadmin
template1 | username | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/username          +
         |          |          |             |             | username=CTc/username
test      | username | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
(5 rows)

EXTENSIONを見てみる

さて、PostgreSQL と言えば EXTENSION です。 というわけで、最初からセットアップされている EXTENSION と、追加で使える EXTENSION を確認してみました。 以下は最初からインストールされている EXTENSION です。

test=> select * from pg_extension;
extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
---------+----------+--------------+----------------+------------+-----------+--------------
plpgsql |       10 |           11 | f              | 1.0        |           |
(1 row)

PostgreSQL向けSQL手続き言語である PL/pgSQLだけが有効化されていました。

以下は CREATE EXTENSION を実行すれば使える EXTENSION です。 合計52個とてんこ盛りです。

test=> select * from pg_available_extensions;
             name             | default_version | installed_version |                                                       comment

------------------------------+-----------------+-------------------+----------------------------------------------------------------------------------------------------------------
-----
 intagg                       | 1.1             |                   | integer aggregator and enumerator (obsolete)
 plperl                       | 1.0             |                   | PL/Perl procedural language
 plcoffee                     | 1.5.3           |                   | PL/CoffeeScript (v8) trusted procedural language
 unaccent                     | 1.1             |                   | text search dictionary that removes accents
 pg_stat_statements           | 1.4             |                   | track execution statistics of all SQL statements executed
 plls                         | 1.5.3           |                   | PL/LiveScript (v8) trusted procedural language
 aurora_stat                  | 1.0             |                   | Extension for viewing aurora statistics and object information
 chkpass                      | 1.0             |                   | data type for auto-encrypted passwords
 ip4r                         | 2.0             |                   |
 intarray                     | 1.2             |                   | functions, operators, and index support for 1-D arrays of integers
 dict_xsyn                    | 1.0             |                   | text search dictionary template for extended synonym processing
 pg_visibility                | 1.1             |                   | examine the visibility map (VM) and page-level visibility info
 citext                       | 1.3             |                   | data type for case-insensitive character strings
 tsm_system_rows              | 1.0             |                   | TABLESAMPLE method which accepts number of rows as a limit
 hstore_plperl                | 1.0             |                   | transform between hstore and plperl
 postgres_fdw                 | 1.0             |                   | foreign-data wrapper for remote PostgreSQL servers
 uuid-ossp                    | 1.1             |                   | generate universally unique identifiers (UUIDs)
 sslinfo                      | 1.2             |                   | information about SSL certificates
 pgstattuple                  | 1.4             |                   | show tuple-level statistics
 pg_trgm                      | 1.3             |                   | text similarity measurement and index searching based on trigrams
 ltree                        | 1.1             |                   | data type for hierarchical tree-like structures
 tablefunc                    | 1.0             |                   | functions that manipulate whole tables, including crosstab
 plv8                         | 1.5.3           |                   | PL/JavaScript (v8) trusted procedural language
 btree_gin                    | 1.0             |                   | support for indexing common datatypes in GIN
 dict_int                     | 1.0             |                   | text search dictionary template for integers
 postgis                      | 2.3.0           |                   | PostGIS geometry, geography, and raster spatial types and functions
 pgcrypto                     | 1.3             |                   | cryptographic functions
 dblink                       | 1.2             |                   | connect to other PostgreSQL databases from within a database
 pg_buffercache               | 1.2             |                   | examine the shared buffer cache
 plpgsql                      | 1.0             | 1.0               | PL/pgSQL procedural language
 postgis_topology             | 2.3.0           |                   | PostGIS topology spatial types and functions
 xml2                         | 1.1             |                   | XPath querying and XSLT
 fuzzystrmatch                | 1.1             |                   | determine similarities and distance between strings
 test_parser                  | 1.0             |                   | example of a custom parser for full-text search
 pltcl                        | 1.0             |                   | PL/Tcl procedural language
 address_standardizer         | 2.2.2           |                   | Used to parse an address into constituent elements. Generally used to support geocoding address normalization step.
 isn                          | 1.1             |                   | data types for international product numbering standards
 earthdistance                | 1.1             |                   | calculate great-circle distances on the surface of the Earth
 postgis_tiger_geocoder       | 2.3.0           |                   | PostGIS tiger geocoder and reverse geocoder
 tsearch2                     | 1.0             |                   | compatibility package for pre-8.3 text search functions
 hstore                       | 1.4             |                   | data type for storing sets of (key, value) pairs
 cube                         | 1.2             |                   | data type for multidimensional cubes
 pageinspect                  | 1.5             |                   | inspect the contents of database pages at a low level
 pgrowlocks                   | 1.2             |                   | show row-level locking information
 bloom                        | 1.0             |                   | bloom access method - signature file based index
 pg_prewarm                   | 1.1             |                   | prewarm relation data
 tsm_system_time              | 1.0             |                   | TABLESAMPLE method which accepts time in milliseconds as a limit
 address_standardizer_data_us | 2.2.2           |                   | Address Standardizer US dataset example
 btree_gist                   | 1.2             |                   | support for indexing common datatypes in GiST
 apgdbcc                      | 1.0             |                   | Extension for testing and ops
 log_fdw                      | 1.0             |                   | foreign-data wrapper for Postgres log file access
 pg_freespacemap              | 1.1             |                   | examine the free space map (FSM)
(52 rows)

"aurora_stat(Extension for viewing aurora statistics and object information)" が気になりますね。

PL/Pythonはいろいろゴニョゴニョ出来る untrusted なエクステンションなためか available ではありませんでした。

有効化されていないExtensionはCREATE EXTENSIONできます。

test=> create extension postgis;
CREATE EXTENSION

Aurora(PostgreSQL)リソースの設定項目

サーバパラメータ

MySQL互換Auroraと同じく、以下の2種類が存在します。

  • DBパラメータグループ:クラスター内の単一のDBインスタンスに適用される
  • DBクラスターパラメータグループ:DBクラスター内のすべてのDBインスタンスに適用される

監視できるメトリックス

標準のメトリクスとは別に、インスタンス作成時の Step 3 で

  • Enhanced Monitoring:DBインスタンスが起動しているOSのメトリクス
  • Performance Insights:SQLパフォーマンス分析ツール。PostgreSQL互換Auroraで初導入

もオプションで有効にできます。

標準モニタリング

pg-default-monitoring

拡張モニタリング

pg-enhanced-monitoring

Performance Insights

pg-performance-insights

まとめ

というわけで、ざっとPostgreSQL互換Amazon Auroraを見てみました。

インターフェースはPostgreSQLでありながら、DBクラスターとしてはAuroraを踏襲しています。

RDS/オンプレPostgreSQLからAurora(PostgreSQL)への移行機能はまだこなれていない印象があります。 GAで予定されているスナップショットからのAurora(PostgreSQL)起動など、マイグレート機能の強化が待ち遠しいですね。

参考