目次

1. はじめに

みなさん、こんにちは大阪オフィスの上地です。

日々、社内システムの開発と運用に携わっておりますが、私たちの環境には多くのアプリケーションとそれに伴うAWSアカウントが存在します。

これらの多様な環境で一元的にメトリクスやデータを管理することが私たちの課題でした。
今回、この課題に対する解決策としてAmazon Managed Grafanaを試してみました。

この記事では、その仮定で学んだAmazon Managed GrafanaでAthenaをデータソースとして設定する具体的な手順についてまとめてみようと思います。

この記事で解説する内容

  • Amazon Managed GrafanaでデータソースとしてAthenaを接続する
    • GrafanaコンソールからAthenaへクエリ分析を行い棒グラフとして可視化する

この記事で解説しない内容

2. Amazon Managed Grafanaとは?

  • Grafanaとは、Grafana Labs が開発したオープンソースのインタラクティブなデータ視覚化プラットフォームです。

Grafanaは大きく3つのサービス(利用方法)があります

  • Grafana OSS
  • Grafana Cloud
    • 上述2つのサービス比較表はこちらのURLにまとめられています。
      • Grafana OSSは自前ホストとなり管理コストが高いですが無料
      • Grafana Cloudは固定プラン+従量課金制だがサポートが充実
  • Amazon Managed Grafana

Amazon Managed Grafana は Grafana Labs と共同で開発したフルマネージドサービスで、複数のソースからのデータを視覚化して分析するために Grafana のオープンソースバージョンとエンタープライズバージョンを簡単に使用できるようにします。Amazon Managed Grafana を使用することにより、サーバーのプロビジョニングや、ソフトウェアの設定と更新を行う必要なく、メトリクス、ログ、およびトレースを分析できます。

今回検証を行ったのはAmazon Managed Grafanaになります。

Amazon Managed Grafana+Athenaの構成図

  • 単体のAWSアカウントで完結する構成になります。
    • Amazon Managed GrafanaのデータソースとしてAthenaを指定する事で、Grafanaからクエリを投げて分析、結果を棒グラフで可視化します。(一度実装してしまえばGrafanaコンソールから様々なクエリで分析・可視化できます)

前提環境について

  • 本記事によるステップバイステップ解説ですが、以下のAWS環境があることが前提となります。
    • Amazon Managed Grafana のワークスペースを構築してください。
    • Athenaで分析できる環境がすでに存在することを確認してください。

3. 事前準備

Amazon Managed Grafanaから接続するAthenaのワークグループにタグを付与

  • AWSコンソールから「Athena」サービス画面へ遷移する
  • 「ワークグループ」をクリックし、「タグ」のタブを開く
  • 以下のキーと値を入力する
キー
GrafanaDataSource true

前提条件に記載のようにAmazon Managed Grafana から接続したいAthenaのワークグループに対してタグが必要です。

※S3バケットの命名規則がありますがgrafana-athena-query-results-以外の命名でも接続は可能となります。
しかしS3バケットへアクセスできるように後述3.2のIAMポリシー作成手順でS3バケット名へのアクセス許可の付与が必要です。

Amazon Managed Grafanaワークスペースに紐づくIAMロールに最小権限のIAMポリシーを付与

  • AWSコンソールから「Amazon Managed Grafana」サービス画面へ遷移する。
  • 「すべてのワークスペース」をクリックし、「対象のワークスペース名」をクリックし詳細画面へ遷移する。
  • 「IAMロール」の箇所にAmazon Managed Grafana ワークスペースが使用するIAMロール名が記載されているので、「IAM」サービス画面へ遷移して該当のロールを検索する。

  • 「許可を追加」から「インラインポリシーを作成」をクリックする。

  • 「JSON 」をクリックし、ポリシーエディタの箇所に以下のJSONをコピー&ペーストする。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:GetDatabase",
                "athena:GetDataCatalog",
                "athena:GetTableMetadata",
                "athena:ListDatabases",
                "athena:ListDataCatalogs",
                "athena:ListTableMetadata",
                "athena:ListWorkGroups"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:GetQueryExecution",
                "athena:GetQueryResults",
                "athena:GetWorkGroup",
                "athena:StartQueryExecution",
                "athena:StopQueryExecution"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "Null": {
                    "aws:ResourceTag/GrafanaDataSource": "false"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetDatabase",
                "glue:GetDatabases",
                "glue:GetTable",
                "glue:GetTables",
                "glue:GetPartition",
                "glue:GetPartitions",
                "glue:BatchGetPartition"
            ],
            "Resource": [
                "arn:aws:glue:【リージョン名】:【AWSアカウントID】:catalog",
                "arn:aws:glue:【リージョン名】:【AWSアカウントID】:database/【Athenaデータベース名】",
                "arn:aws:glue:【リージョン名】:【AWSアカウントID】:table/【Athenaデータベース名】/【Athenaテーブル名】"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::【Athenaのクエリ結果の保存先バケット名】",
                "arn:aws:s3:::【Athenaのクエリ結果の保存先バケット名】/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::【Athenaのクエリ実行時の参照先バケット名】",
                "arn:aws:s3:::【Athenaのクエリ実行時の参照先バケット名】/*"
            ]
        }
    ]
}
  • 【】内はそれぞれAWS環境に対応した値を代入する。

