Amazon Keyspacesに対してAWS SDKを使ってリソースの操作が出来るようになったので試してみた

2022.03.04

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

いわさです。

Amazon KeyspacesはApache Cassandra互換のマネージドデータベースです。

今まで利用したことがなかったのですが、どうやら先日まではAWS SDKに対応しておらずCLIなどからのリソース作成や削除などが出来なかったようです。
ただし、CloudFormationは対応していましたし、マネジメントコンソール上からテーブルの作成などは出来ていました。

以前の動作ログなど入手出来れば確認したかったのですが確認できず...内部的にはCQLが実行されているのですが、今回追加されたSDKも結局は内部でCQLでのコマンドがリクエストされる形になっています。

つかってみる

今日はKeyspaces入門も兼ねて、AWS CLIでキースペースとテーブルを作成し、その後簡単なデータ操作をしてみたいと思います。
AWS CLIでは、v1.22.66/v2.4.23から利用可能です。

Keyspace作成

KeyspaceのCreateList操作を行ってみます。
マネジメントコンソールでは作成したhogekeyspaceのみ表示されていますが、CLI上はシステムオブジェクトも確認出来ました。

$ aws keyspaces create-keyspace --keyspace-name hogekeyspace
{
    "resourceArn": "arn:aws:cassandra:ap-northeast-1:123456789012:/keyspace/hogekeyspace/"
}
$ aws keyspaces list-keyspaces
{
    "keyspaces": [
        {
            "keyspaceName": "system_schema",
            "resourceArn": "arn:aws:cassandra:ap-northeast-1:123456789012:/keyspace/system_schema/"
        },
        {
            "keyspaceName": "system_schema_mcs",
            "resourceArn": "arn:aws:cassandra:ap-northeast-1:123456789012:/keyspace/system_schema_mcs/"
        },
        {
            "keyspaceName": "system",
            "resourceArn": "arn:aws:cassandra:ap-northeast-1:123456789012:/keyspace/system/"
        },
        {
            "keyspaceName": "hogekeyspace",
            "resourceArn": "arn:aws:cassandra:ap-northeast-1:123456789012:/keyspace/hogekeyspace/"
        }
    ]
}

Table作成

こちらはTableのCreateListです。
Amazon KeyspacesではKeyspace作成時はほぼ設定出来る項目がないのですが、Table作成時に重要な様々なオプション(暗号化やバックアップ設定、スループットモードなど)を含めることが出来ます。
設定可能なオプションについては以下のドキュメントをご確認ください。

create-table — AWS CLI 2.4.23 Command Reference

この記事では特にオプションを指定せずに、標準的な列情報のみを指定します。

$ aws keyspaces create-table --keyspace-name hogekeyspace --table-name hogetable --schema-definition "allColumns=[{name=hoge1,type=int},{name=hoge2,type=text}],partitionKeys=[{name=hoge1}]"
{
    "resourceArn": "arn:aws:cassandra:ap-northeast-1:123456789012:/keyspace/hogekeyspace/table/hogetable"
}
$ aws keyspaces list-tables --keyspace-name hogekeyspace
{
    "tables": [
        {
            "keyspaceName": "hogekeyspace",
            "tableName": "hogetable",
            "resourceArn": "arn:aws:cassandra:ap-northeast-1:123456789012:/keyspace/hogekeyspace/table/hogetable"
        }
    ]
}
$ aws keyspaces get-table --keyspace-name hogekeyspace --table-name hogetable
{
    "keyspaceName": "hogekeyspace",
    "tableName": "hogetable",
    "resourceArn": "arn:aws:cassandra:ap-northeast-1:123456789012:/keyspace/hogekeyspace/table/hogetable",
    "creationTimestamp": "2022-03-04T13:36:02.117000+09:00",
    "status": "ACTIVE",
    "schemaDefinition": {
        "allColumns": [
            {
                "name": "hoge1",
                "type": "int"
            },
            {
                "name": "hoge2",
                "type": "text"
            }
        ],
        "partitionKeys": [
            {
                "name": "hoge1"
            }
        ],
        "clusteringKeys": [],
        "staticColumns": []
    },
    "capacitySpecification": {
        "throughputMode": "PAY_PER_REQUEST",
        "lastUpdateToPayPerRequestTimestamp": "2022-03-04T13:36:02.117000+09:00"
    },
    "encryptionSpecification": {
        "type": "AWS_OWNED_KMS_KEY"
    },
    "pointInTimeRecovery": {
        "status": "DISABLED"
    },
    "defaultTimeToLive": 0,
    "comment": {
        "message": ""
    }
}

データ操作

今回のSDK対応はDDLのみの対応となっています。
DMLは対応していませんので、DynamoDBでいうget-item操作相当のことはAWS CLIからは行うことが出来ません。
引き続き、CQLクライアントでアクセスしましょう。

さいごに

SDKによるリソース操作はCloudTrailを見る限りでは内部的にクエリリクエスト相当の情報を送信していました。
この実装方式であれば、同じようにDML操作のAPIもいずれ可能になる気はしますが、ネイティブクライアントが既に使えているのであまりメリットはないのかもしれませんね。

{
    "eventVersion": "1.08",
    "userIdentity": { ... },
    "eventTime": "2022-03-04T02:36:05Z",
    "eventSource": "cassandra.amazonaws.com",
    "eventName": "CreateKeyspace",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "203.0.113.1",
    "userAgent": "aws-cli/2.4.23 Python/3.8.8 Darwin/20.6.0 exe/x86_64 prompt/off command/keyspaces.create-keyspace",
    "requestParameters": {
        "rawQuery": "\n\tCREATE KEYSPACE \"hogecli\"\n\tWITH\n\t\tREPLICATION = {'class': 'SingleRegionStrategy'}\n\t\t",
        "keyspaceName": "hogecli"
    },
    "responseElements": null,
    "requestID": "b0d372b3-d3f1-4da1-b60e-764344164a8f",
    "eventID": "fa4a2402-594f-4da6-b6b8-1e20dfd74765",
    "readOnly": false,
    "resources": [
        {
            "accountId": "123456789012",
            "type": "AWS::Cassandra::Keyspace",
            "ARN": "arn:aws:cassandra:ap-northeast-1:123456789012:/keyspace/hogecli/"
        }
    ],
    "eventType": "AwsApiCall",
    "apiVersion": "3.4.4",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management"
}

AWS SDKから利用出来るようになると、サードパーティのツールなどからも利用出来るようになる可能性が出てきます。
もう既に、boto3であれば実は2つ前のマイナーバージョンv1.12.11からKeyspacesが利用可能になっています。

Terraformはまだ対応リソースに含まれていないようでしたが、こちらも近く対応されるようになるかもしれませんね。
Step Functionsなども期待したいところです。