[アップデート] Amazon Keyspaces (for Apache Cassandra) が GA されました

新サービスはとりあえず触ってみましょう!
2020.04.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

先日、Amazon Managed Apache Cassandra Service あらため Amazon Keyspaces (for Apache Cassandra) が GA されました。

簡単にですが Amazon Keyspaces を触ってみたので、サービスの概要とあわせて紹介します。

目次

何がうれしいのか

従来オンプレミスでの Apache Cassandra は 1 ノード以上のクラスターで構成され、スケーリングに応じてノードの追加、削除といったノード管理が必要でしたが、Amazon Keyspaces はサーバーレスですので、ユーザーによるサーバー管理は不要です。

Amazon Keyspaces はオープンソースの Cassandra CQL API と互換性があるため、アプリケーションコードを引き続き使用しながら、既存の Cassandra テーブルを Amazon Keyspaces に移行できます。これまで オンプレミスの Cassandra から Amazon DynamoDB に伴う移行コストなどでやむを得ずオンプレミスで Cassandra を使い続けているユーザーにとっては非常に嬉しいことかと思います。

互換性はあるといえども、細かな部分ではサポートしていない機能、整合性レベルなどありますので詳細は以下、公式ガイドを確認ください。

次に Amazon Keyspaces の特徴や料金体系をみていきますが、Amazon DynamoDB とよく似た体系となっているので比較的すんなりと理解いただけるかと思います。

利点

Amazon Keyspaces には以下のような利点があります。

  • Apache Cassandra と互換性があるため、既存のアプリケーションコードを引き続き利用できる
  • サーバーレスで構成されており、プロビジョニング、パッチ適用といった管理は不要。負荷に応じたオートスケールも可能
  • 1 桁ミリ秒のパフォーマンス
  • Amazon Keyspaces も Amazon DynamoDB 同様に複数の AZ で 3 箇所に複製される

キャパシティモードと料金

料金体系は負荷に応じて変動する「オンデマンドモード」と、あらかじめ割り当ておく「プロビジョニングモード」があり、それぞれのキャパシティモードで料金が異なります。

  • オンデマンドモード
    • read/write に対して課金
  • プロビジョニングモード
    • 事前にキャパシティ要件が予測できる場合、コストが良い
    • 1 秒あたりの read/write 数を指定
    • オートスケーリング可能

キャパシティモードの変更は 1 日 1 回 可能です。

整合性

read の場合、LOCAL_ONELOCAL_QUORUM があります。

  • LOCAL_ONE
    • ストレージレプリカから最初の戻り値を返すことにより、パフォーマンスと可用性を最適化
  • LOCAL_QUORUM
    • 少なくとも 2 つのストレージレプリカが値を返すことを要求することにより、データの正確性を最適化

write の場合、すべての書き込みは耐久性のために LOCAL_QUORUM コンシステンシーになります。

Amazon DynamoDB で言うところの「結果整合性」と「強い整合性」ですね。

キャパシティユニット

  • 書き込みキャパシティユニット(WCU): 行あたり最大 1 KB/秒
  • 読み込みキャパシティユニット(RCU): 行あたり最大 4 KB/秒
    • LOCAL_ONE コンシステンシーの場合、半分の RCU が請求になります

オンデマンドモードの料金

以下、執筆時点での Amazon Keyspaces の価格です。比較のため Amazon DynamoDB も記載しました。

タイプ Amazon Keyspaces Amazon DynamoDB
書き込みリクエストユニット $1.6552/100万リクエスト $1.4269/100万リクエスト
読み込みリクエストユニット $0.331/100万リクエスト $0.285/100万リクエスト
ストレージ $0.34/GB $0.285/GB

DynamoDB は毎月 25 GB まで無料(支払いアカウント単位)ですが、Amazon Keyspaces には無期限の無料枠は無さそうです。

プロビジョニングモードの料金

タイプ Amazon Keyspaces Amazon DynamoDB
書き込みリクエストユニット $0.0008562/時間 $0.000742/時間
読み込みリクエストユニット 0.0001712/時間 $0.0001484/時間

利用可能リージョン

以下を除く全てのリージョンで利用可能

  • AWS GovCloud(米国)
  • 中国リージョン

やってみる

概要をおさえたところで、それではやってみましょう。今回は公式ガイドのチュートリアルを参考に進めていきます。

キースペースの作成

Amazon Keyspaces の管理コンソールから [Keyspaces] を開き、[Create Keyspace] をクリック。

