ablog

不器用で落着きのない技術者のメモ

Amazon Keyspaces を使ってみる

Maven でビルドしたアプリから DataStax の Cassandra ドライバーを使って Amazon Keyspaces に CQL を投げてみた。

手順

サーバーサイド(KeySpaces)
  • テーブルを作成する
    • マネコンから Amazon Keyspaces のトップページから [Getting started] をクリック、ウイザードに従って tutorialkeyspace.tutorialtable テーブルを作成
  • IAM ユーザーを作成する
    • ユーザー名: keyspaces_user
    • IAMポリシー: AmazonKeyspacesFullAccess
  • 作成した IAM ユーザーで KeySpaces 用のクレデンシャルを作成する
    • IAM ユーザーを選択、[Security credentials] タブ-[Generate credentials] をクリック、クレデンシャルをダウンロードする
      • ★ 後で application.conf の advanced.auth-provider に記述する
クライアントサイド(EC2)
$ curl https://certs.secureserver.net/repository/sf-class2-root.crt -O
  • Starfield デジタル証明書を trustStore ファイルに変換する
$ openssl x509 -outform der -in sf-class2-root.crt -out temp_file.der
$ keytool -import -alias cassandra -keystore cassandra_truststore.jks -file temp_file.der
Enter keystore password: <6文字以上のパスワードを入力> ★ 後で application.conf の truststore-password に記述する
Re-enter new password: <同じパスワードを再入力>
Trust this certificate? [no]:  y
  • Maven をインストールする
$ sudo wget https://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
$ sudo sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo
$ sudo yum install -y apache-maven
  • Maven プロジェクトを作成する
$ mvn -B archetype:generate \
 -DarchetypeGroupId=org.apache.maven.archetypes \
 -DgroupId=com.keySpacesTest \
 -DartifactId=keySpacesTest
$ ls
keySpacesTest
  • cassandra_truststore.jks を keySpacesTest/src/main/resources 以下にコピーする
  • keySpacesTest/src/main/resources/application.conf 作成
datastax-java-driver {

    basic.contact-points = [ "cassandra.ap-northeast-1.amazonaws.com:9142"] ★東京リージョンを利用するので ap-northeast-1
    advanced.auth-provider{
        class = PlainTextAuthProvider
        username = "<ダウンロードした IAM ユーザーのクレデンシャルのユーザー名>"
        password = "<ダウンロードした IAM ユーザーのクレデンシャルのパスワード>"
    }
    basic.load-balancing-policy {
        local-datacenter = "ap-northeast-1" ★東京リージョンを利用するので ap-northeast-1
        slow-replica-avoidance = false           
    }

    advanced.ssl-engine-factory {
        class = DefaultSslEngineFactory
        truststore-path = "./src/main/resources/cassandra_truststore.jks"
        truststore-password = "<Starfield デジタル証明書を trustStore ファイルに変換時に入力したパスワード>"
        hostname-validation = false
      }
      
      basic.request {
            consistency = LOCAL_QUORUM
      }
}
  • ファイル構成
$ ls -1 keySpacesTest/src/main/resources/
application.conf
cassandra_truststore.jks
  • keySpacesTest/src/main/java/com/keySpacesTest/App.java を作成する
package com.keySpacesTest;

import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.config.DriverConfigLoader;
import com.datastax.oss.driver.api.core.cql.BatchStatement;
import com.datastax.oss.driver.api.core.cql.PreparedStatement;
import com.datastax.oss.driver.api.core.cql.DefaultBatchType;

public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Start to insert 2 rows into Amazon KeySpaces ..." );

        DriverConfigLoader loader = DriverConfigLoader.fromClasspath("application.conf");
        try (CqlSession session = CqlSession.builder()
                .withConfigLoader(loader)
                .build()) {

            PreparedStatement prepared = session.prepare("insert into tutorialkeyspace.tutorialtable(age, name, email) values (?, ?, ?)");
            BatchStatement batch = BatchStatement.newInstance(DefaultBatchType.UNLOGGED, 
                prepared.bind(28,"Oyama","yusuke@oyama.jp"),
                prepared.bind(29,"Otani","shohei@otani.com")
            );
            session.execute(batch);
        }
        System.out.println( "Finished successfully!" );

    }
}
  • keySpacesTest/pom.xml を編集する
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.keySpacesTest</groupId>
	<artifactId>keySpacesTest</artifactId>
	<packaging>jar</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>keySpacesTest</name>
	<url>http://maven.apache.org</url>
	<properties>
		<maven.compiler.source>11</maven.compiler.source>
		<maven.compiler.target>11</maven.compiler.target>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-assembly-plugin</artifactId>
				<version>3.1.1</version>
				<configuration>
					<appendAssemblyId>false</appendAssemblyId>
					<descriptorRefs>
						<descriptorRef>jar-with-dependencies</descriptorRef>
					</descriptorRefs>
					<archive>
						<manifest>
							<mainClass>com.keySpacesTest.App</mainClass>
						</manifest>
					</archive>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<version>3.1.1</version>
				<executions>
					<execution>
						<id>copy-dependencies</id>
						<phase>package</phase>
						<goals>
							<goal>copy-dependencies</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					<archive>
						<manifest>
							<mainClass>com.keySpacesTest.App</mainClass>
						</manifest>
					</archive>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.datastax.oss</groupId>
			<artifactId>java-driver-core</artifactId>
			<version>4.17.0</version>
		</dependency>
		<dependency>
			<groupId>com.datastax.oss</groupId>
			<artifactId>java-driver-query-builder</artifactId>
			<version>4.17.0</version>
		</dependency>
		<dependency>
			<groupId>com.datastax.oss</groupId>
			<artifactId>native-protocol</artifactId>
			<version>1.5.1</version>
		</dependency>
		<dependency>
			<groupId>com.datastax.cassandra</groupId>
			<artifactId>cassandra-driver-core</artifactId>
			<version>4.0.0</version>
		</dependency>
	</dependencies>
</project>
  • アプリケーションをビルドする
$ mvn clean
$ mvn package
  • アプリケーションを実行する
[ec2-user@ip-172-17-3-232 keySpacesTest]$ java -jar target/keySpacesTest-1.0-SNAPSHOT.jar 
Start to insert 2 rows into Amazon KeySpaces ...
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Finished successfully!
  • 実行結果