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 CloudFormation テンプレートを提供します。このテンプレートを使用して、必要な AWS Glue リソースを作成できます。

重要

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

AWS Glue クローラを作成するには

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

  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. [Review (確認)] ページで、[AWS CloudFormation によってカスタム名のついた IAM リソースが作成される場合があることを承認します] の横にあるチェックボックスをオンにし、[Create (作成)] を選択します。

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

    { "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 クローラを使用して Data Catalog を作成する

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

注記

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

  1. AWS Glue コンソール (https://console.aws.amazon.com/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. Athena コンソール (https://console.aws.amazon.com/athena/) を開きます。

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

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

Athena クエリの使用

このセクションでは、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. Athena コンソール (https://console.aws.amazon.com/athena/) を開きます。

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

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

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

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