ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

S3のデータをAmazon Managed Grafanaで可視化してみた(前編:Athena接続まで)

この記事を共有する

目次

皆さんこんにちは!パーソル&サーバーワークスの小澤です。

システムを運用していると、アクセスログやイベントデータが S3 にどんどん溜まっていきます。データはあるのに、今どうなっているのかパッと見て分からない。そんな経験はないでしょうか。

S3 のデータは Athena を使えば SQL で調べられますが、その都度クエリを実行するのは手間です。傾向を継続的に見たい、複数の指標を並べたい、チームで共有したいとなると、ダッシュボードにまとめたくなります。

そこで Amazon Managed Grafana の出番です。一度ダッシュボードを作れば、あとは開くだけで最新の状況を確認できます。

今回は、S3 に溜めたアクセスログ風データを、Athena をデータソースにして Amazon Managed Grafana で可視化するハンズオンを、前後編に分けて紹介します。

  • 前編(本記事): データの準備から、Grafana に Athena を接続するまで
  • 後編: 接続したデータでダッシュボードを作る
所要時間の目安: 前編は約1時間半、後編は約1時間です。前編はリソースの作成待ちや権限設定を含むため、少し時間がかかります。

はじめに知っておきたい料金の話

Amazon Managed Grafana は無料ではありません。ワークスペースにログインして使うユーザーの人数分、ライセンス料金がかかります。本記事執筆時点(2026年8月)では、次のとおりです。

  • 管理者・編集者(Admin / Editor): 1人あたり 月 $9
  • 閲覧者(Viewer): 1人あたり 月 $5

課金対象は、その月にログインしたユーザーだけです。料金は変わる可能性があるので、必ず公式の料金ページで最新を確認してください。

つなぐデータソースの種類によっては、上記に加えて料金がかかります。Grafana のデータソースは次の2種類です。

  • 組み込みデータソース: 追加料金なしで使える。Athena、PostgreSQL、MySQL、CloudWatch など
  • Enterprise データソース: Enterprise プラグインを有効にすると使える。DynamoDB、Datadog、Snowflake など。ライセンス料に加えて、アクティブユーザー1人あたり月 $45 がかかります

今回 Athena を選んだのは、組み込みデータソースで追加料金がかからず、サーバーレスで VPC が不要なため構成をシンプルにできるからです。

この記事のスコープ: 本記事は、S3 にあるデータを Grafana で可視化するまでを扱います。運用で必要になるデータ投入の設計は範囲外とし、用意したサンプルデータを使います。

今回作成する構成

Athena_Grafana構成(横).png

各コンポーネントの役割は次のとおりです。

  • IAM Identity Center: Grafana のログイン認証を担う
  • Amazon Managed Grafana: データを可視化する基盤
  • Amazon Athena: S3 のデータに SQL を投げるサーバーレスのクエリエンジン
  • Amazon S3: データ本体を置くデータバケットと、Athena のクエリ結果を書き出す結果バケットの保管先
  • AWS Glue データカタログ: S3 のファイルをどんな列として読むかのテーブル定義を保持

Athena も S3 もサーバーレスで VPC が不要なため、ネットワークを構築せずに始められます。

Grafana のパネルを表示するとき、裏では次のように動いています。

1. Grafana が実行したいSQLを Athena に依頼(ワークグループを指定)
2. Athena が Glueカタログを参照し、テーブルの実体がS3のどのフォルダかを解決
3. Athena が S3データバケットから元データを読む
4. Athena がSQLを実行し、結果を一度S3結果バケットにファイルとして書き出す
5. Grafana は Athena のAPI経由でその結果を受け取り、グラフに描画する

ポイントは、Athena がクエリ結果を必ず一度 S3 に書き出すことです。Grafana はそのファイルを直接探しに行くのではなく、Athena の API を通じて結果を受け取ります。

このため S3バケットが2つ登場します。Athena が読むデータバケットと、書き出す結果バケットです。役割が分かれているため別々に用意し、権限もそれぞれ必要になります。

前編の手順の全体像

ステップ作業内容目的
1S3バケットを2つ作成し、サンプルデータを配置データ置き場と結果出力先を準備する
2Athena ワークグループを作成Athenaのクエリ実行環境を用意する
3Athena でテーブルを作成し、データを確認S3のデータをSQLで読めるようにする
4Amazon Managed Grafana ワークスペースを作成可視化基盤を用意する
5ユーザーを割り当ててログインGrafana を使える状態にする
6Athena データソースを接続(権限設定含む)Grafana から S3データをクエリできるようにする

