Amazon Web Services ブログ

マネージドスキーマを使用して Amazon Cloud Directory 上でアプリケーションを迅速に開発する

この度、Amazon Cloud Directory がマネージドスキーマを使用して、アプリケーションを迅速に開発できるようになりました。マネージドスキーマを使うと、ディレクトリを作成して、それからオブジェクトの作成と検索をさらにすばやく開始できます。今回の立ち上げでは、QuickStartSchema という Cloud Directory マネージドスキーマが利用可能となっています。豊富な種類の階層データモデルを構築し、Amazon Cloud Directory の Typed Links などの構造を使用して、オブジェクト間の関係性を確立することができます。ひいては、階層をトラバースすることで、データ内の任意の情報をクエリすることができます。

Amazon Cloud Directoryでは、動的ファセットという新しいスタイルのファセットも導入されています。これにより、ファセット内の属性を定義しなくても、アプリケーションを迅速にプロトタイプし、開始できるようになりました。アプリケーションのさらなる開発に際して、新しい属性を追加したり、属性に格納されている値をサポートされている他のデータ型へと後日変更したりすることが可能です。

Amazon Cloud Directory では、バリアントという新しいデータ型も導入されています。バリアントデータ型として定義された属性の値を格納するには、Amazon Cloud Directory でサポートされているプリミティブデータ型のいずれかの値 (例えば、文字列またはバイナリ) を利用します。その後、属性の値を別のデータ型に変更することもできます。データ検証を強制されることはありません。

Amazon Cloud Directory は、QuickStartSchema の 1 つのファセットを動的スタイルとして定義しました。これにより、アプリケーションに必要な任意の数の属性を作成することが可能となります。このファセットを使用して任意の属性を作成すると、バリアントデータ型として作成されます。

のブログ記事では、学校のスポーツチームの生徒を追跡するアプリケーションを作成する方法を説明します。Amazon Cloud Directory と新しい QuickStartSchema を使用します。生徒を 1 次元、そしてスポーツチームを 2 次元で作成します。生徒とチームの情報をディレクトリに追加し、データをクエリします。

このブログ記事の例では、Java コードを使用しています。AWS SDK に精通しており、Java ベースのコードを使って Amazon Cloud Directory のコード例を構築できるものとしましょう。この記事で示した概念を、Python や Ruby など他のプログラミング言語に適用してもらって結構です。

Amazon Cloud Directory マネージドスキーマを使って、すばやい開発を行う

スポーツチームのディレクトリアプリケーションを大急ぎで開発し、すぐに利用したいとします。階層をトラバースする階層データとクエリが必要です。生徒名やスポーツチーム名など、保存しているデータ型には所定の値が決まっていないため、Cloud Directory が提供するデータ型や制限を確認する作業は必要ありません静的ファセット。つまり私のニーズは、Amazon Cloud Directory QuickStartSchema が提供する機能と一致しています。このスキーマでは、アプリケーションを開発し、階層クエリなどの Amazon Cloud Directory の機能を使用できます。このスキーマを使用することで、自分のディレクトリを直接作成することができるため、スキーマの作成や管理プロセス (以前のブログ記事で説明したスキーマのライフサイクル) にかかる時間と労力を節約できるのです。

アプリケーションは、サッカーやバドミントンなどの異なるスポーツチームのメンバーである生徒を追跡します。以下で、データモデルを示します。スポーツチームのメンバーである生徒を表すのに、Student poolの下にシンプルな階層を作成しました。同様に、別の階層では、異なるスポーツチームが表されています。Typed Links を使って生徒とスポーツチームの関係性を確立します。

QuickStartSchema と呼ばれるマネージドスキーマは、Cloud Directory のあらゆるお客様が利用でき、定数 ARN で直接参照することができます。

QuickStartSchema 内で、Cloud Directory は DynamicObjectFacet という 1 つの動的ファセットを定義するようにしました。このファセットを用いて、NODELEAF_NODE または POLICY 型のオブジェクトを作成できます。私のアプリケーションでは、 StudentPool NODE オブジェクトとして、また JaneJimLEAF_NODE オブジェクトとして作成することにします。同じように、QuickStartSchema内で、Amazon Cloud Directory は DynamicTypedLinkFacet という 1 つのTyped Link ファセットも定義しています。これは DynamicTypedLinkAttribute と呼ばれる 1 つの属性を持ちます。この Typed Link を使用して、生徒とチームの関係性を確立します。サンプルアプリケーションのデータモデル

