カスタムレポートを作成して AppStream 2.0 使用状況データを分析する - Amazon AppStream 2.0

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

カスタムレポートを作成して AppStream 2.0 使用状況データを分析する

Amazon Athena はサーバーレスのインタラクティブなクエリサービスであり、このサービスを使用すると、S3 バケットに保存されているデータを標準の SQL により分析できます。Athena を使用して、使用状況レポートを集計したり、他のタイプのカスタムレポートを生成したりできます。

AWS Glue クローラを作成する

AWS Glue はフルマネージド型の抽出、変換、ロード (ETL) サービスです。このサービスを使用して Amazon S3 データからデータベースを作成し、さらにそのデータベースに対して Athena を使用したクエリを実行できます。このデータベースは AWS Glue データカタログとも呼ばれます。AWS Glue のクローラは、Amazon S3 データのスキーマを自動的に検出し、そのスキーマに対応するデータベースとテーブルを作成します。AppStream 2.0 には、必要な AWS Glue リソースを作成するために使用できる AWS CloudFormation テンプレートが用意されています。

重要

以下の手順のステップを完了すると、AWS Glue クローラが作成されます。ただし、これらのステップではクローラを起動しません。クローラを起動するには、次の手順のステップを実行する必要があります。AWS Glue クローラの詳細については、「クローラの定義」を参照してください。

AWS Glue クローラを作成するには
  1. AppStream 2.0 コンソールを https://console.aws.amazon.com/appstream2 で開きます。

  2. 使用状況レポートをサブスクライブした AWS リージョンを選択します。

  3. ナビゲーションペインで、[Usage Reports (使用状況レポート)] を選択し、使用状況レポートのログ記録が有効になっていることを確認します。

  4. [Report Details (レポートの詳細)] タブの [分析] の横にある [CloudFormation テンプレート] リンクをクリックします。

    リンクを選択すると AWS CloudFormation コンソールが開き、そこで、テンプレートの実行前に、テンプレートで指定された AWS CloudFormation スタックのパラメータを確認できます。テンプレートを実行すると、AWS Glue クローラに加えて、いくつかのサンプル Athena クエリが作成されます。

  5. [詳細の指定] ページの [ScheduleExpression] の横にあるデフォルト値をそのまま使用するか、クローラを実行する頻度に別の cron 式の値を指定します。他のデフォルト値は変更しないでください。終了したら、[Next (次へ)] を選択します。

    クローラはデフォルトで、毎日実行されるようにスケジュールされていますが、毎週、毎月、または別の頻度で実行されるように設定できます。cron 構文については、「Cron 式」を参照してください。

  6. [オプション] ページで、すべてのデフォルト値を受け入れ、[Next (次へ)] を選択します。

  7. [確認] ページで、[AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します] の横にあるチェックボックスをオンにし、[作成] を選択します。

    AWS Glue および AWS Identity and Access Management (IAM) に、AWS CloudFormation スタックを作成して実行するために十分なアクセス許可が必要です。必要なアクセス許可がない場合は、お客様の Amazon Web Services アカウント管理者に対し、アカウントでこれらのステップを実行するか、以下のアクセス許可をお客様に付与するかのどちらかを依頼します。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "athena:CreateNamedQuery", "athena:BatchGetNamedQuery", "athena:GetNamedQuery", "athena:StartQueryExecution", "athena:GetQueryResults", "athena:GetQueryExecution", "athena:ListNamedQueries", "cloudformation:DescribeStacks", "cloudformation:GetStackPolicy", "cloudformation:DescribeStackEvents", "cloudformation:CreateStack", "cloudformation:GetTemplate", "cloudformation:ListChangeSets", "cloudformation:ListStackResources", "iam:GetRole", "iam:CreateRole", "iam:GetRolePolicy", "s3:GetBucketLocation", "s3:ListBucketMultipartUploads", "s3:ListBucket", "s3:ListMultipartUploadParts", "s3:PutObject", "s3:GetObject", "s3:AbortMultipartUpload" ], "Resource": [ "arn:aws:iam::*:role/AppStreamUsageReports-AppStreamUsageReportGlueRole*", "arn:aws:cloudformation:*:*:stack/AppStreamUsageReports/*", "arn:aws:athena:*:*:workgroup/primary", "arn:aws:s3:::aws-athena-query-results-*" ] }, { "Effect": "Allow", "Action": [ "iam:AttachRolePolicy", "iam:PutRolePolicy", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::appstream-logs-*", "arn:aws:iam::*:role/AppStreamUsageReports-AppStreamUsageReportGlueRole*" ] }, { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::*:role/AppStreamUsageReports-AppStreamUsageReportGlueRole*" ], "Condition": { "StringEquals": { "iam:PassedToService": "glue.amazonaws.com" } } }, { "Effect": "Allow", "Action": [ "cloudformation:GetTemplateSummary", "glue:GetResourcePolicy", "glue:GetCrawlers", "glue:BatchGetCrawlers", "glue:GetClassifiers", "glue:CreateClassifier", "glue:ListCrawlers", "glue:GetTags", "glue:GetCrawlerMetrics", "glue:GetClassifier", "tag:GetResources" ], "Resource": "*" }, { "Effect": "Allow", "Action": "athena:RunQuery", "Resource": "arn:aws:athena:*:*:workgroup/primary" }, { "Effect": "Allow", "Action": [ "glue:GetTables", "glue:GetPartitions", "glue:GetTable" ], "Resource": [ "arn:aws:glue:*:*:table/appstream-usage/*", "arn:aws:glue:*:*:database/appstream-usage", "arn:aws:glue:*:*:catalog" ] }, { "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:CreateDatabase", "glue:GetDatabases" ], "Resource": [ "arn:aws:glue:*:*:database/appstream-usage", "arn:aws:glue:*:*:catalog" ] }, { "Effect": "Allow", "Action": [ "glue:GetCrawler", "glue:StartCrawler", "glue:CreateCrawler" ], "Resource": "arn:aws:glue:*:*:crawler/appstream-usage*" }, { "Effect": "Allow", "Action": "glue:GetCatalogImportStatus", "Resource": "arn:aws:glue:*:*:catalog" } ] }

