
How to connect CUR data via Athena to Quick in a cross-account environment
This guide shows how to aggregate AWS Cost and Usage Report (CUR) data across multiple accounts and analyze it in QuickSight—for reseller users who can't create CUR in their Payer account. Steps: export CUR to S3 via Data Exports (CFn StackSets), create an Athena workgroup, Glue crawler/tables, and a UNION view in an aggregation account, then connect cross-account from QuickSight using IAM switch roles and Boto3. A key use case: tracking per-user Amazon Bedrock (Claude) costs via IAM principal email.
```
If you can export CUR data from your Payer account, this method is much simpler, so please treat this as a guide only.
This is intended for those who have a reseller contract and are unable to create CUR in their Payer account.
```
If you can export CUR data from your Payer account, this method is much simpler, so please treat this as a guide only.
This is intended for those who have a reseller contract and are unable to create CUR in their Payer account.
```
!!! Due to character limits, I cannot include the CFn template here; please refer to the original article at the canonical URL .
We create below architecture.

Creating a data export(CUR)
1.Creating a S3 bucket for store date
| parameter | value | remarks |
|---|---|---|
| Bucket name | Any bucket name | ex: cur-data-bucket |
Configure the bucket policy as follows.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnableAWSDataExportsToWriteToS3AndCheckPolicy",
"Effect": "Allow",
"Principal": {
"Service": [
"bcm-data-exports.amazonaws.com",
"billingreports.amazonaws.com"
]
},
"Action": [
"s3:PutObject",
"s3:GetBucketPolicy"
],
"Resource": [
"arn:aws:s3:::${BucketName}",
"arn:aws:s3:::${BucketName}/*"
],
"Condition": {
"StringEquals": {
"aws:SourceOrgID": "o-xxxxxxx"
}
}
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::${QuickAccountId}:root"
},
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::${BucketName}",
"arn:aws:s3:::${BucketName}/*"
]
}
]
}
2.Creating a data export
| parameter | value | remarks |
|---|---|---|
| Type | standard data export | |
| Name | any name | ex: cur-export |
| Data table | CUR2.0 | |
| Configure data table | check `Include caller identity (IAM principal) allocation data` | For the purpose of analysing model callers in Bedrock |
| Integrate report data | Amazon Athena | |
| Storage account | Another account | |
| S3 bucket name | bucket name created 1 procedure | |
| AWS Region | The region where 1 was created | |
| S3 bucket owner | The AWS account ID used to create 1 | |
| S3 bucket prefix | This account ID |
Create an export for each account using the settings described above.
We recommend using the CloudFormation template below to create a stack set.
(Please feel free to modify the settings as required.)
We recommend using the CloudFormation template below to create a stack set.
(Please feel free to modify the settings as required.)
```
us-east-1で作成が必要です
```
us-east-1で作成が必要です
```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
AWSTemplateFormatVersion: '2010-09-09'
Description: CUR report definition for each member account (deployed via StackSets)
Parameters:
ExportName:
Type: String
Description: Name of the export
Default: cur-export
AggregatedBucketName:
Type: String
Description: S3 bucket name in the aggregation account
AggregatedBucketOwner:
Type: String
Description: S3 bucket owner account ID of the aggregation S3 bucket
Default: 123456789123
AggregatedBucketRegion:
Type: String
Default: ap-northeast-1
Description: Region of the aggregation S3 bucket
Resources:
DataExport:
Type: AWS::BCMDataExports::Export
Properties:
Export:
DataQuery:
QueryStatement: 'SELECT bill_bill_type, bill_billing_entity, bill_billing_period_end_date, bill_billing_period_start_date, bill_invoice_id, bill_invoicing_entity, bill_payer_account_id, bill_payer_account_name, cost_category, discount, discount_bundled_discount, discount_total_discount, identity_line_item_id, identity_time_interval, line_item_availability_zone, line_item_blended_cost, line_item_blended_rate, line_item_currency_code, line_item_iam_principal, line_item_legal_entity, line_item_line_item_description, line_item_line_item_type, line_item_net_unblended_cost, line_item_net_unblended_rate, line_item_normalization_factor, line_item_normalized_usage_amount, line_item_operation, line_item_product_code, line_item_resource_id, line_item_tax_type, line_item_unblended_cost, line_item_unblended_rate, line_item_usage_account_id, line_item_usage_account_name, line_item_usage_amount, line_item_usage_end_date, line_item_usage_start_date, line_item_usage_type, line_item_user_identifier, pricing_currency, pricing_lease_contract_length, pricing_offering_class, pricing_public_on_demand_cost, pricing_public_on_demand_rate, pricing_purchase_option, pricing_rate_code, pricing_rate_id, pricing_term, pricing_unit, product, product_comment, product_fee_code, product_fee_description, product_from_location, product_from_location_type, product_from_region_code, product_instance_family, product_instance_type, product_instancesku, product_location, product_location_type, product_operation, product_pricing_unit, product_product_family, product_region_code, product_servicecode, product_sku, product_to_location, product_to_location_type, product_to_region_code, product_usagetype, reservation_amortized_upfront_cost_for_usage, reservation_amortized_upfront_fee_for_billing_period, reservation_availability_zone, reservation_effective_cost, reservation_end_time, reservation_modification_status, reservation_net_amortized_upfront_cost_for_usage, reservation_net_amortized_upfront_fee_for_billing_period, reservation_net_effective_cost, reservation_net_recurring_fee_for_usage, reservation_net_unused_amortized_upfront_fee_for_billing_period, reservation_net_unused_recurring_fee, reservation_net_upfront_value, reservation_normalized_units_per_reservation, reservation_number_of_reservations, reservation_recurring_fee_for_usage, reservation_reservation_a_r_n, reservation_start_time, reservation_subscription_id, reservation_total_reserved_normalized_units, reservation_total_reserved_units, reservation_units_per_reservation, reservation_unused_amortized_upfront_fee_for_billing_period, reservation_unused_normalized_unit_quantity, reservation_unused_quantity, reservation_unused_recurring_fee, reservation_upfront_value, resource_tags, savings_plan_amortized_upfront_commitment_for_billing_period, savings_plan_end_time, savings_plan_instance_type_family, savings_plan_net_amortized_upfront_commitment_for_billing_period, savings_plan_net_recurring_commitment_for_billing_period, savings_plan_net_savings_plan_effective_cost, savings_plan_offering_type, savings_plan_payment_option, savings_plan_purchase_term, savings_plan_recurring_commitment_for_billing_period, savings_plan_region, savings_plan_savings_plan_a_r_n, savings_plan_savings_plan_effective_cost, savings_plan_savings_plan_rate, savings_plan_start_time, savings_plan_total_commitment_to_date, savings_plan_used_commitment, split_line_item_actual_usage, split_line_item_net_split_cost, split_line_item_net_unused_cost, split_line_item_parent_resource_id, split_line_item_public_on_demand_split_cost, split_line_item_public_on_demand_unused_cost, split_line_item_reserved_usage, split_line_item_split_cost, split_line_item_split_usage, split_line_item_split_usage_ratio, split_line_item_unused_cost, tags FROM COST_AND_USAGE_REPORT'
TableConfigurations:
COST_AND_USAGE_REPORT:
BILLING_VIEW_ARN: !Sub arn:aws:billing::${AWS::AccountId}:billingview/primary
INCLUDE_CAPACITY_RESERVATION_DATA: "FALSE"
INCLUDE_IAM_PRINCIPAL_DATA: "TRUE"
INCLUDE_MANUAL_DISCOUNT_COMPATIBILITY: "FALSE"
INCLUDE_RESOURCES: "TRUE"
INCLUDE_SPLIT_COST_ALLOCATION_DATA: "TRUE"
TIME_GRANULARITY: "HOURLY"
Description: CUR report definition for each member account
DestinationConfigurations:
S3Destination:
S3Bucket: !Ref AggregatedBucketName
S3BucketOwner: !Ref AggregatedBucketOwner
S3OutputConfigurations:
Compression: PARQUET
Format: PARQUET
OutputType: ATHENA
Overwrite: OVERWRITE_REPORT
S3Prefix: !Sub ${AWS::AccountId}
S3Region: !Ref AggregatedBucketRegion
Name: !Ref ExportName
RefreshCadence:
Frequency: SYNCHRONOUS
Working with aggregated account
we will carry out the following three tasks:
・1. Creating a workgroup
・2. Creating a Glue table
・3. Creating an IAM role for th switch
・4. Creating a view
・2. Creating a Glue table
・3. Creating an IAM role for th switch
・4. Creating a view
I have provided a simple explanation below.but I have also prepared a CFn template.
so please feel free to use it as a reference.(please refer to article at the canonical URL)
so please feel free to use it as a reference.(please refer to article at the canonical URL)
Creating a workgroup
Create an Athena workgroup in the aggregation account.
Please note that if you set the output destination to ‘Managed’, the subsequent steps will fail, so be sure to select ‘Custom’.
Please note that if you set the output destination to ‘Managed’, the subsequent steps will fail, so be sure to select ‘Custom’.
You should also set a data limit for the workgroup to prevent inadvertently triggering an excessive number of scans.
Creating Glue crawler and tables
If you enable the Athena integration in the data export settings, a CFn template will be placed in the following path within the destination bucket:
s3://bucket-name/prefix/…/crawler-cfn.yml
s3://bucket-name/prefix/…/crawler-cfn.yml