QuickStartSchema を使用して、ディレクトリを作成する

次のコードは、SportsTeamDirectory というディレクトリを作成します。QuickStartSchema ARN を使用しています。適用されるスキーマ ARN とディレクトリ ARN の値を取得します。次のコード例から分かるように、スキーマを作成し、公開する必要はありません。

// Create a directory using the QuickStartSchema.Specify a 
// directory name that must be unique within an AWS account.

String QUICK_START_SCHEMA_ARN = "arn:aws:clouddirectory:::schema/managed/quick_start/1.0/001" ;

CreateDirectoryRequest createDirectoryRequest = new 
	CreateDirectoryRequest()
    .withName("SportsTeamDirectory") // Directory name
    .withSchemaArn(QUICK_START_SCHEMA_ARN);

CreateDirectoryResult createDirectoryResult = 
	client.createDirectory(createDirectoryRequest);

String directoryArn = createDirectoryResult.getDirectoryArn();
String appliedSchemaArn = createDirectoryResult.getAppliedSchemaArn();

ディレクトリ内にオブジェクトを作成する

次のコードは、オブジェクトに格納されるキーと値のペアのマップとして、属性を使用してオブジェクトを作成します。

// Create “Student pool”, student and team objects 

Map<String, String> studentPoolAttributeMap = new HashMap<>();
studentPoolAttributeMap.put("Name", "StudentPool");

String studentPoolObjectId = createDirectoryObject("/", "Students", studentPoolAttributeMap, ObjectType.NODE);

Map<String, String> janeAttributeMap = new HashMap<>();
janeAttributeMap.put("Name", "Jane");
janeAttributeMap.put("EmailAddress", "jane@someschool.edu");

String janeObjectId = createDirectoryObject("/Students", "Id-123", janeAttributeMap, ObjectType.LEAF_NODE);

/**
* 同様のコードを使用して、すべての生徒とチームのオブジェクトを作成することができます
* 
* 次のコード例では、「createDirectoryObject」というヘルパーメソッドを定義して
* オブジェクトを作成しています。「DynamicObjectFacet」は Cloud Directory で定義したファセットです
* QuickStartSchema でオブジェクトを作成できます。
*/
private String createDirectoryObject(String parentReference, String linkName, Map<String, String> attributeMap, ObjectType objectType) {
              List<AttributeKeyAndValue> attributeList = new ArrayList<>();

              for (Map.Entry<String, String> entry : attributeMap.entrySet()) {
                     attributeList.add(new AttributeKeyAndValue()
                                  .withKey(new AttributeKey()
                                                .withSchemaArn(appliedSchemaArn)
                                                .withFacetName("DynamicObjectFacet")
                                                .withName(entry.getKey()))
                                  .withValue(new TypedAttributeValue().withStringValue(entry.getValue())));
              }

              // この ARN は Cloud Directory によって提供され、Node や Leaf_Node などのオブジェクト型の定義を含んでいます。
             String cloudDirectorySchemaArn = "arn:aws:clouddirectory:<region>:<accountId>:directory/<directoryId>/schema/CloudDirectory/1.0";

              List<SchemaFacet> schemaFacets = Arrays.asList(
                           new SchemaFacet().withSchemaArn(appliedSchemaArn).withFacetName("DynamicObjectFacet"),
                           new SchemaFacet().withSchemaArn(cloudDirectorySchemaArn).withFacetName(objectType.name()));

              return client.createObject(new CreateObjectRequest()
                           .withDirectoryArn(directoryArn)
                           .withSchemaFacets(schemaFacets)
                           .withParentReference(new ObjectReference().withSelector(parentReference))
                           .withLinkName(linkName)
                           .withObjectAttributeList(attributeList)).getObjectIdentifier();
       }

型付きリンクを使用して、オブジェクト間の関係性を作成する

QuickStartSchema は、単一のバリアント型 ID 属性を持つ型付きリンクファセットを用意しています。これを使用して、単一の ID 属性を保持するオブジェクト間の型付きリンクを作成できます。