Step1. S3バケットを2つ作成し、サンプルデータを配置する

今回は役割の違う S3 バケットを2つ用意します。

  • データバケット: Athena が読む元データを置く
  • 結果バケット: Athena のクエリ結果を書き出す先

1-1. データバケットを作成する

S3 コンソールからバケットを作成を開き、以下のように設定します。基本はデフォルトのままでOKです。

  • リージョン: アジアパシフィック(東京)ap-northeast-1
  • バケット名: 世界で一意な任意の名前
  • パブリックアクセスをすべてブロック: オン
  • 暗号化: デフォルトの SSE-S3

作成したら、バケットの中に access-logs/ フォルダを作ります。ここにサンプルデータを置きます。

step101S3バケット作成画面2.png

1-2. 結果バケットを作成する

同じ手順でもう1つバケットを作成します。以下の条件で作成してください。

  • バケット名: grafana-athena-query-results- で始まる名前
  • パブリックアクセスをすべてブロック: オン

中にフォルダを作る必要はありません。

step102結果バケット作成.png

1-3. サンプルデータを生成して S3 にアップロードする

今回は Web アクセスログ風のサンプルデータを使います。ローカルに環境を用意しなくても、ブラウザだけで使える AWS CloudShell で生成できます。

CloudShell を開き(コンソール右上のターミナルアイコン)、次のコマンドをそのまま貼り付けて実行します。直近7日分のアクセスログ風 CSV(access_logs.csv)が生成されます。

サンプルデータ生成スクリプト(クリックで展開・約50行)
python3 - << 'PYEOF'
import csv, random
from datetime import datetime, timedelta, timezone
DAYS = 7
BASE_PER_HOUR = 120
PATHS = [("/",0.25),("/login",0.10),("/search",0.15),("/products",0.15),
         ("/products/detail",0.12),("/cart",0.08),("/checkout",0.05),
         ("/api/users",0.05),("/api/orders",0.03),("/admin",0.02)]
METHODS = ["GET","GET","GET","GET","POST","PUT","DELETE"]
REGIONS = ["ap-northeast-1","us-east-1","eu-west-1","ap-southeast-1"]
def wpath():
    r=random.random(); c=0.0
    for p,w in PATHS:
        c+=w
        if r<=c: return p
    return PATHS[0][0]
def pstatus(path,hour):
    err=0.03
    if 2<=hour<=4: err+=0.06
    if path in ("/checkout","/api/orders"): err+=0.04
    if path=="/admin": err+=0.02
    r=random.random()
    if r<err*0.5: return random.choice([500,502,503])
    if r<err: return random.choice([400,401,403,404])
    return random.choice([200,200,200,200,201,204,301])
def platency(path,status):
    base=60
    if path in ("/search","/checkout","/api/orders"): base=180
    if path=="/products/detail": base=120
    v=random.gauss(base,base*0.4)
    if status>=500: v*=3
    return max(5,int(v))
now=datetime.now(timezone.utc).replace(minute=0,second=0,microsecond=0)
start=now-timedelta(days=DAYS)
rows=[]; t=start
while t<=now:
    hour=t.hour
    factor=0.3+0.7*(1+random.random())*(1.0 if 9<=hour<=21 else 0.4)
    for _ in range(int(BASE_PER_HOUR*factor)):
        ts=t+timedelta(seconds=random.randint(0,3599))
        path=wpath(); status=pstatus(path,hour)
        method="GET" if path in ("/","/search","/products") else random.choice(METHODS)
        rows.append([ts.strftime("%Y-%m-%dT%H:%M:%SZ"),path,method,status,
                     platency(path,status),random.randint(200,20000),
                     random.choices(REGIONS,weights=[0.6,0.2,0.1,0.1])[0]])
    t+=timedelta(hours=1)
rows.sort(key=lambda r:r[0])
with open("access_logs.csv","w",newline="",encoding="utf-8") as f:
    csv.writer(f).writerows(rows)
print("生成完了 access_logs.csv 行数=",len(rows))
PYEOF

このスクリプトは、実際のWebサイトのアクセスログをまねたCSVを作ります。データには以下の特徴を持たせています。

  • 昼間はアクセスが多く、深夜は少ない
  • 深夜帯や決済ページ(/checkout)などでエラーが起きやすい
  • 処理が重いページやエラーになったリクエストは、レスポンスタイムが長めになる

CSV の各列は、日時、パス、メソッド、ステータスコード、レスポンスタイム(ミリ秒)、レスポンスサイズ(バイト)、アクセス元の地域です。

