RDS イントロスペクションを使用した GraphQL API の構築
AWS AppSync のイントロスペクションユーティリティは、データベーステーブルからモデルを検出し、GraphQL の型を提案できます。AWS AppSync コンソールの API 作成ウィザードを使用すると、Aurora MySQL または PostgreSQL データベースから API を即座に生成できます。データを読み書きするための型と JavaScript リゾルバーを自動的に作成されます。
AWS AppSync は、Amazon RDS Data API を通じて Amazon Aurora データベースとの直接統合を実現します。Amazon RDS Data API は、永続的なデータベース接続を必要とせず、SQL ステートメントを実行するために AWS AppSync が接続する安全な HTTP エンドポイントを提供します。これを使用して、Aurora で MySQL および PostgreSQL ワークロードのリレーショナルデータベース API を作成できます。
AWS AppSync を使用してリレーショナルデータベースの API を構築すると、以下のような利点があります。
-
データベースはクライアントに直接公開されないため、アクセスポイントをデータベース自体から切り離すことができます。
-
さまざまなアプリケーションのニーズに合わせた専用の API を構築できるため、フロントエンドでのカスタムビジネスロジックが不要になります。これは Backend For Frontend (BFF) パターンと一致します。
-
承認とアクセス制御は、アクセスを制御するためのさまざまな承認モードを使用して AWS AppSync レイヤーで実装できます。データベースに接続するために、ウェブサーバーのホスティングやプロキシ接続など、追加のコンピューティングリソースは必要ありません。
-
リアルタイム機能はサブスクリプションを通じて追加でき、AppSync を介して行われたデータミューテーションは、接続されたクライアントに自動的にプッシュされます。
-
クライアントは 443 などの共通ポートを使用して HTTPS 経由で API に接続できます。
AWS AppSync は、既存のリレーショナルデータベースから API を簡単に構築できます。そのイントロスペクションユーティリティは、データベーステーブルからモデルを検出し、GraphQL の型を提案できます。AWS AppSync コンソールの API 作成ウィザードを使用すると、Aurora MySQL または PostgreSQL データベースから API を即座に生成できます。データを読み書きするための型と JavaScript リゾルバーを自動的に作成されます。
AWS AppSync には、リゾルバーでの SQL ステートメントの記述を簡単にするための統合された JavaScript ユーティリティが用意されています。動的な値を含む静的ステートメントには AWS AppSync の sql
タグテンプレートを使用でき、プログラムでステートメントを構築するには rds
モジュールユーティリティを使用できます。詳細については、「RDS のリゾルバー関数リファレンス」データソースと「組み込みモジュール」をご覧ください。
イントロスペクション機能を使用する (コンソール)
詳細なチュートリアルと入門ガイドについては、「チュートリアル: Aurora PostgreSQL Serverless で Data API を使用する」を参照してください。
AWS AppSync のコンソールでは、Data API で設定した既存の Aurora データベースから AWS AppSync GraphQL API をわずか数分で作成できます。これにより、データベース設定に基づいて運用スキーマが迅速に生成されます。API をそのまま使用することも、API を基にして機能を追加することもできます。
-
AWS Management Console にサインインして、AppSync コンソール
を開きます。 -
ダッシュボードで、[API の作成] を選択します。
-
-
[API のオプション] で、[GraphQL API]、[Amazon Aurora クラスターから始める]、[次へ] の順に選択します。
-
[API 名] を入力します。これはコンソールで API の識別子として使用されます。
-
連絡先情報については、API のマネージャーを特定する連絡先を入力できます。これはオプションのフィールドです。
-
[Private API 設定] で、プライベート API 機能を有効にできます。プライベート API には、設定された VPC エンドポイント (VPCE) からのみアクセスできます。詳細については、「プライベート DNS」を参照してください。
この例では、この機能を有効にすることはお勧めしません。[次へ] 選択して入力を確認します。
-
-
[データベース] ページで [データベースを選択] を選択します。
-
クラスターからデータベースを選択する必要があります。最初のステップは、クラスターが存在する [リージョン] を選択することです。
-
ドロップダウンリストから [Aurora クラスター] を選択します。リソースを使用する前に、対応するData API を作成して有効にしておく必要があることに注意してください。
-
次に、データベースの認証情報をサービスに追加する必要があります。これは主に AWS Secrets Manager を使用して行われます。シークレットが存在する [リージョン] を選択します。シークレット情報を取得する方法の詳細については、「シークレットを検索する」または「シークレットの取得」を参照してください。
-
ドロップダウンリストからシークレットを選択します。ユーザーにはデータベースの読み取りアクセス許可が必要であることに注意してください。
-
-
[Import] (インポート) を選択します。
AWS AppSync はデータベースのイントロスペクションを開始し、テーブル、列、プライマリキー、インデックスを検出します。検出されたテーブルが GraphQL API でサポートされるかどうかをチェックします。新しい行の作成をサポートするには、複数の列を使用できるプライマリキーがテーブルに必要であることに注意してください。AWS AppSync は、次のようにテーブルの列を型フィールドにマップします。
データ型 フィールドタイプ VARCHAR String CHAR String BINARY String VARBINARY String TINYBLOB String TINYTEXT String TEXT String BLOB String MEDIUMTEXT String MEDIUMBLOB String LONGTEXT String LONGBLOB String BOOL Boolean BOOLEAN Boolean BIT Int TINYINT Int SMALLINT Int MEDIUMINT Int INT Int INTEGER Int BIGINT Int YEAR Int FLOAT Float DOUBLE Float DECIMAL Float DEC Float NUMERIC Float DATE AWSDate TIMESTAMP String DATETIME String TIME AWSTime JSON AWSJson ENUM ENUM -
テーブルの検出が完了すると、[データベース] セクションに情報が入力されます。新しい [データベーステーブル] セクションでは、テーブルからのデータがすでに入力され、スキーマの型に変換されている場合があります。必要なデータの一部が表示されない場合は、[テーブルを追加] を選択し、表示されるモーダルでそれらの型のチェックボックスをクリックして、[追加] を選択することで確認できます。
[データベーステーブル] セクションから型を削除するには、削除する型の横にあるチェックボックスをクリックし、[削除] を選択します。削除した型は、後で再度追加したい場合、[テーブルを追加] モーダルに表示されます。
AWS AppSync では、テーブル名を型名として使用しますが、名前を変更することもできます。例えば、
movies
のような複数形のテーブル名をMovie
という型名に変更できます。[データベーステーブル] セクションで型名を変更するには、名前を変更する型のチェックボックスをクリックし、[タイプ名] 列の鉛筆アイコンをクリックします。選択内容に基づいてスキーマの内容をプレビューするには、[スキーマをプレビュー] を選択します。このスキーマは空にはできないため、少なくとも 1 つのテーブルを型に変換する必要があることに注意してください。また、このスキーマのサイズは 1 MB を超えることはできません。
-
[サービスロール] で、このインポート専用の新しいサービスロールを作成するか、既存のロールを使用するかを選択します。
-
-
[Next] を選択します。
-
次に、読み取り専用 API (クエリのみ) を作成するか、データの読み取りと書き込み用の API (クエリとミューテーションを含む) を作成するかを選択します。後者は、ミューテーションによってトリガーされるリアルタイムサブスクリプションもサポートします。
-
[Next] を選択します。
-
選択内容を確認し、[API を作成] を選択します。AWS AppSync は API を作成し、クエリとミューテーションにリゾルバーをアタッチします。生成された API は完全に動作し、必要に応じて拡張できます。
イントロスペクション機能の使用 (API)
StartDataSourceIntrospection
イントロスペクション API を使用して、データベース内のモデルをプログラムで検出できます。コマンドの詳細については、「StartDataSourceIntrospection
API の使用」を参照してください。
StartDataSourceIntrospection
を使用するには、Aurora クラスターの Amazon リソースネーム (ARN)、データベース名、および AWS Secrets Manager シークレット ARN を指定します。このコマンドはイントロスペクションプロセスを開始します。GetDataSourceIntrospection
コマンドを使用して結果を取得できます。検出されたモデルのストレージ定義言語 (SDL) 文字列をコマンドが返すかどうかを指定できます。これは、検出されたモデルから直接 SDL スキーマ定義を生成する場合に便利です。
例えば、単純な Todos
テーブルに次のようなデータ定義言語 (DDL) ステートメントがあるとします。
create table if not exists public.todos ( id serial constraint todos_pk primary key, description text, due timestamp, "createdAt" timestamp default now() );
イントロスペクションは、以下のように開始します。
aws appsync start-data-source-introspection \ --rds-data-api-config resourceArn=<cluster-arn>,secretArn=<secret-arn>,databaseName=database
次に、GetDataSourceIntrospection
コマンドを使用して結果を取得します。
aws appsync get-data-source-introspection \ --introspection-id a1234567-8910-abcd-efgh-identifier \ --include-models-sdl
これは次の結果を返します。
{ "introspectionId": "a1234567-8910-abcd-efgh-identifier", "introspectionStatus": "SUCCESS", "introspectionStatusDetail": null, "introspectionResult": { "models": [ { "name": "todos", "fields": [ { "name": "description", "type": { "kind": "Scalar", "name": "String", "type": null, "values": null }, "length": 0 }, { "name": "due", "type": { "kind": "Scalar", "name": "AWSDateTime", "type": null, "values": null }, "length": 0 }, { "name": "id", "type": { "kind": "NonNull", "name": null, "type": { "kind": "Scalar", "name": "Int", "type": null, "values": null }, "values": null }, "length": 0 }, { "name": "createdAt", "type": { "kind": "Scalar", "name": "AWSDateTime", "type": null, "values": null }, "length": 0 } ], "primaryKey": { "name": "PRIMARY_KEY", "fields": [ "id" ] }, "indexes": [], "sdl": "type todos\n{\ndescription: String\n\ndue: AWSDateTime\n\nid: Int!\n\ncreatedAt: AW SDateTime\n}\n" } ], "nextToken": null } }