
クラスメソッドメンバーズ提供の CUR を保存先と異なるアカウントの QuickSight から参照する設定方法
はじめに
クラスメソッドでは、弊社サービスのクラスメソッドメンバーズに対応した AWS Cost and Usage Reports(CUR) を提供しています。その メンバーズ CUR のデータを他のアカウントの QuickSight から参照したくなりました。
本記事ではメンバーズ CUR を別アカウントの QuickSight から参照する手順を解説します。
前提条件
以下の環境が整っていることを前提とします。
- データ共有元アカウント:111111111111(メンバーズ CUR 保有アカウント)
- メンバーズ CUR の設定が完了している
- データ参照先アカウント:222222222222(QuickSight 利用アカウント)
- QuickSight がセットアップ済み
AWS 組織レベルで出力したメンバーズ CUR が S3 バケットに保存されている状態が前提です。
QuickSight はサインアップまで済ませた状態が前提です。
全体構成
本記事で構築するクロスアカウントアクセスの全体構成を以下に示します。2 つのアカウントでそれぞれ設定します。
-
データ共有側アカウント(メンバーズ CUR 保有するアカウント)
- Glue データカタログの共有設定
- S3 バケットポリシーの追加
-
データ参照側アカウント(QuickSight を利用するアカウント)
- IAM ポリシーの作成とアタッチ
- Athena でのデータソース設定
- QuickSight でのデータセット作成
データ共有側アカウントの設定
Glue データカタログの共有設定
データ共有側アカウントで Glue データカタログの共有設定を行います。
AWS Glue コンソールでデータカタログの設定画面を開きます。Catalog settings から Permissons にポリシーを設定します。
Principal
は参照先アカウントの IAM ロールと QuickSight サービスロールを許可します。IAM ロールは Athena から動作確認用のため任意です。
Resource
はデータ共有側のアカウント ID と、Glue のカタログ情報を指定します。前提条件で紹介したブログ通りに作成すれば、データベース名、テーブル名は変更する必要ありません。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::222222222222:role/athena-user-role",
"arn:aws:iam::222222222222:role/service-role/aws-quicksight-service-role-v0"
]
},
"Action": "glue:*",
"Resource": [
"arn:aws:glue:ap-northeast-1:111111111111:catalog",
"arn:aws:glue:ap-northeast-1:111111111111:database/mcur",
"arn:aws:glue:ap-northeast-1:111111111111:table/*"
]
}
]
}
S3 バケットポリシーの追加
S3 バケットポリシーを設定します。
メンバーズ CUR データ格納先の S3 バケットにポリシーを追加します。既存のバケットポリシーはそのまま残して、以下の記述を追加してください。
Principal
は参照先アカウントのスイッチロールして作業用する IAM ロールと QuickSight サービスロールを許可します。ここでも同様に IAM ロールは Athena から動作確認用のため任意です。
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::222222222222:role/service-role/aws-quicksight-service-role-v0",
"arn:aws:iam::222222222222:role/athena-user-role"
]
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::cur-data-bucket-111111111111/*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::222222222222:role/service-role/aws-quicksight-service-role-v0",
"arn:aws:iam::222222222222:role/athena-user-role"
]
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::cur-data-bucket-111111111111"
}
データ参照側アカウントの設定
IAM ポリシーの作成
データ参照側アカウントで IAM ポリシーを作成します。
ポリシー名は GlueDataCatalogCrossAccountPolicy
とします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::cur-data-bucket-111111111111/*"
},
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::cur-data-bucket-111111111111"
},
{
"Effect": "Allow",
"Action": "glue:*",
"Resource": [
"arn:aws:glue:ap-northeast-1:111111111111:catalog",
"arn:aws:glue:ap-northeast-1:111111111111:database/mcur",
"arn:aws:glue:ap-northeast-1:111111111111:table/*"
]
}
]
}
メンバーズ CUR を保存しているアカウント側の作業は以上です。
IAM ロールへのポリシーアタッチ
作成したポリシーを QuickSight サービスロールにアタッチします。私は動作確認のためスイッチロールしたロールから Athena を操作するため、IAM ロールにもアタッチしています。
- QuickSight サービスロール(
aws-quicksight-service-role-v0
) - Athena を操作するユーザーの IAM ロール(
athena-user-role
)
Athena でデータソース作成・動作確認
別アカウントの Glue カタログへアクセスするため Athena コンソールでデータソースを作成します。
データソースの作成
まず Athena コンソールの「データソースとカタログ」を開きます。
「データソースを作成」をクリックし AWS Glue Data Catalog を選択します。
データソース名とカタログ ID を入力します。
- データソース名:
mcur-from-other-account
(任意) - カタログ ID:
111111111111
(データ共有元アカウント ID)
作成したデータソースが一覧に表示されることを確認します。
クエリの実行テスト
作成したデータソースを使用して Athena クエリエディタでクエリを実行します。
以下のクエリで動作を確認します。メンバーズ CUR に保存されているのデータから請求期間情報を表示します。
SELECT
distinct bill_billing_period_start_date
FROM
mcur.cur
ORDER BY
bill_billing_period_start_date desc;
結果が返ればクロスアカウントアクセスが正常に設定されています。
QuickSight での可視化
Athena での確認が完了したら QuickSight で可視化を設定します。
データセットの作成
QuickSight コンソールで新しいデータセットを作成します。Athena を選択します。
任意の名前でデータソースを作成します。
Athena で作成したデータソース名を選択すると、データベース、テーブル名が表示されます。テーブルを選択して上で「データ編集/プレビュー」を選択します。
データが表示されることを確認し保存して公開します。ここで表示されなければ権限周りか、タイムアウトなどが疑われます。エラーメッセージを確認して切り分けてください。
カスタム SQL の使用
SPICE 容量に制限がある場合や、特定のデータのみ使う場合はカスタム SQL でデータを絞り込みます。
今回は検証のために特定のアカウントのみで良かったため、WHERE 句の line_item_usage_account_id
でコスト分析したいアカウント ID を指定しました。
SELECT
*
FROM
"mcur-from-other-account"."mcur"."cur"
WHERE
line_item_usage_account_id IN ('333333333333', '444444444444')
分析の作成
データセット準備完了後クロスアカウントで取得したデータを使用して分析を作成します。
これで設定完了です。
まとめ
メンバーズ CUR を別アカウントの QuickSight から参照する設定を解説しました。
おわりに
権限設定で上手くいかず四苦八苦したので書き残しておきました。
QuickSight や、コスト分析(データ分析)なんもわからん、独自に分析してもその後の運用ができないという方は、Cost Intelligence Dashboards からはじめることをオススメします。