生成できたら、データバケットの access-logs/ にアップロードします。<YOUR_DATA_BUCKET> は自分のデータバケット名に置き換えてください。

aws s3 cp access_logs.csv s3://<YOUR_DATA_BUCKET>/access-logs/access_logs.csv
aws s3 ls s3://<YOUR_DATA_BUCKET>/access-logs/

step103CloudShellでデータ生成とアップロード.png

Step2. Athena ワークグループを作成する

ワークグループは、Athena でクエリを実行するときの実行環境の単位です。今回は Grafana 専用のワークグループを1つ作成します。

Athena コンソール → 管理 → ワークグループ → ワークグループを作成 で、以下のように作成します。

  • 名前: grafana
  • 認証: AWS Identity and Access Management (IAM)
  • クエリ結果の管理: カスタマーマネージド を選び、結果の場所に Step1-2 で作った結果バケット(s3://grafana-athena-query-results-xxxx/)を指定
  • タグ: キー GrafanaDataSource / 値 true

step201ワークグループ作成とタグ1.pngstep201ワークグループ作成とタグ2.png

Step3. Athenaでテーブルを作成し、データを確認する

S3 に置いた CSV を、Athena が SQL で読めるようにテーブル定義を作ります。

3-1. データベースとテーブルを作成する

Athena のクエリエディタで以下を順に実行します。まずデータベース:

CREATE DATABASE IF NOT EXISTS grafana_handson;

続いてテーブルを作成します。最後の LOCATION にある <YOUR_DATA_BUCKET> を、自分のデータバケット名に置き換えてから実行してください。

CREATE EXTERNAL TABLE IF NOT EXISTS grafana_handson.access_logs (
    ts            string,
    path          string,
    method        string,
    status        int,
    response_ms   int,
    bytes         int,
    client_region string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
    'separatorChar' = ',',
    'quoteChar'     = '"'
)
STORED AS TEXTFILE
LOCATION 's3://<YOUR_DATA_BUCKET>/access-logs/'
TBLPROPERTIES ('has_encrypted_data' = 'false');

このSQLのポイント:

  • CREATE EXTERNAL TABLE: データ本体は S3 に置いたまま、このCSVをどう読むかという定義だけを作ります
  • 列定義: CSVの各列を左から順にこの7列に割り当てます
  • OpenCSVSerde: CSVを読み解くためのパーサー
  • LOCATION: 読み込み対象のS3フォルダ(ファイル単体ではなくフォルダを指定)

step301テーブル作成SQL実行.png

3-2. データが読めるか確認する

SELECT * FROM grafana_handson.access_logs LIMIT 10;
SELECT count(*) AS total FROM grafana_handson.access_logs;

件数がアップロードした行数と一致すれば成功です。

step302SELECT結果1.pngstep302SELECT結果2.png

Step4. Amazon Managed Grafana ワークスペースを作成する

いよいよ可視化基盤を用意します。Grafana コンソールからワークスペースを作成を開き、ウィザードに沿って設定します。

4-1. ワークスペース名を指定する

ワークスペース名は任意です。この記事では grafana-handson とします。

step401ワークスペース名1.pngstep401ワークスペース名2.png

4-2. 認証方法を選ぶ

Grafana へのログイン方法を選びます。本記事では AWS IAM Identity Center を使います。社外の IdP と連携する場合は、必要に応じて SAML を選択してください。

step402認証IAMIdentityCenter.png

4-3. アクセス許可を設定する

アクセス許可タイプは サービスマネージド を選択します。データソースは Amazon Athena にチェックを入れます。

step403サービスマネージドとAthena選択.png

4-4. 作成する

内容を確認してワークスペースを作成をクリックします。ステータスがアクティブになるまで数分待ちます。

(出典: ユーザー認証 / 最初のワークスペース作成

Step5. ユーザーを割り当ててGrafanaにログインする

ワークスペースができても、そのままではまだログインできません。誰がログインできるかを割り当てる必要があります。

5-1. ユーザーを割り当てて管理者にする

  1. ワークスペースの詳細画面で認証タブを開く
  2. IAM Identity Center のセクションで 新しいユーザーまたはグループの割り当て を選ぶ
  3. ログインさせたいユーザー(自分)を選んで割り当てる
  4. 割り当てたユーザーを選択し、アクション → 管理者を作成する を選ぶ
  5. ユーザータイプが管理者になれば完了

step501ユーザー割り当て.png

ユーザータイプの違い: 管理者(Admin)は設定を含めすべて、エディタ(Editor)はダッシュボードの作成・編集、閲覧者(Viewer)は閲覧のみができます。今回は自分で構築するので管理者にします。

step502管理者を作成する.png

5-2. Grafanaにログインする

ワークスペースの詳細画面に表示されている Grafana の URL をクリックすると、IAM Identity Center のログイン画面が開きます。SSO のユーザー情報でログインすると、Grafana のホーム画面が表示されます。

step503Grafanaホーム画面.png

Step6. Athenaデータソースを接続する

Grafana から Athena をデータソースとしてつなぐには、次の4つを順番に整えます。

  1. ワークスペースのプラグイン管理をオンにする
  2. Athena プラグインをインストールする
  3. ワークスペースの IAM ロールに Athena 用の権限を付ける
  4. データソースを作成して接続テストする

6-1. プラグイン管理をオンにする

新しい Amazon Managed Grafana ワークスペースには、CloudWatch など一部のコアプラグインしか入っていません。Athena のような追加プラグインを使うには、まず プラグイン管理をオンにします。

  • AWSコンソール → Amazon Managed Grafana → ワークスペース → ワークスペース設定オプション タブ
  • プラグイン管理を編集してオンにして保存

step601プラグイン管理をオン.png

(出典: プラグイン管理

6-2. Athena プラグインをインストールする

Grafana にログインし、Athena プラグインをインストールします。

  • Grafana 左メニュー → Administration → Plugins and data → Plugins
  • Amazon Athena を検索して開き、Install をクリック

step602プラグイン一覧_AthenaとEnterpriseバッジ.png

6-3. IAM ロールに Athena 権限を付ける

Athena を使うには、Step4 で自動作成されたワークスペースの IAM ロール(AmazonGrafanaServiceRole-xxxx)に、権限が2つ必要です。

(A) AWS 管理ポリシー AmazonGrafanaAthenaAccess

Step4-3 で Amazon Athena をチェックしていれば、このポリシーは自動でアタッチされています。IAMコンソールでロール AmazonGrafanaServiceRole-xxxx を開き、許可ポリシー一覧に含まれているか確認します。なければ 許可を追加 → ポリシーをアタッチ から付けます。

(B) データバケットの読み取り権限を追加する

AmazonGrafanaAthenaAccess にはデータバケットの読み取り権限が含まれないため、同じ IAM ロールに追加します。許可を追加 → インラインポリシーを作成 → JSON タブに以下を貼り付け、任意のポリシー名を付けて作成します。<YOUR_DATA_BUCKET>(2箇所)を自分のデータバケット名に置き換えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GrafanaReadDataBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::<YOUR_DATA_BUCKET>",
                "arn:aws:s3:::<YOUR_DATA_BUCKET>/*"
            ]
        }
    ]
}