AWS Glue クローラを使用してデータカタログを作成する

AWS Glue クローラを実行すると、セッションレポートとアプリケーションレポートの構造にマップされた、Data Catalog とスキーマが作成されます。新しいレポートが Amazon S3 バケットに保存されるたびに、クローラを実行して、新しいレポートからのデータにより AWS Glue Data Catalog を更新する必要があります。

注記

AWS Glue クローラの実行に対しては料金が発生します。詳細については、AWS Glue 料金を参照してください。

  1. https://console.aws.amazon.com/glue/ で AWS Glue コンソール を開きます。

  2. 使用状況レポートをサブスクライブした AWS リージョンを選択します。

  3. appstream-usage-sessions-crawler という名前のクローラの横にあるチェックボックスをオンにし、[クローラの実行] を選択します。appstream-usage-apps-crawler という名前のクローラに対してこのステップを繰り返します。

    これらのステップを実行すると、クローラが実行され、AWS CloudFormation スタックで指定されたスケジュールに従ってクローラが自動的に実行されるように設定されます。

  4. 両方のクローラの実行が完了したら、ナビゲーションペインで [データベース] を選択します。使用状況レポートを表す [appstream-usage] という名前のデータベースが表示されます。このデータベースは、appstream-usage-sessions-crawlerappstream-usage-apps-crawler が実行されたときに作成された AWS Glue データカタログです。

  5. データベース内のテーブルを表示するには、[appstream-usage]、[テーブル] の順に選択します。それぞれアプリケーションとセッションの使用状況レポートを表す 2 つのテーブル、applicationssessions が表示されます。どちらかのテーブルを選択して、そのスキーマを表示します。

    これで、SQL を使用して、Athena でこれらのテーブルに対してクエリを実行できるようになりました。

Athena クエリの作成と実行

Athena を使用して使用状況レポートに対してクエリを実行するには、以下のステップを実行します。

注記

実行した Athena クエリに対しては料金が発生します。詳細については、Amazon Athena 料金 を参照してください。

  1. https://console.aws.amazon.com/athena/ で Athena コンソールを開きます。

  2. [Database (データベース)] で、[appstream-usage] を選択します。

  3. クエリペインで SQL クエリを入力し、[クエリの実行] を選択します。

アテナクエリの操作

このセクションでは、Athena で実行して Amazon S3 バケット内の使用状況レポートのデータを分析できる SQL クエリを示します。

特定の月のすべてのセッションの統合レポートを作成するには、以下のクエリを実行します。

SELECT * FROM "appstream-usage"."sessions" WHERE year='four-digit-year' AND month='two-digit-month'

