Cost & Usage Reports (CUR)
Connect CostLens to your AWS billing data via S3 Cost & Usage Reports — no IAM role required for billing analytics.
Cost & Usage Reports (CUR) is a billing-only connection method for organisations where granting CostLens direct AWS API access is not permitted due to security or compliance requirements. Instead of an IAM role with ReadOnlyAccess, CostLens reads billing exports delivered to an S3 bucket — requiring only a narrowly scoped S3 read policy.
When to use CUR
| Use case | Recommended method |
|---|---|
| You want full cost visibility and optimization recommendations + auto-fix | IAM Role (see AWS Accounts) |
| Your security team restricts cross-account IAM roles | CUR |
| You are in a compliance environment (PCI-DSS, FedRAMP) that limits API access grants | CUR |
| You already have a CUR export and prefer not to create an IAM role | CUR |
| You are a management account and want billing analytics across all linked accounts | CUR (consolidated CUR support) |
Billing analytics only
CUR provides billing dashboards, forecasts, and anomaly detection only. Cost optimization recommendations and auto-fix features require an IAM Role connection and are not available for CUR-only accounts.
What you get with CUR
| Feature | Available |
|---|---|
| Spending dashboard (by service, region, tag) | ✅ |
| Monthly and daily cost trends | ✅ |
| Cost forecasts and anomaly detection | ✅ |
| Resource-level cost visibility | ✅ (CUR is more granular than Cost Explorer) |
| Budget alerts | ✅ |
| Cost optimization recommendations | ❌ |
| Auto-fix and remediation | ❌ |
| EC2 / RDS / EBS scanning | ❌ |
How it works
Enable CUR in AWS Billing
Configure AWS to export a daily billing report to an S3 bucket in your account.
Create an S3 read-only IAM role for CostLens
Create an IAM role that trusts the CostLens AWS account. Attach a policy with only s3:GetObject and s3:ListBucket on the specific CUR bucket. No other AWS API access is granted.
Connect in CostLens → Add Account → Cost & Usage Reports
Enter the IAM role ARN, S3 bucket name, prefix, and region. CostLens verifies S3 access before saving.
CostLens ingests billing data daily
AWS delivers CUR files within 24 hours. CostLens processes the latest files each day at 05:00 UTC and upserts cost records into the billing database.
Step 1 — Enable Cost & Usage Reports in AWS
- Sign in to the AWS Console and go to Billing & Cost Management → Cost & Usage Reports.
- Click Create report.
- Fill in the report settings:
| Setting | Value |
|---|---|
| Report name | costlens-cur (or any name you choose) |
| Include resource IDs | ✅ Check this |
| Time granularity | Hourly |
| Report versioning | Overwrite existing report |
| Compression type | GZIP |
| File format | CSV |
- Click Next to configure the S3 delivery.
- Create a new S3 bucket or select an existing one. Enter a prefix (e.g.,
costlens/). AWS will automatically add the required bucket policy allowing the billing service to write files. - Click Next → Review and Complete.
AWS delivers the first CUR file within 24 hours of enabling the report. After that, new files are delivered daily. If you connect CostLens before the first delivery, billing data will appear automatically once AWS delivers the report.
Step 2 — Create an S3 read-only IAM role for CostLens
CostLens needs an IAM role in your account to read the CUR files from S3. This role requires only two S3 permissions — no other AWS access is granted.
2a — Create the role
- In AWS IAM → Roles → Create role, select AWS account as the trusted entity type.
- Choose Another AWS account and enter the CostLens AWS account ID (shown in the connect dialog inside CostLens).
- Check Require external ID and paste the External ID displayed in the CostLens connect dialog.
- Click Next.
2b — Attach an S3 read-only inline policy
Instead of using a managed policy, create an inline policy scoped to your specific CUR bucket:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CostlensCURRead",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::YOUR-CUR-BUCKET-NAME",
"arn:aws:s3:::YOUR-CUR-BUCKET-NAME/*"
]
}
]
}Replace YOUR-CUR-BUCKET-NAME with the name of the S3 bucket where AWS delivers your CUR files.
This policy grants CostLens only the ability to list and download files from your CUR bucket. It cannot access any other AWS service, create or delete resources, or read any other data.
2c — Name the role and create it
Name the role CostLensCURReadOnly (or any name that fits your naming convention). Click Create role.
Copy the Role ARN — you will paste it into CostLens in the next step.
Step 3 — Connect in CostLens
- In CostLens, go to Accounts → Add Account.
- Under the Billing Only section, click Cost & Usage Reports.
- Fill in the form:
| Field | Value |
|---|---|
| Account name | Optional — auto-populated if the IAM role has iam:GetAccountAlias |
| S3 Read-Only IAM Role ARN | The ARN from Step 2c |
| S3 Bucket Name | The bucket name from Step 1 |
| S3 Prefix | The prefix you set in Step 1 (e.g., costlens/) |
| Bucket Region | The AWS region of the S3 bucket |
- Click Test S3 Access to verify CostLens can read the bucket. This must pass before you can connect.
- Click Connect Account.
Step 4 — What to expect
After connecting:
- CostLens sets the account status to Billing Only and immediately attempts to find existing CUR files in the bucket.
- If AWS has already delivered at least one billing period, billing data appears in the dashboard within a few minutes.
- If no CUR files exist yet (you just enabled the report), data will appear after AWS delivers the first file — typically within 24 hours.
- CostLens processes CUR data daily at 05:00 UTC, covering the 3 most-recent billing periods on each run to catch up if files were missed.
CUR data has approximately 24-hour latency from AWS — yesterday's spend appears today. This is a characteristic of CUR delivery, not a CostLens limitation. For near-real-time billing data, use an IAM Role connection with Cost Explorer instead.
Consolidated CUR (multiple AWS accounts in one report)
If you are using AWS Organizations and have set up a management account CUR that covers all linked member accounts, CostLens handles this automatically.
When CostLens ingests a consolidated CUR, it filters each row by the lineItem/UsageAccountId field and only imports costs for the specific AWS account ID associated with the CostLens account. This means:
- You can connect multiple CostLens accounts, each pointing to the same consolidated CUR bucket but with a different AWS account ID.
- Each account's billing dashboard shows only its own costs — no mixing between member accounts.
How to set this up:
- Create the CUR on the management account — it will contain billing data for all linked accounts.
- In CostLens, create a separate account entry for each member account you want to analyse.
- For each account, use the same CUR bucket and prefix but enter the correct member account's IAM role ARN (the role must exist in the member account, not the management account).
Switching an existing account from Cost Explorer to CUR
If you have an IAM-connected account where Cost Explorer is not enabled, CostLens automatically falls back to CUR billing sync when:
- The account has a
cur_bucketconfigured (via the Billing Data Source panel in Account Settings), and - The billing sync encounters a "Cost Explorer not enabled" error.
To configure CUR for an existing account:
- Open the Accounts page and expand the account card.
- In the Billing Data Source section, click Configure CUR.
- Enter your S3 bucket, prefix, and region, then test and save.
Once configured, CostLens will automatically use CUR instead of Cost Explorer for billing data on the next sync.
Billing source indicator
On the Accounts page, each account card shows a small badge on the right side:
| Badge | Meaning |
|---|---|
| (no badge) | Billing data from AWS Cost Explorer |
| CUR (green) | Billing data from Cost & Usage Reports |
| Setup CUR ↓ (amber) | Cost Explorer not enabled — click to configure CUR |
Troubleshooting
| Problem | Fix |
|---|---|
| "Test S3 Access" fails with 403 | The IAM role policy does not grant s3:GetObject and s3:ListBucket on the bucket, or the External ID in the trust policy does not match. Verify both. |
| "Test S3 Access" fails with 404 | The bucket name or region is incorrect. S3 bucket names are global but region-specific endpoints are required. |
| Billing data not appearing after 24+ hours | Check the CUR is configured to deliver to the correct bucket and prefix. In AWS Billing → Cost & Usage Reports, open the report and verify the S3 path matches what you entered in CostLens. |
| Data shows $0 for all services | The CUR may be delivering Parquet format. CostLens currently requires CSV (GZIP) format. Update the CUR report settings and wait for the next delivery. |
| Consolidated CUR shows costs from wrong account | Verify that the IAM role ARN you entered belongs to the correct member account and that aws_account_id on the CostLens account matches that member account's 12-digit ID. |
| Numbers differ slightly from Cost Explorer | CUR uses unblended cost at the resource level, while Cost Explorer aggregates by service. Small differences due to rounding or service grouping are normal. |