step603IAMロールに権限付与.png

(出典: Athena データソースの前提条件 / AmazonGrafanaAthenaAccess

6-4. データソースを作成して接続テストする

Grafana の左メニュー → Connections → Data sources → Add data source を開き、一覧から Amazon Athena を選んで以下を設定します。

項目設定値
Authentication ProviderWorkspace IAM Role
Default Regionap-northeast-1
Data source(カタログ)AwsDataCatalog
Databasegrafana_handson(Step3 で作ったデータベース)
Workgroupgrafana(Step2 で作ったもの)
Output Location空欄(ワークグループの設定が使われる)

Save & test をクリックして Data source is working と出れば成功です。

step604接続設定とテスト成功.png

前編のまとめ

前編では、S3 にサンプルデータを置き、Athena でクエリできるようにして、Amazon Managed Grafana に Athena をデータソースとして接続するところまでを行いました。ここまでで、S3 のデータを Grafana から扱う準備が整いました。

接続ができたので、いよいよ後編では、このデータを使ってダッシュボードを作っていきます。

(後編へ続く)

参考リンク(出典)

  • Amazon Managed Grafana 料金: https://aws.amazon.com/grafana/pricing/
  • 組み込みデータソース: https://docs.aws.amazon.com/grafana/latest/userguide/AMG-data-sources-builtin.html
  • Athena データソースの前提条件: https://docs.aws.amazon.com/grafana/latest/userguide/Athena-prereq.html
  • AmazonGrafanaAthenaAccess(AWS管理ポリシー): https://docs.aws.amazon.com/grafana/latest/userguide/security-iam-awsmanpol.html
  • プラグイン管理: https://docs.aws.amazon.com/grafana/latest/userguide/grafana-plugins.html

最後まで読んでいただきありがとうございました!

この記事は私が書きました

小澤 陽童

記事一覧

小澤 陽童

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。