Amazon Athena DynamoDB コネクタ - Amazon Athena

Amazon Athena DynamoDB コネクタ

Amazon Athena DynamoDB コネクタは、Amazon Athena が DynamoDB とやり取りすることを可能にして、テーブルを SQL でクエリできるようにします。INSERT INTO などの書き込み操作はサポートされていません。

アカウントで Lake Formation を有効にしている場合、AWS Serverless Application Repository でデプロイした Athena フェデレーション Lambda コネクタの IAM ロールには、Lake Formation での AWS Glue Data Catalog への読み取りアクセス権が必要です。

前提条件

パラメータ

このセクションの Lambda 環境変数により、DynamoDB コネクタを設定します。

  • spill_bucket – Lambda 関数の上限を超えたデータに対して、Amazon S3 バケットを指定します。

  • spill_prefix – (オプション) 指定された athena-federation-spill という spill_bucket の、デフォルトのサブフォルダに設定します。このロケーションで、Amazon S3 のストレージライフサイクルを設定し、あらかじめ決められた日数または時間数以上経過したスピルを削除することをお勧めします。

  • spill_put_request_headers – (オプション) スピリングに使用されるAmazon S3 の putObject リクエスト (例:{"x-amz-server-side-encryption" : "AES256"}) に関する、 JSON でエンコードされたリクエストヘッダーと値のマッピング。利用可能な他のヘッダーについては、「Amazon Simple Storage Service API リファレンス」の「PutObject」を参照してください。

  • kms_key_id – (オプション) デフォルトでは、Amazon S3 に送信されるすべてのデータは、AES-GCM で認証された暗号化モードとランダムに生成されたキーを使用して暗号化されます。KMS が生成したより強力な暗号化キー (たとえば a7e63k4b-8loc-40db-a2a1-4d0en2cd8331) を Lambda 関数に使用させる場合は、KMS キー ID を指定します。

  • disable_spill_encryption – (オプション) True に設定されている場合、スピルに対する暗号化を無効にします。デフォルト値は False です。この場合、S3 にスピルされたデータは、AES-GCM を使用して (ランダムに生成されたキー、または KMS により生成したキーにより) 暗号化されます。スピル暗号化を無効にすると、特にスピルされる先でサーバー側の暗号化を使用している場合に、パフォーマンスが向上します。

  • disable_glue – (オプション) これが存在し、true に設定されている場合、コネクタは AWS Glue からの補足メタデータ取得は試みません。

  • glue_catalog – (オプション) クロスアカウントの AWS Glue カタログを指定するために、このオプションを使用します。デフォルトでは、コネクタは自身の AWS Glue アカウントからメタデータを取得しようとします。

  • disable_projection_and_casing – (オプション) プロジェクションおよび大文字と小文字の区別を無効にします。列名に大文字と小文字の区別がある DynamoDB テーブルをクエリしたいものの、AWS Glue テーブルで columnMapping プロパティを指定したくない場合に使用します。

    disable_projection_and_casing パラメータは、次の値を使用して大文字と小文字の区別、および列のマッピングに関する動作を指定します。

    • auto – これまでサポートされていなかったタイプが検出され、列名のマッピングがテーブルに設定されていない場合、プロジェクション、および大文字と小文の区別を無効にします。これはデフォルトの設定です。

    • always – プロジェクション、および大文字と小文字の区別を無条件に無効にします。これは、DynamoDB の列名で大文字と小文字を区別しているものの、列名のマッピングを指定したくない場合に便利です。

    disable_projection_and_casing パメータを使用する場合は、以下の点に注意してください。

    • このパラメータを使用すると、帯域幅の使用量が増加する可能性があります。さらに、Lambda 関数がデータソースと同じ AWS リージョン にない場合、帯域幅の使用量が増えるため、標準の AWS クロスリージョン転送コストが高くなります。クロスリージョン転送コストの詳細については、「AWS Partner Network ブログ」の「サーバーアーキテクチャおよびサーバーレスアーキテクチャの AWS データ転送料金」を参照してください。

    • 転送されるバイト数が増え、またバイト数が多いと逆シリアル化により時間がかかるため、全体のレイテンシが長くなる可能性があります。

AWS Glueでのデータベースとテーブルのセットアップ

コネクタに組み込まれたスキーマ推論機能には制限があるため、メタデータ用としては AWS Glue の使用が適しています。これを行うには、AWS Glue にデータベースとテーブルが必要です。DynamoDB で使用できるようにするには、そのプロパティを編集する必要があります。

