Amazon Web Services ブログ

AWS AppSync で Amazon Timestream のデータにアクセス

AWS AppSync は、複数のデータベース、マイクロサービス、API に安全にデータを検索または更新するための単一のエンドポイントを提供することによって、アプリケーション開発を簡素化するフルマネージドのサーバーレス GraphQL API サービスです。

様々な業界(医療、製造、エネルギー生成、輸送など)の多くの組織が、ビジネスプロセスの効率を向上させるだけでなく、ロングテールの収益機会を生み出すためにデータのストリームを使用しています。AWS のお客様の多くは、サーバーレスの時系列データベースである Amazon Timestream にデータを保持しています。クラウドでの分析は、このデータを情報に変換し、最終的にアプリケーションに配信される必要があります。情報が変化したときに、ニアリアルタイムでアクセスする必要があるユースケースもよくあります。そして、ほぼリアルタイムでデータを配信するためのいくつかのデータ取り込みのアーキテクチャパターンが用意されています。

本記事では、エンドポイントディスカバリパターンによる REST API を使用して、AWS AppSync 経由で Amazon Timestream データベースの時系列データにアクセスする方法を紹介します。

概要

AWS AppSync はデータソースに対する操作を実行することで、GraphQL リクエストに応答することができます。Query、Mutation、または Subscription を実行したい各 GraphQL フィールドに対して、リゾルバを添付する必要があります。GitHub で公開されている AWS AppSync のコード例では、データソースと通信する 2 つのリゾルバ関数を構成しています。リゾルバは、GraphQL とデータソースの間のコネクターとなります。

JavaScript ランタイム(APPSYNC_JS)と AWS AppSync HTTP データソースを使用してデータソース API と直接対話する、または Lambda プロキシを介してデータソース API と対話する独自の AWS AppSync リゾルバー関数を記述することができます。

APPSYNC_JS ランタイム、すなわち AppSync サービス内に存在するカスタムビルドの JavaScript ランタイムを使用した AWS AppSync 関数は、以下のターゲットデータソースとの直接連携するユースケースに適しています。

AWS Lambda データソースをプロキシとして使用する AWS AppSync 関数は、以下のようなユースケースに適しています。

  • JavaScript や Velocity Template Language(VTL)以外の言語を使用したい
  • パフォーマンスを最適化するため CPU やメモリの調整や制御をしたい
  • サードパーティーのライブラリをインポートしたり、APPSYNC_JS でサポートされていない機能を使いたい
  • クエリを実行するために、複数のネットワークリクエストやファイルシステムへのアクセスを行いたい
  • バッチ設定を使用したリクエストのバッチ処理をしたい

本記事では、Amazon Timestream データベースにアクセスするために、JavaScript リゾルバダイレクト Lambda リゾルバを使用した単一のエンドポイントを提供する AWS AppSync のコード例を紹介します。ダイレクトデータソースアクセスと Lambda データソース経由のプロキシの選択については AWS AppSync 開発者ガイドを参照してください。

以下のセクションでは、ソリューションのさまざまな部分について説明します。

アーキテクチャ

このアーキテクチャはユースケースの流れを示しています。

  1. AWS IoT Device SDK を使って IoT 時系列データを AWS IoT Core MQTT (Message Queuing Telemetry Transport) トピックに公開します。
  2. AWS IoT Greengrass エッジランタイムを使用してデータを収集し、AWS IoT Core にエクスポートすることもできます。
  3. AWS IoT Core に MQTT トピックを設定し、サブスクライブするクライアントにメッセージをルーティングします。
  4. AWS IoT Core のルールエンジン
    1. サブスクライブしたトピックから MQTT メッセージを読み取るルールを評価します。
    2. Amazon Timestream にデータを取り込むアクションを実行します。
  5. データを照会するためのデフォルトモデルであるフラットモデルを使用して、IoT データを Timestream に保存します。
  6. AWS AppSync は、2 つのリゾルバオプションから選択できる単一のエンドポイントを提供します。
    1. JavaScript ランタイムを使用して実行される関数
    2. ラムダへのリクエストをプロキシする関数
  7. AppSync GraphQL API を監視し、リクエストに関連する問題をデバッグするために、Amazon CloudWatch Logs へのロギングを有効にすることができます。また、Amazon Cognito User Pools を使用した認証と認可を有効にすることもできます。
  8. AppSync API を使用して、Web アプリケーション、Mobile アプリをより速く実装することができます。この記事では、AppSync Console を使用して GraphQL をテストします。

Amazon Timestream へのデータの取り込み

IoT Core ルールを使用して IoT 時系列データを Amazon Timestream に取り込みます。IoT Core にデータを公開するためには、IoT Core で利用できる MQTT テストクライアントを使用します。IoT Core ルールを構成して、MQTT トピックをサブスクライブし、公開されたイベントに対してアクションを起こすことで、Amazon Timestream データベースにデータを取り込むことが出来ます。

以下のスクリーンショットは、AWS IoT Core コンソールで IoT Core ルールがどのように見えるかを示しています。

Amazon Timestream にアクセスするための AppSync GraphQL API の作成

Amazon Timestream データベースにアクセスするために API キーで保護されたパブリック AppSync API を作成してみましょう。以下のいずれかの方法でアクセスすることが出来ます。

  • ダイレクト Lambda リゾルバ関数は AWS SDK を使用して Timestream にアクセスし、データベースに対するクエリを実行して要求されたデータを返します。
  • JavaScript リゾルバ関数は、リージョンエンドポイントディスカバリパターンを介して Timestream ダイレクトREST API を使用します。