/**
* 「DynamicTypedLinkFacet」と「DynamicTypedLinkAttribute」は、クラウドディレクトリです。
* QuickStartSchema で使用可能な、Typed Link ファセットと属性名が定義されています。
* これらの名前を変更することはできません。
**/
       private AttachTypedLinkResult attachDirectoryTypedLink(String sourceObjectId, String destinationObjectId,
                     String typedLinkAttributeValue) {
              TypedLinkSchemaAndFacetName typedLinkSchemaAndFacetName = new TypedLinkSchemaAndFacetName()
                            .withTypedLinkName("DynamicTypedLinkFacet").withSchemaArn(appliedSchemaArn);

              return client.attachTypedLink(new AttachTypedLinkRequest().withDirectoryArn(directoryArn)
                           .withTypedLinkFacet(typedLinkSchemaAndFacetName)
                           .withAttributes(new AttributeNameAndValue()
                                         .withAttributeName("DynamicTypedLinkAttribute")
                                         .withValue(new TypedAttributeValue().withStringValue(typedLinkAttributeValue)))
                           .withSourceObjectReference(new ObjectReference().withSelector(sourceObjectId))
                           .withTargetObjectReference(new ObjectReference().withSelector(destinationObjectId)));
       }

AttachTypedLinkResult result = attachDirectoryTypedLink(janeObjectId, lionsObjectId, "Captain");

ディレクトリからデータを取得する

オブジェクトを作成して階層を確立した後、パス、または Cloud Directory からデータを取得するための識別子ベースのクエリのいずれかを実行できます。例えば、ListObjectAttributesRequest を使用して、属性キーと値のパスベースのクエリを実行できます。

動的ファセットと静的ファセットの使用に関するベストプラクティス

属性の数を変更したり、属性内に格納されているデータ値を変更するような柔軟性が必要な場合は、動的ファセットを使用します。Cloud Directory は、オブジェクトの作成または変更中に、データの制限やルールの確認を強制しません。

これらの条件が適用される時には、静的ファセットを使用します。第 1 に、データ型を持つ属性のリストなど、ディレクトリのデータモデルのすべての詳細があります。第 2 に、必須フィールドや固有フィールドなど、属性のデータの制限を定義します。Cloud Directory は、オブジェクトの作成または変更中に、データの制限とルールの確認を強制します。

単一のスキーマ内で静的ファセットと動的ファセットを組み合わせると、ディレクトリ内のファセットの各スタイルに利点ももたらします。

Cloud Directory について

Cloud Directory は、高性能な完全管理型かつ階層型データストアです。高度にスケーラブルなマルチテナントサービスで、あらゆる多次元データを簡単に整理し管理することができます。多次元データには、ユーザー、グループ、場所、デバイス、およびそれらの間の多様な関係性が含まれます。

スキーマファセットを使用して、さまざまな次元のデータを構築して、これらの次元 (従業員、デバイス、場所など) 内のオブジェクトを定義します。Cloud Directory は階層データにとっては理想的であり、効率的な方法でパスに沿って情報を収集するために階層をトラバースします。他の特徴としては、読み書き比が高いこと、データセットのストレージ許容量が少ないことがあります。Cloud Directory は、人事用アプリケーション、コースカタログ、デバイスレジストリ、ネットワークトポロジーといったユースケースを対象としています。さらに、アプリケーションできめ細かな許可 (権限) が必要な場合、Cloud Directory はとても適していると言えるでしょう。

まとめ

Cloud Directory マネージドスキーマを使用して、アプリケーションの迅速なプロトタイピングや開発を行うことができます。階層間をトラバースすることで、たくさんの階層構造を持つデータを構築し、そのクエリを行うことができます。マネージドスキーマ、動的ファセット、またはバリアントデータ型の詳細については、Cloud Directory Schema documentation を参照してください。

このブログ記事に関するコメントは、以下の「コメント」セクションからお送りください。この記事にあるソリューションを実装する際に質問があれば、Directory Service forum または 「AWS サポートに連絡する」で新しいスレッドを開始してください。


著者について

Mahendra Chheda は、アマゾン ウェブ サービスのプリンシパルプロダクトマネージャーです。

 

 

 

 

Shivam Gujral は、アマゾン ウェブ サービスのソフトウェア開発エンジニアです。