If you use this template to create a stack, Glue tables and crawlers will be created.
However, as we are checking data exported from multiple accounts in this instance, the prefix has been set to the account ID, so you will need to make a slight adjustment to that part.
However, as we are checking data exported from multiple accounts in this instance, the prefix has been set to the account ID, so you will need to make a slight adjustment to that part.
Creating a IAM Role for assume role from Quick account
Create an IAM role to access Athena from your Quick account.
Write the trust policy as follows:
Write the trust policy as follows:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::${QuickAccountId}:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringLike": {
"sts:ExternalId": "arn:aws:quicksight:*:${QuickAccountId}:datasource/*"
}
}
}
]
}
The policy to be attached to the role is as follows.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"athena:BatchGetQueryExecution",
"athena:CancelQueryExecution",
"athena:GetCatalogs",
"athena:GetExecutionEngine",
"athena:GetExecutionEngines",
"athena:GetNamespace",
"athena:GetNamespaces",
"athena:GetQueryExecution",
"athena:GetQueryExecutions",
"athena:GetQueryResults",
"athena:GetQueryResultsStream",
"athena:GetTable",
"athena:GetTables",
"athena:ListQueryExecutions",
"athena:RunQuery",
"athena:StartQueryExecution",
"athena:StopQueryExecution",
"athena:ListWorkGroups",
"athena:ListEngineVersions",
"athena:GetWorkGroup",
"athena:GetDataCatalog",
"athena:GetDatabase",
"athena:GetTableMetadata",
"athena:ListDataCatalogs",
"athena:ListDatabases",
"athena:ListTableMetadata"
],
"Resource": [
"arn:aws:athena:ap-northeast-1:${AggregatedAccountId}:workgroup/${WorkGroupName}",
"arn:aws:athena:ap-northeast-1:${AggregatedAccountId}:datacatalog/*"
]
},
{
"Effect": "Allow",
"Action": [
"glue:GetCatalog",
"glue:GetCatalogs",
"glue:GetDatabase",
"glue:GetDatabases",
"glue:GetTable",
"glue:GetTables",
"glue:GetPartition",
"glue:GetPartitions",
"glue:BatchGetPartition"
],
"Resource": [
"arn:aws:glue:ap-northeast-1:${AggregatedAccountId}:catalog",
"arn:aws:glue:ap-northeast-1:${AggregatedAccountId}:database/*",
"arn:aws:glue:ap-northeast-1:${AggregatedAccountId}:table/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:GetObject",
"s3:PutObject",
"s3:AbortMultipartUpload",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:ListMultipartUploadParts"
],
"Resource": [
"arn:aws:s3:::${AggregatedBucketName}",
"arn:aws:s3:::${AggregatedBucketName}/*",
"arn:aws:s3:::${AthenaQueryOutputBucket}",
"arn:aws:s3:::${AthenaQueryOutputBucket}/*"
]
}
]
}
```
If you do not have sufficient permissions, please adjust them as necessary.
```
If you do not have sufficient permissions, please adjust them as necessary.
```
Creating a view
As the tables with the ‘data_’ prefix are returned by account number, we will use a UNION.
Furthermore, as the default column names in the tables would exceed Quick’s 64-character limit and double data type restriction, causing the data source creation to fail, we will create a view.
The following query performs character length and data type conversion.
Furthermore, as the default column names in the tables would exceed Quick’s 64-character limit and double data type restriction, causing the data source creation to fail, we will create a view.
The following query performs character length and data type conversion.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
CREATE OR REPLACE VIEW "athenadataexports_cur_2"."cur_view" AS
SELECT
-- ■ 請求情報
billing_period,
bill_bill_type,
bill_billing_entity,
bill_billing_period_start_date,
bill_billing_period_end_date,
bill_invoice_id,
bill_invoicing_entity,
bill_payer_account_id,
bill_payer_account_name,
-- ■ 明細識別
identity_line_item_id,
identity_time_interval,
-- ■ 使用明細
line_item_usage_account_id,
line_item_usage_account_name,
line_item_product_code,
line_item_line_item_type,
line_item_line_item_description,
line_item_usage_start_date,
line_item_usage_end_date,
line_item_usage_type,
line_item_operation,
line_item_availability_zone,
line_item_usage_amount,
line_item_normalization_factor,
line_item_normalized_usage_amount,
line_item_currency_code,
line_item_unblended_rate,
line_item_unblended_cost,
line_item_blended_rate,
line_item_blended_cost,
line_item_net_unblended_rate,
line_item_net_unblended_cost,
line_item_iam_principal,
line_item_legal_entity,
line_item_tax_type,
line_item_user_identifier,
line_item_resource_id,
-- ■ 製品情報(MAP<varchar,varchar> → JSON文字列に変換)
json_format(cast(product AS JSON)) AS product,
product_comment,
product_fee_code,
product_fee_description,
product_from_location,
product_from_location_type,
product_from_region_code,
product_instance_family,
product_instance_type,
product_instancesku,
product_location,
product_location_type,
product_operation,
product_pricing_unit,
product_product_family,
product_region_code,
product_servicecode,
product_sku,
product_to_location,
product_to_location_type,
product_to_region_code,
product_usagetype,
-- ■ 料金情報
pricing_currency,
pricing_lease_contract_length,
pricing_offering_class,
pricing_public_on_demand_cost,
pricing_public_on_demand_rate,
pricing_purchase_option,
pricing_rate_code,
pricing_rate_id,
pricing_term,
pricing_unit,
-- ■ 割引情報(MAP<varchar,double> → JSON文字列に変換)
json_format(cast(discount AS JSON)) AS discount,
discount_bundled_discount,
discount_total_discount,
-- ■ コストカテゴリ・タグ(MAP<varchar,varchar> → JSON文字列に変換)
json_format(cast(cost_category AS JSON)) AS cost_category,
json_format(cast(resource_tags AS JSON)) AS resource_tags,
json_format(cast(tags AS JSON)) AS tags,
-- ■ リザーベーション(RI)
reservation_amortized_upfront_cost_for_usage
AS rsv_amortized_upfront_cost_for_usage,
reservation_amortized_upfront_fee_for_billing_period
AS rsv_amortized_upfront_fee_for_billing_period,
reservation_availability_zone
AS rsv_availability_zone,
reservation_effective_cost
AS rsv_effective_cost,
reservation_end_time
AS rsv_end_time,
reservation_modification_status
AS rsv_modification_status,
reservation_number_of_reservations
AS rsv_number_of_reservations,
reservation_recurring_fee_for_usage
AS rsv_recurring_fee_for_usage,
reservation_reservation_a_r_n
AS rsv_reservation_a_r_n,
reservation_start_time
AS rsv_start_time,
reservation_subscription_id
AS rsv_subscription_id,
reservation_total_reserved_normalized_units
AS rsv_total_reserved_normalized_units,
reservation_total_reserved_units
AS rsv_total_reserved_units,
reservation_units_per_reservation
AS rsv_units_per_reservation,
reservation_normalized_units_per_reservation
AS rsv_normalized_units_per_reservation,
reservation_unused_quantity
AS rsv_unused_quantity,
reservation_unused_normalized_unit_quantity
AS rsv_unused_normalized_unit_quantity,
reservation_unused_recurring_fee
AS rsv_unused_recurring_fee,
reservation_unused_amortized_upfront_fee_for_billing_period
AS rsv_unused_amortized_upfront_fee_for_billing_period,
reservation_upfront_value
AS rsv_upfront_value,
reservation_net_amortized_upfront_cost_for_usage
AS rsv_net_amort_upfront_cost_usage,
reservation_net_amortized_upfront_fee_for_billing_period
AS rsv_net_amort_upfront_fee_billing,
reservation_net_effective_cost
AS rsv_net_effective_cost,
reservation_net_recurring_fee_for_usage
AS rsv_net_recurring_fee_usage,
reservation_net_unused_recurring_fee
AS rsv_net_unused_recurring_fee,
reservation_net_unused_amortized_upfront_fee_for_billing_period
AS rsv_net_unused_amort_upfront_fee,
reservation_net_upfront_value
AS rsv_net_upfront_value,
-- ■ Savings Plans(SP)
savings_plan_savings_plan_a_r_n
AS sp_savings_plan_a_r_n,
savings_plan_savings_plan_rate
AS sp_savings_plan_rate,
savings_plan_savings_plan_effective_cost
AS sp_savings_plan_effective_cost,
savings_plan_end_time
AS sp_end_time,
savings_plan_instance_type_family
AS sp_instance_type_family,
savings_plan_offering_type
AS sp_offering_type,
savings_plan_payment_option
AS sp_payment_option,
savings_plan_purchase_term
AS sp_purchase_term,
savings_plan_region
AS sp_region,
savings_plan_start_time
AS sp_start_time,
savings_plan_total_commitment_to_date
AS sp_total_commitment_to_date,
savings_plan_used_commitment
AS sp_used_commitment,
savings_plan_recurring_commitment_for_billing_period
AS sp_recurring_commitment_for_billing_period,
savings_plan_amortized_upfront_commitment_for_billing_period
AS sp_amortized_upfront_commitment_for_billing_period, savings_plan_net_savings_plan_effective_cost
AS sp_net_effective_cost,
savings_plan_net_amortized_upfront_commitment_for_billing_period
AS sp_net_amort_upfront_commit_billing,
savings_plan_net_recurring_commitment_for_billing_period
AS sp_net_recurring_commit_billing
FROM "athenadataexports_cur_2"."data";
Crawler -> Join using UNION -> Schedule column name changes and type conversions.
(See template)
(See template)
Working with a Quick account
In your Quick account, you will perform the following tasks:
・Create an IAM role to switch to the aggregate account’s IAM role
・Create a data source in QuickSight
・Create a data source in QuickSight
We have also prepared a CFn template for this; please refer to it.(please refer to article at the canonical URL)
Create an IAM role that switches to the IAM role of the aggregated account
Create an IAM role for Switch in your Quick account.
Set the trust policy as follows:
Set the trust policy as follows:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "quicksight.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringLike": {
"aws:SourceArn": "arn:aws:quicksight:*:${QuickAccountId}:datasource/*",
"aws:SourceAccount": "${QuickAccountId}"
}
}
}
]
}
The policy to be attached to the role is as follows.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::${AggregatedAccountId}:role/qs-athena-consumer-role",
"Condition": {
"StringLike": {
"sts:ExternalId": "arn:aws:quicksight:*:${QuickAccountId}:datasource/*"
}
}
}
]
}
Creating data source in Quick
As data sources cannot be created via the Quick console for cross-account scenarios, you will need to create them using the CLI or similar tools.
I used Boto3, so I’ve included the details here for reference.
I used Boto3, so I’ve included the details here for reference.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import boto3
client = boto3.client('quicksight', region_name='ap-northeast-1')
response = client.create_data_source(
AwsAccountId='${QuickAccountId}',
DataSourceId='cur-data-source',
Name='Athena Cross Account - Consumer Data',
Type='ATHENA',
DataSourceParameters={
"AthenaParameters": {
"WorkGroup": "${WorkGroupName}",
"RoleArn": "arn:aws:iam::${QuickAccountId}:role/qs-athena-cross-account-role",
"ConsumerAccountRoleArn": "arn:aws:iam::${AggregatedAccountId}:role/qs-athena-consumer-role"
}
}
)
response = client.update_data_source_permissions(
AwsAccountId='${QuickAccountId}',
DataSourceId='cur-data-source',
GrantPermissions=[
{
'Principal': '${QuickUserARN}',
'Actions': ["quicksight:DescribeDataSource","quicksight:DescribeDataSourcePermissions","quicksight:PassDataSource","quicksight:UpdateDataSource","quicksight:DeleteDataSource","quicksight:UpdateDataSourcePermissions"]
},
]
)
Working with Quick
Once you have created a data source in Quick, all you need to do is create an analysis in Quick.
Create a data set
Create a dataset from the Quick console.
Select the data source you created earlier, and select the view as the table.

I’ll also add an update schedule.
I’ll try running an incremental update every day at 10:00.
I’ll try running an incremental update every day at 10:00.

I’ll try using ‘line_item_usage_start_date’ for the date column.

Creating an analysis
Since we’re using Quick anyway, let’s try generating it with AI.

The outline is generated as shown below.

Here’s what I’ve come up with!

```
I asked them to add the account ID to the control, but they haven’t done it...
```
I asked them to add the account ID to the control, but they haven’t done it...
```
Claude analysis
The reason for creating this was to find out the costs per user for Claude (Bedrock).
Further details are available in the blog post below, so please do take a look.
Further details are available in the blog post below, so please do take a look.
https://aws.amazon.com/jp/blogs/news/track-amazon-bedrock-costs-by-caller-identity-with-iam-based-cost-allocation/
As we use IAM Identity Center, we will use a calculated field to extract the email addresses.
`split({line_item_iam_principal}, '/', -1)`
Now you can see the costs for each user!
In conclusion
This time, I’ve set up a system to aggregate CUR data from multiple accounts and analyse it using Quick.
In short, there’s a whole host of useful information here, so I hope it proves helpful to someone.
In short, there’s a whole host of useful information here, so I hope it proves helpful to someone.
Thank you for reading!!
Enjoyed reading this content? Let the author know!
Your likes, comments, shares, and saves help creators reach more builders.
Loading recommendations
Loading article