両方のリゾルバオプションを表示するには、Timestream データベーステーブルから IoT イベントのリストを取得するための 2 つの別々のクエリ関数を持つスキーマを作成します。

GraphQL スキーマの作成

本記事の例では、1 つのクエリフィールドである getSensorData のみが含まれています。getSensorData は、分単位でデータを取得します。ページネーションのサポートはありません。

schema {
          query: Query
        }

        type IOT {
          fleet: String
          fuel_capacity_in_litres: String
          load_capacity_in_tons: String
          make: String
          current_fuel_lvl_in_litres: String
          gps_location_latlong: String
          model: String
          truck_id: String
        }

        type Query {
          getSensorDataUsingLambdaResolver (durationInMinutes: Int): [IOT]
          getSensorDataUsingJsResolver (durationInMinutes: Int): [IOT]
        }

前提条件

本ソリューションを導入するためには、以下のものが必要です。

REGION_ENDPOINT="https://query.timestream.us-east-1.amazonaws.com"
REGION=us-east-1
aws timestream-write describe-endpoints ˶ -endpoint-url $REGION_ENDPOINT˶ -region $REGION.
      • Timestream エンドポイント URL のセル番号を確認してください。以下の例では、セル番号として cell2 がエンドポイント URL に含まれます。このセル番号は、デプロイセクションのステップ 2 で必要になります。
      • 例:query-cell2.timestream.us-east-1.amazonaws.com

デプロイ

  • GitHub のリポジトリからクローンします。
git clone https://github.com/aws-samples/aws-appsync-access-amazon-timestream-example
  • ソリューションをデプロイします。
aws cloudformation deploy --template-file cfn/main.template --stack-name appsync-timestream-api --parameter-overrides ParameterKey=TimestreamCellEndpoint,ParameterValue="<Refer point 3 in prerequisites>" --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND
  • 詳細を取得します。テスト用の GraphQL エンドポイントと API キーをメモしておいてください。
aws cloudformation describe-stacks --stack-name appsync-timestream-api --query "Stacks[0].Outputs" --output table

テスト

AppSync API Console を使ってテストをします。

AppSync Console

  • AppSync Console に移動し、appsync-timestream-api を選択すると、ダッシュボードが表示されます。
  • 次に、左側のメニューの「Queries」をクリックして、クエリエディタを表示します。ここから、以下のクエリを実行して、API をテストすることができます:

  •  getSensorDataUsingJsResolver(durationInMinutes: 10) を選択し、下画面のようにフィールドを選択します。オレンジ色の矢印ボタンを押すと、クエリーが実行されます。右側に JSON 形式の結果が表示されます。

  • 次に、getSensorDataUsingLambdaResolver(durationInMinutes: 10) を選択し、以下の画面のようにフィールドを選択します。オレンジ色の矢印ボタンを押すと、クエリが実行されます。右側に JSON 形式の結果が表示されます。

後片付け

将来の課金を避けるために、作成したリソースをクリーンアップします。スタックを削除するには、次のコマンドを使用します。

aws cloudformation delete-stack --stack-name appsync-timestream-api

まとめ

この記事では、Timestream データベースに接続し、データにアクセスするための AppSync API を作成する方法について学びました。その際、APPSYNC_JS ランタイムと Lambda 関数を使った 2 つのコード例を紹介しました。AWS AppSync 関数を使ってデータソースにアクセスすることで、カスタムビジネスロジックを実装した独自のコードを書くことができます。これにより、Amazon DynamoDB、Aurora Serverless、OpenSearch Service、HTTP API、その他のAWS サービスなどのデータソースと直接連携することが容易になります。また、AWS AppSync では、Lambda データソースを構成することで、AWS Lambda 関数との対話が容易になります。Lambda データソースを使用すると、AWS Lambda の全機能を使用して複雑なビジネスロジックを実行し、GraphQL リクエストを解決することができます。APPSYNC_JS ランタイムでサポートされていない複雑なビジネスロジックを実装する必要がある状況では、ターゲットデータソースと対話するためのプロキシとして Lambda データソースを使用することができます。まずは無料利用枠で AWS AppSync を試してみてください。

著者について

Rajeev Jaiiswal

Rajeev Jaiiswal はロンドンを拠点に、SMB チームでシニアソリューションアーキテクトを務める。企業におけるデジタルイノベーションとトランスフォーメーションプロジェクトの設計と実施に 20 年以上の経験を持つ。AWS でお客様が革新的なソリューションを構築するのを支援するのが好きです。仕事以外では、家族と過ごす時間、読書、写真撮影を楽しんでいる。

Satish Mane

Satish Mane はSMB チームのソリューションアーキテクトで、イギリス・ロンドンに拠点を置いています。技術的なガイダンスを提供し、お客様が AWS でイノベーションを起こすのを支援する。彼はアナリティクスと IoT 技術に情熱を持っています。IoT、ストリーミング、AI/ML 技術に関するプロトタイプやデモを作成するのが好きです。仕事以外では、家族と過ごす時間や旅行、クリケット、料理、ドライブを楽しんでいます。

Tanya Pahuja

Tanya Pahuja はテクニカルアカウントマネージャーで、インドのデリーに拠点を置いています。テクニカルアカウントマネージャーとして、デジタルトランスフォーメーションに情熱を注ぎ、世界中のお客様のクラウド導入を加速させるための支援に尽力しています。また、AWS Summit や技術イベント、AWS Twitchのレギュラースピーカーでもあります。

本記事は、Access data in Amazon Timestream with AWS AppSync を翻訳したものです。翻訳はソリューションアーキテクトの稲田大陸が担当しました。