[Keyspace name] を入力します。すると [Preview query] に CQL のクエリ文が表示されます。この CQL クエリを実行して作成することも可能です。今回は管理コンソールから進めますので [Create keyspace] をクリックします。

テーブルの作成

作成されたキースペース名をクリックします。

[Create table] をクリック。

[Table name] を入力し、次にスキーマを定義していきます。[Columns] セクションでテーブルに追加する列とデータ型を追加します。チュートリアルに従って、

各テーブルには必ずパーティションキーが必要となりますので、1 つ以上の列を指定します。今回、[Partition key] には id を選択しました。

次にクラスタリング列として division を指定します。クラスタリング列はパーティションキー内の行を並べ替えるために使用され、クエリのパフォーマンス向上に利用します。テーブルの作成後にクラスタリング列を追加、変更、削除することは出来ません。

[Read/write capacity settings] セクションで RCU/WCU を指定します。今回は On-demand で作成しますので特に指定する必要はありません。

せっかくなので Provisionded を選択した場合のメニューを確認しておきましょう。Scale automatically にチェックを入れるとオートスケールする際の最小、最大、しきい値などが指定できます。チェックを外した場合は固定のキャパシティユニット値の指定のみです。

キースペース作成同様に CQL クエリ文が表示されますので、CQL を使ってテーブル作成することも可能ですが、今回は管理コンソールで作成します。

キースペースへのアクセス

キースペースにアクセスするには 3 つの方法があります。

  • AWS 管理コンソール
  • cqlsh クライアント
  • Cassandra ドライバー

プログラムで接続する場合、IAM ユーザーに紐づくサービス固有の認証情報を利用します。(AWS CodeCommit でおなじみのアレです)キースペースアクセス用の IAM ユーザーを作成し、以下のように cassandra:* でフルアクセス権限を付与していますが、実環境では適切に絞り込んでください。

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "cassandra:*"
         ],
         "Resource":[
            "*"
         ]
      }
   ]
}

次に、IAM ユーザーに対して認証情報を設定しますので、IAM 管理コンソールの [Users] - [Security credentials] タブを開き、[Credentials for Amazon Managed Apache Cassandra Service (MCS)] の Generate credentials をクリック。(執筆時点では、まだサービス名が MCS のままでした)

cqlsh のインストール

今回は EC2 から cqlsh でアクセスしてみましょう。EC2 は amzn2-ami-hvm-2.0.20200406.0-x86_64-gp2 (ami-0f310fced6141e627) を使用しました。

当初、以下のように pipcqlsh をインストールしてみました。

$ sudo yum -y install python-pip
$ sudo pip install cqlsh
$ cqlsh --version
cqlsh 5.0.1

しかし、COPY コマンドで以下のエラーが出てしまい、うまく動作しませんでした。

'module' object has no attribute 'parse_options'

以下のように Apache cassandra パッケージごと cqlsh を入れたところ正常に動作しました。

$ sudo vi /etc/yum.repos.d/cassandra.repo
[cassandra]
name=Apache Cassandra
baseurl=https://downloads.apache.org/cassandra/redhat/311x/
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://downloads.apache.org/cassandra/KEYS

$ sudo yum install cassandra

TLS を使用した接続の暗号化

次のコマンドを使用して、Amazon デジタル証明書をダウンロードし、ホームディレクトリに保存します。

$ curl https://www.amazontrust.com/repository/AmazonRootCA1.pem -O

cqlshrc の編集

$HOME/.cassandra/cqlshrcファイルを編集し、次のように書きました。

$ vi ~/.cassandra/cqlshrc
[connection]
port = 9142
factory = cqlshlib.ssl.ssl_transport_factory

[ssl]
validate = true
certfile =  ~/AmazonRootCA1.pem

[cql]
version = 3.4.4

ガイドに [cql] の記載はありませんでしたが、そのまま接続しようとすると以下のようなエラーになり接続できませんでした。

Connection error: ('Unable to connect to any servers', {'3.112.64.145:9142': ProtocolError("cql_version '3.3.1' is not supported by remote (w/ native protocol). Supported versions: [u'3.4.4']",)})

次のコマンドを使用して、Amazon Keyspaces に接続します。host各リージョンのエンドポイントに置き換えてください。

$ cqlsh <host> 9142 -u "keyspaces-user-at-XXXXXXXXXXX" -p "<PASSWORD>" --ssl

接続できると以下のように表示されます。