AWS Glue コンソールでデータベースプロパティを編集するには
  1. AWS Management Console にサインインし、AWS Glue コンソール (https://console.aws.amazon.com/glue/) を開きます。

  2. [Databases](データベース) タブ。

    [Databases] (データベース) ページでは、既存のデータベースを編集するか、[Add database] (データベースを追加) を選択してデータベースを作成できます。

  3. データベースのリストで、編集するデータベース用リンクを選択します。

  4. [編集] を選択します。

  5. [Update a database] (データベースの更新) ページの [Location] (場所) に、文字列 dynamo-db-flag を追加します。このキーワードは、Athena DynamoDB コネクタが補足メタデータに使用しているテーブルがデータベースに含まれており、default 以外の AWS Glue データベースに必要であることを示します。dynamo-db-flag プロパティは、多数のデータベースを持つアカウントのデータベースを除外する場合に便利です。

AWS Glue コンソールでテーブルプロパティを編集するには
  1. AWS Management Console にサインインし、AWS Glue コンソール (https://console.aws.amazon.com/glue/) を開きます。

  2. [Tables] (テーブル) タブを選択します。

    [テーブル] タブで、既存のテーブルを編集します。テーブルを手動またはクローラで追加する方法については、「AWS Glue デベロッパーガイド」の「AWS Glue コンソールでのテーブルの使用」を参照してください。

  3. テーブルのリストで、編集するテーブルのリンクを選択します。

  4. [Actions] (アクション)、[Edit table] (テーブルの編集) の順に選択します。

  5. [Edit table] (テーブルの編集) ページの [Table properties] (テーブルプロパティ) セクションで、必要に応じて以下のテーブルプロパティを追加します。AWS Glue DynamoDB クローラーを使用する場合、これらのプロパティは自動的に設定されます。

    • dynamodb – テーブルを補足メタデータとして使用できることを Athena DynamoDB コネクタに示す文字列。[Classification] (分類) (完全一致) と呼ばれるフィールドにある、テーブルプロパティの dynamodb 文字列を入力します。

      注記

      AWS Glue コンソールのテーブル作成プロセスの一部である [テーブルプロパティの設定] ページには、[分類] フィールドを含む [データ形式] セクションがあります。ここでは dynamodb を入力も選択もできません。代わりに、テーブルを作成した後、手順に従ってテーブルを編集し、[テーブルプロパティ] セクションにキー値のペアとして classification および dynamodb を入力します。

    • sourceTable – DynamoDB 内にあるソーステーブル名を定義するオプションのテーブルプロパティ。AWS Glue テーブルの命名規則が原因で、DynamoDB テーブルと同じ名前で AWS Glue テーブルが作成できない場合に使用します。例えば、AWS Glue テーブルの名前に大文字は許可されていませんが、DynamoDB テーブル名としては使用が可能です。

    • columnMapping – カラム名のマッピングを定義するオプションのテーブルプロパティ。AWS Glue 列の命名規則が原因で、DynamoDB テーブルと同じ名前の列を持つ AWS Glue テーブルを作成できない場合に使用します。例えば、AWS Glue では列名として大文字は許可されていませんが、DynamoDB の列名では使用が可能です。このプロパティ値の形式は、col1=Col1、col2=Col2 のようにします。列マッピングは最上位の列名にのみ適用され、ネストされたフィールドには適用されないことに注意してください。

    • defaultTimeZone – 明示的なタイムゾーンが含まれない date 値、および datetime 値に適用される、オプションのテーブルプロパティ。データソースのデフォルトタイムゾーンと Athena セッションのタイムゾーンの間に不一致が生じないようにするためには、この値を設定することが適切です。

    • datetimeFormatMapping – AWS Glue date または timestamp データ型の列のデータを解析する際に、date または datetime 形式が使用されること指定する、オプションのテーブルプロパティ。このプロパティが指定されていない場合、コネクタは ISO-8601 形式が使用されるものと推定します。コネクタが date または datetime 形式を推定できない、あるいは未加工の文字列を解析できない場合、この値は結果から除外されます。

      datetimeFormatMapping 値は、col1=someformat1,col2=someformat2 形式である必要があります。以下に形式の例をいくつか示します。

      yyyyMMdd'T'HHmmss ddMMyyyy'T'HH:mm:ss

      列にタイムゾーンのない date または datetime 値が含まれており、その列を WHERE 句で使用したい場合には、対象の列で datetimeFormatMapping プロパティを設定します。

  6. 手動で列を定義する場合は、適切なデータ型を使用するように注意してください。クローラーを使用している場合は、クローラーが検出した列とタイプを確認します。

必要な許可

このコネクタが必要とする IAM ポリシーの完全な詳細については、athena-dynamodb.yaml ファイルの Policies セクションを参照してください。次のリストは、必要なアクセス権限をまとめたものです。

  • Amazon S3 への書き込みアクセス – 大規模なクエリからの結果をスピルするために、コネクタは Amazon S3 内のロケーションへの書き込みアクセス権限を必要とします。

  • Athena GetQueryExecution – コネクタはこの権限を使用して、アップストリームの Athena クエリが終了した際に fast-fail を実行します。

  • AWS Glue Data Catalog – DynamoDB コネクタには、スキーマ情報を取得するために、AWS Glue Data Catalog に対する読み込み専用アクセスが必要です。

  • CloudWatch Logs – コネクタは、ログを保存するために CloudWatch Logs にアクセスする必要があります。

  • DynamoDB 読み込みアクセス – このコネクタでは、DescribeTableListSchemasListTablesQuery、および Scan のAPI オペレーションを使用します。

パフォーマンス

Athena DynamoDB コネクタは並列スキャンをサポートしており、DynamoDB クエリの一部として述語のプッシュダウンを試みます。X が異なる値を持つハッシュキー述語を使用すると、DynamoDB に対する X クエリ呼び出しが発生します。他のすべての述語シナリオでは、スキャン呼び出しの数が Y となります。この際 Y は、テーブルのサイズとプロビジョニングされたスループットに基づいて、ヒューリスティックに決定されます。ただし、列のサブセットを選択すると、クエリのランタイムが長くなる場合があります。

LIMIT 句と単純な述語がプッシュダウンされるため、スキャンされるデータの量が減少し、クエリ実行のランタイムの短縮につながります。

LIMIT 句

LIMIT N ステートメントにより、クエリによってスキャンされるデータが削減されます。LIMIT N プッシュダウンを使用すると、コネクタは N 行のみを Athena に返します。

述語

述語は、ブール値に照らして評価し、複数の条件に基づいて行をフィルタリングする SQL クエリの WHERE 句内の式です。機能を強化し、スキャンされるデータの量を減らすために、Athena DynamoDB コネクタはこれらの式を組み合わせて、DynamoDB に直接プッシュできます。

次の Athena DynamoDB コネクタ演算子は、述語のプッシュダウンをサポートしています。

  • ブーリアン: AND

  • 等値: EQUAL、NOT_EQUAL、LESS_THAN、LESS_THAN_OR_EQUAL、GREATER_THAN、GREATER_THAN_OR_EQUAL、IS_NULL

組み合わせたプッシュダウンの例

クエリ機能を強化するには、次の例のようにプッシュダウンタイプを組み合わせます。

SELECT * FROM my_table WHERE col_a > 10 and col_b < 10 LIMIT 10

DynamoDB などのフェデレーテッドクエリのパフォーマンスを向上させるために述語プッシュダウンを使用する方法の記事については、「AWS Big Data Blog」の「Improve federated queries with predicate pushdown in Amazon Athena」を参照してください。

パススルークエリ

DynamoDB コネクタはパススルークエリをサポートし、PartiQL 構文を使用します。DynamoDB GetItem API オペレーションはサポートされません。PartiQL を使用した DynamoDB のクエリに関する詳細については、「Amazon DynamoDB デベロッパーガイド」の「PartiQL select statements for DynamoDB」を参照してください。

DynamoDB でパススルークエリを使用するには、以下の構文を使用します。

SELECT * FROM TABLE( system.query( query => 'query_string' ))

以下の DynamoDB パススルークエリ例は、PartiQL を使用して、2022 年 12 月 24 日より後の DateWatched プロパティを持つ Fire TV Stick デバイスのリストを返します。

SELECT * FROM TABLE( system.query( query => 'SELECT Devices FROM WatchList WHERE Devices.FireStick.DateWatched[0] > '12/24/22'' ))

トラブルシューティング

ソートキー列上の複数フィルター

エラーメッセージ: KeyConditionExpression にはキーごとに 1 つの条件のみを含める必要があります

原因: この問題は、Athena エンジンバージョン 3 で、DynamoDB ソートキー列上に下限フィルターと上限フィルターの両方があるクエリで発生する可能性があります。DynamoDB はソートキー上で複数のフィルター条件をサポートしていないため、両方の条件が適用されたクエリをコネクタがプッシュダウンしようとするとエラーが発生します。

解決策: コネクタをバージョン 2023.11.1 以降に更新します。コネクタを更新する手順については、「データソースコネクタの更新」を参照してください。

コスト

コネクタの使用料金は、基礎として使用されている AWS リソースによって異なります。スキャンを使用するクエリでは、大量のリードキャパシティーユニット (RCU) を利用することがあるため、「Amazon DynamoDB pricing」 (Amazon DynamoDB の料金) に記載された情報を慎重に検討してください。

以下も参照してください。