※補足:Amazon Managed Grafanaの「対象のワークスペース名」をクリックし、さらに「データソース」をクリックしページ遷移すると接続先データソースを有効化することができます。これによってIAMポリシーを自動で作成することも可能です。

しかしその場合、最小権限でのアクセスではなくなるため注意が必要です。

4. GrafanaコンソールからデータソースとしてAthenaを追加

  • さて事前準備が完了したので、Amazon Managed GrafanaワークスペースURLをクリックしてアクセスする。

  • 以下のような画面に遷移すれば大丈夫です。

  • 左上のアイコンをクリックし、メニューを展開する。

  • 「Apps」配下の「AWS Data Sources」をクリックし、ページ遷移する。

  • 「Athena」をクリック

  • 以下のスクリーンショットに沿って操作しデータソースを追加する。
     
     1. リージョンの選択
     2. 対象データベースとワークグループの選択
     3. データソースの追加
     4. 追加されたことを確認
     5. 詳細設定ボタンをクリックする

  • 詳細設定画面では以下のように設定する。
Connection Details
Authentication Provider Workspace IAM Role
Assume Role ARN 必要なし
External ID 必要なし
Endpoint 必要なし
Default Region 前述の操作で選択したリージョンになっていれば大丈夫です
Athena Details
Data source AwsDataCatalog
Database 【Athenaのデータベース名】
Workgroup 【Athenaのワークグループ名】
Output Location s3://【Athenaのクエリ結果の保存先バケット名】
  • 「Save & test」をクリックして保存。

GrafanaコンソールからAthenaクエリを実行する

  • 下部に「Explore」ボタンがありクリックすると、クエリ実行画面へと遷移する。

  • AthenaクエリをGrafanaコンソールの赤枠内に記入して実行してみます。これまでの設定が行えていれば正常に完了するはずです。失敗する場合はIAMポリシーの誤字脱字を見直してみてください。

  • クエリが完了するとページ下部に結果が表示されます。

Grafanaコンソールでクエリ結果を棒グラフで表示する

  • クエリ結果を棒グラフで表示するには、まずクエリ結果をダッシュボードに追加する必要があるので「Add to dashboard」をクリックする。

  • 「New dashboard」を選択し「Open dashboard」をクリックする。

  • ダッシュボード管理ページに遷移する。
  • 右上のアイコンをクリックし「Edit」をクリック。

  • 編集画面ではクエリ結果の表示形式を柔軟に変更が可能です。
  • 今回は棒グラフ表示とするため、右上のアイコンを「Bar chart」に選択する。

  • 最後に右上の「Save」をクリックし保存することでダッシュボードが保存されます。

お疲れ様でした、設定は以上となります。

5. まとめ

本記事では、Amazon Managed Grafanaを使用してAthenaをデータソースとしてどのように設定するか、そしてその結果を棒グラフとしてどのように可視化するかをステップバイステップで解説しました。

クロスアカウントアクセスする事で別AWSアカウントのデータソースに接続することなども可能です。
https://iret.media/79887 の記事で解説をしています。

Grafanaはその柔軟性と豊富な機能から、様々なデータ可視化ツールとして人気ですが、Amazon Managed Grafanaを使用することで、その設定や運用の手間を大幅に削減し、更に効率的なデータ監視と分析を実現することが可能となります。

是非みなさん使ってみてはいかがでしょうか。

6. 参考リンク