目次

1. はじめに

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

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

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

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

今回はタイトルにあるように、クロスアカウントアクセスを使用して別環境のAWSアカウントのAthenaをデータソースとして接続し、分析・可視化を行う方法をステップバイステップで解説したいと思います。

この記事で解説する内容

  • クロスアカウントアクセスを使用して、別環境のAthenaを接続する
    • GrafanaコンソールからAthenaへクエリ分析を行い棒グラフとして可視化する

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

2. クロスアカウントアクセスを使用したAmazon Managed Grafana+Athenaの構成図

  • クロスアカウントアクセスを使用するため、2つのAWSアカウント環境を用意します。
    • AWSアカウントA:Amazon Managed Grafanaをホストしている環境
    • AWSアカウントB:Athena分析環境をホストしている環境

2.1 前提環境について

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

3. 事前準備(AWSアカウントB)

  • クロスアカウントアクセス実装のための事前準備
    • Athenaデータソースへ接続ができる最小権限のIAMロールとポリシーを作成する。
    • IAMロールにAWSアカウントAのIDからのアクセスを許可するよう信頼関係を設定する。

3.1 Athenaのワークグループにタグを付与

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

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

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

3.2 IAMロールを新規作成

  • AWSコンソールから「IAM」サービス画面へ遷移し、IAMロールを新規作成する。
  • ステップ 1:信頼されたエンティティを選択
    • 以下の設定値を入力し、「次へ」をクリック。
設定する項目名 入力するパターン 選択するパターン
IAMロール名 AmazonManagedGrafana-CrossAccountTestRole
信頼されたエンティティタイプ AWSアカウント
別の AWS アカウント AWSアカウントAのID
オプション 外部 ID を要求する (サードパーティがこのロールを引き受ける場合のベストプラクティス)
外部 ID 好きな文字列で指定 ※[AWSドキュメントの内容]に沿っていればOK

補足画像

3.3 最小権限のIAMポリシーを新規作成し付与

  • ステップ 2:許可を追加
    • 「ポリシーを作成」クリック

  • 「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アカウントBのID】:catalog",
                "arn:aws:glue:【リージョン名】:【AWSアカウントBのID】:database/【Athenaデータベース名】",
                "arn:aws:glue:【リージョン名】:【AWSアカウントBの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環境に対応した値を代入する。
  • 右下の「次へ」をクリック、IAMポリシー名を入力し新規作成する。今回の記事ではAmazonManagedGrafana-CrossAccountTestPolicyとしています。
  • IAMロール新規作成途中画面へ戻り、リロードをします。

  • ポリシー名で検索すると、先程作成したポリシーを選択できます。これを選択し「次へ」。

  • IAMロール名を入力し新規作成する。今回の記事ではAmazonManagedGrafana-CrossAccountTestRoleとしています。右下の「ロールを作成」クリック。
  • 新規作成されたIAMロールの「許可」タブから作成したポリシーが紐づいていることを確認する。

  • 新規作成されたIAMロールの「信頼関係」タブからAWSアカウントAのIDと作成した外部キーが反映されていることを確認する。

4. 事前準備(AWSアカウントA)

  • クロスアカウントアクセス実装のための事前準備
    • 3の事前準備で作成したAWSアカウントBのIAMロールAmazonManagedGrafana-CrossAccountTestRoleを委任できるように設定する。

4.2 Amazon Managed Grafanaワークスペースに紐づくIAMロールに委任ポリシーを付与

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

  • 該当のIAMロール詳細画面に遷移する。

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

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

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::【AWSアカウントBのID】:role/【AWSアカウントB内に手順3で新規作成したIAMロール名】"
            ]
        }
    ]
}
  • 【】内はそれぞれAWS環境に対応した値を代入する。
  • IAMポリシー名を入力し新規作成する。今回の記事ではAmazonManagedGrafana-CrossAccountAssume-TestPolicyとしています。
  • IAMロール詳細画面より、新規作成したIAMポリシーが追加されていることを確認する。

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

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

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

  • 「COMPLETE」をクリックする。

  • ページが遷移するので、「Add data source」配下の検索窓で「Athena」と入力し検索する。
  • 候補にAthenaが出現するので、クリックする。

  • それぞれの項目に対応する選択or入力する値を表に従い、データソースを追加する。
Connection Details
Authentication Provider Workspace IAM Role
Assume Role ARN 【手順3で作成したIAMロールのARNを入力】
External ID 【手順3で作成したIAMロールの外部キーを入力】
Endpoint 必要なし
Default Region AWSアカウントBのAthenaデータソースが存在するリージョンを選択

上記のConnection Detailsを入力すると、以下のAthena Detailsでデータソースとして選択ができる。

Athena Details
Data source AwsDataCatalog
Database 【Athenaのデータベース名】
Workgroup 【Athenaのワークグループ名】
Output Location s3://【Athenaのクエリ結果の保存先バケット名】

補足画像

  • 「Save & test」をクリックして保存。

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

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

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

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

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

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

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

  • ダッシュボード管理ページに遷移する。
  • 右上のアイコンをクリックし「Edit」をクリック。編集画面ではクエリ結果の表示形式を柔軟に変更が可能です。

  • 例えば以下のような棒グラフにできないクエリ結果のようなデータには「Gauge(ゲージ)やStat」といった表現にすることもできます。

  • Gauge(ゲージ)表記にした場合

  • Stat表記にした場合

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

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

6. まとめ

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

特にクロスアカウントアクセスができる点は使ってみて、複数のワークロードで稼働するシステムもまとめて一元管理することが可能であるため、非常に便利に感じました。

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

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

7. 参考リンク