Connected to Amazon Managed Apache Cassandra Service at cassandra.ap-northeast-1.amazonaws.com:9142.
[cqlsh 5.0.1 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
keyspaces-user-at-XXXXXXXXXXXX@cqlsh>

動作確認

整合性の設定

公式ガイドのサンプルクエリを実行したところ LOCAL_QUORUM じゃないとダメだと。

@cqlsh> INSERT INTO "cm_keyspace".employees_tbl (id, name, project, region, division, role, pay_scale, vacation_hrs, manager_id) VALUES ('012-34-5678','Russ','NightFlight','US','Engineering','IC',3,12.5, '234-56-7890') ;
InvalidRequest: Error from server: code=2200 [Invalid query] message="Consistency level ONE is not supported for this operation. Supported consistency levels are: LOCAL_QUORUM"

メッセージのとおり LOCAL_QUORUM に整合性レベルを設定をします。

@cqlsh> CONSISTENCY;
Current consistency level is ONE.

@cqlsh> CONSISTENCY LOCAL_QUORUM ;
Consistency level set to LOCAL_QUORUM.

@cqlsh> CONSISTENCY ;
Current consistency level is LOCAL_QUORUM.

単一レコードの挿入

@cqlsh> INSERT INTO "cm_keyspace".employees_tbl (id, name, project, region, division, role, pay_scale, vacation_hrs, manager_id) VALUES ('012-34-5678','Russ','NightFlight','US','Engineering','IC',3,12.5, '234-56-7890') ;

@cqlsh> SELECT * FROM "cm_keyspace".employees_tbl ;

 id          | division    | manager_id  | name | pay_scale | project     | region | role | vacation_hrs
-------------+-------------+-------------+------+-----------+-------------+--------+------+--------------
 012-34-5678 | Engineering | 234-56-7890 | Russ |         3 | NightFlight |     US |   IC |         12.5

複数レコードの挿入

sampledata.zip をダウンロードし、展開した employees.csv を使って複数レコードを挿入します。

@cqlsh> USE "cm_keyspace" ;

@cqlsh:cm_keyspace> COPY employees_tbl (id,name,project,region,division,role,pay_scale,vacation_hrs,manager_id) FROM 'employees.csv' WITH delimiter=',' AND header=TRUE ;
Reading options from the command line: {'header': 'TRUE', 'delimiter': ','}
Using 1 child processes

Starting copy of cm_keyspace.employees_tbl with columns [id, name, project, region, division, role, pay_scale, vacation_hrs, manager_id].
Processed: 7 rows; Rate:       4 rows/s; Avg. rate:       8 rows/s
7 rows imported from 1 files in 0.901 seconds (0 skipped).

@cqlsh:cm_keyspace> SELECT * FROM "cm_keyspace".employees_tbl ;

 id          | division    | manager_id  | name    | pay_scale | project     | region | role    | vacation_hrs
-------------+-------------+-------------+---------+-----------+-------------+--------+---------+--------------
 012-34-5678 | Engineering | 234-56-7890 |    Russ |         3 | NightFlight |     US |      IC |         12.5
 789-01-2345 |   Executive |        None | Roberta |        15 |         All |     US |     CEO |          184
 567-89-0123 |   Marketing | 678-90-1234 |   Ahmed |         4 | NightFlight |     US |      IC |           88
 234-56-7890 | Engineering | 789-01-2345 |     Bob |         6 | NightFlight |     US | Manager |           72
 456-78-9012 | Engineering | 234-56-7890 |    Beth |         7 | NightFlight |     US |      IC |        100.5
 123-45-6789 | Engineering | 234-56-7890 |     Bob |         1 | NightFlight |     US |  Intern |            0
 678-90-1234 |   Marketing | 789-01-2345 |    Alan |         3 |       Storm |     US | Manager |         18.4
 345-67-8901 | Engineering | 234-56-7890 |   Sarah |         4 |       Storm |     US |      IC |          108

(8 rows)

もちろん AWS 管理コンソールの [CQL editor] でも実行可能です。

列のサブセットを照会

@cqlsh:cm_keyspace> SELECT name, id, manager_id FROM employees_tbl ;

 name    | id          | manager_id
---------+-------------+-------------
    Russ | 012-34-5678 | 234-56-7890
 Roberta | 789-01-2345 |        None
   Ahmed | 567-89-0123 | 678-90-1234
     Bob | 234-56-7890 | 789-01-2345
    Beth | 456-78-9012 | 234-56-7890
     Bob | 123-45-6789 | 234-56-7890
    Alan | 678-90-1234 | 789-01-2345
   Sarah | 345-67-8901 | 234-56-7890

(8 rows)

行のサブセットを照会

id=234-56-7890 を持つ従業員レコードのみを取得。

@cqlsh:cm_keyspace> SELECT * FROM employees_tbl WHERE id='234-56-7890' ;

 id          | division    | manager_id  | name | pay_scale | project     | region | role    | vacation_hrs
-------------+-------------+-------------+------+-----------+-------------+--------+---------+--------------
 234-56-7890 | Engineering | 789-01-2345 |  Bob |         6 | NightFlight |     US | Manager |           72

(1 rows)

単一のセルを更新

@cqlsh:cm_keyspace> UPDATE employees_tbl SET pay_scale=5 WHERE id='567-89-0123' AND division='Marketing' ;

@cqlsh:cm_keyspace> SELECT * FROM employees_tbl WHERE id='567-89-0123' ;

 id          | division  | manager_id  | name  | pay_scale | project     | region | role | vacation_hrs
-------------+-----------+-------------+-------+-----------+-------------+--------+------+--------------
 567-89-0123 | Marketing | 678-90-1234 | Ahmed |         5 | NightFlight |     US |   IC |           88

(1 rows)

単一のセル削除

@cqlsh:cm_keyspace> DELETE manager_id FROM employees_tbl WHERE id='012-34-5678' and division='Engineering' ;

@cqlsh:cm_keyspace> SELECT * FROM "cm_keyspace".employees_tbl ;

 id          | division    | manager_id  | name    | pay_scale | project     | region | role    | vacation_hrs
-------------+-------------+-------------+---------+-----------+-------------+--------+---------+--------------
 012-34-5678 | Engineering |        null |    Russ |         3 | NightFlight |     US |      IC |         12.5
 789-01-2345 |   Executive |        None | Roberta |        15 |         All |     US |     CEO |          184
 567-89-0123 |   Marketing | 678-90-1234 |   Ahmed |         5 | NightFlight |     US |      IC |           88
 234-56-7890 | Engineering | 789-01-2345 |     Bob |         6 | NightFlight |     US | Manager |           72
 456-78-9012 | Engineering | 234-56-7890 |    Beth |         7 | NightFlight |     US |      IC |        100.5
 123-45-6789 | Engineering | 234-56-7890 |     Bob |         1 | NightFlight |     US |  Intern |            0
 678-90-1234 |   Marketing | 789-01-2345 |    Alan |         3 |       Storm |     US | Manager |         18.4
 345-67-8901 | Engineering | 234-56-7890 |   Sarah |         4 |       Storm |     US |      IC |          108

(8 rows)

行の削除

@cqlsh:cm_keyspace> DELETE FROM employees_tbl WHERE id='012-34-5678' ;

@cqlsh:cm_keyspace> SELECT * FROM employees_tbl ;

 id          | division    | manager_id  | name    | pay_scale | project     | region | role    | vacation_hrs
-------------+-------------+-------------+---------+-----------+-------------+--------+---------+--------------
 789-01-2345 |   Executive |        None | Roberta |        15 |         All |     US |     CEO |          184
 567-89-0123 |   Marketing | 678-90-1234 |   Ahmed |         5 | NightFlight |     US |      IC |           88
 234-56-7890 | Engineering | 789-01-2345 |     Bob |         6 | NightFlight |     US | Manager |           72
 456-78-9012 | Engineering | 234-56-7890 |    Beth |         7 | NightFlight |     US |      IC |        100.5
 123-45-6789 | Engineering | 234-56-7890 |     Bob |         1 | NightFlight |     US |  Intern |            0
 678-90-1234 |   Marketing | 789-01-2345 |    Alan |         3 |       Storm |     US | Manager |         18.4
 345-67-8901 | Engineering | 234-56-7890 |   Sarah |         4 |       Storm |     US |      IC |          108

(7 rows)

簡単ですが、検証は以上です。

さいごに

re:Invent 2019 で Amazon Managed Apache Cassandra Service が発表されたときの歓喜の声が印象的でしたので、待望の GA というところでしょうか。

オンプレミスの Apache Cassandra をクラウドに持っていきたいが、Amazon DynamoDB に移行するのはちょっと大変、と二の足を踏んでいた方には朗報ですね!

RCU/WCU の考え方や料金体系も Amazon DynamoDB と似ており馴染みやすいかと思います。サーバーレスな従量課金サービスですので、気になる方はサクッとおためしください!

以上!大阪オフィスの丸毛(@marumo1981)でした!