クエリで applications テーブルと sessions テーブルの結合オペレーションを実行することもできます。たとえば、特定の月に各アプリケーションを起動した個別のユーザーを表示するには、以下のクエリを実行します。

SELECT DISTINCT apps.application_name, sessions.user_id FROM "appstream-usage"."applications" apps INNER JOIN "appstream-usage"."sessions" sessions ON (apps.user_session_id = sessions.user_session_id AND sessions.year='four-digit-year' AND sessions.month='two-digit-month') WHERE apps.year='four-digit-year' AND apps.month='two-digit-month' ORDER BY 1, 2

Athena のクエリ結果は、アカウントの Amazon S3 バケットに aws-athena-query-results-account-id-without-hyphens-region-code という名前の .csv ファイルとして保存されます。クエリ結果を見つけやすくするために、[名前を付けて保存] を選択し、クエリにその実行前に名前を付けます。[Athena Results (Athena 結果)] ペインでダウンロードアイコンを選択して、クエリの結果を .csv ファイルとしてダウンロードすることもできます。

パフォーマンスを向上させコストを削減するために、Athena ではパーティション分割を使用して、クエリでスキャンされるデータの量を減らします。詳細については、「データのパーティション分割」を参照してください。使用状況レポートは、年、月、日ごとに Amazon S3 バケットにパーティション分割されます。クエリの条件として [year (年)]、[month (月)]、および [day (日)] フィールドを使用して、クエリを特定の日付範囲パーティションに制限できます。たとえば、以下のクエリは 2019 年 5 月 19 日の週のセッションレポートのみを取り込みます。

SELECT SUBSTRING(session_start_time, 1, 10) AS report_date, COUNT(DISTINCT user_session_id) AS num_sessions FROM "appstream-usage"."sessions" WHERE year='2019' AND month='05' AND day BETWEEN '19' and '25' GROUP BY 1 ORDER BY 1

これに対して、以下のクエリは同じ結果を生成しますが、パーティションに制限されていないため、Amazon S3 バケットに保存されているすべてのセッションレポートを取り込みます。

SELECT SUBSTRING(session_start_time, 1, 10) AS report_date, COUNT(DISTINCT user_session_id) AS num_sessions FROM "appstream-usage"."sessions" WHERE session_end_time BETWEEN '2019-05-19' AND '2019-05-26' GROUP BY 1 ORDER BY 1

セッションが複数日にまたがる場合、セッションレコードとアプリケーションレコードは、セッションが終了した日に対応するセッションレポートにそれぞれ含まれます。このため、特定の日付範囲内でアクティブだったすべてのセッションに関連するレコードを見つける必要がある場合は、フリートに設定した最大セッション長までクエリのパーティションセットを延長することを検討してください。

たとえば、1 か月内で特定のフリートに対してアクティブだったすべてのセッションを表示する場合、フリートの最大セッション期間が 100 時間であれば、以下のようにパーティションセットを 5 日間延長したクエリを実行します。

SELECT * FROM "appstream-usage"."sessions" WHERE fleet_name = 'fleet_name' AND session_start_time BETWEEN '2019-05-01' AND '2019-06-01' AND year='2019' AND (month='05' OR (month='06' AND day<='05')) ORDER BY session_start_time

AWS Glue クローラを作成した AWS CloudFormation テンプレートによって、Athena アカウントに複数のサンプルクエリが作成および保存されます。これらのクエリは使用状況データの分析への使用が可能です。サンプルクエリとしては以下のものがあります。

  • 1 か月あたりの集計セッションレポート

  • 1 スタックあたりの平均セッション長

  • 1 日あたりのセッション数

  • ユーザーあたりの総ストリーミング時間

    注記

    オンデマンドの使用料金は、セッションごとに 1 時間単位で切り上げられます。

  • アプリ別のユーザー数

これらのクエリを使用するには、以下のステップを実行します。

  1. https://console.aws.amazon.com/athena/ で Athena コンソールを開きます。

  2. [保存したクエリ] を選択します。この手順で先ほど示した 5 つのクエリが表示されます。各クエリの名前は「AS2」で始まっています。たとえば、「AS2_users_per_app_curr_mo」と入力します。

  3. クエリを実行するには、名前の横にあるオプションではなくクエリ名を選択します。

  4. クエリのテキストがクエリペインに表示されます。[クエリを実行] を選択します。

別の AWS CloudFormation テンプレートのこれらのクエリを表示するには、AWS コードサンプルカタログathena-sample-query-appstream-usage-data_template.yml を参照してください。