CostLensCost & Usage Reports (CUR)

Cost & Usage Reports (CUR)

Connect CostLens to your AWS billing data via S3 Cost & Usage Reports — no IAM role required for billing analytics.

Updated June 20269 min read

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 caseRecommended method
You want full cost visibility and optimization recommendations + auto-fixIAM Role (see AWS Accounts)
Your security team restricts cross-account IAM rolesCUR
You are in a compliance environment (PCI-DSS, FedRAMP) that limits API access grantsCUR
You already have a CUR export and prefer not to create an IAM roleCUR
You are a management account and want billing analytics across all linked accountsCUR (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

FeatureAvailable
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

CUR is now set up as a billing data source on a connected AWS account, not a separate "Add Account" method — see below for the two ways to connect that account depending on how minimal you need the access to be.

Enable CUR in AWS Billing

Configure AWS to export a daily billing report to an S3 bucket in your account.

Create an IAM role that trusts CostLens

Same trust policy either way (CostLens's account + your External ID) — see "Choosing how minimal to go" below for what to attach.

Connect the AWS account, then open Billing Data Source

Connect via AWS Accounts (CloudFormation or manual — either works), then on that account's card in CostLens, expand Billing Data Source and enter the S3 bucket, 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.

Choosing how minimal to go

You wantDo this
Full CostLens (billing and optimization recommendations/auto-fix) on this accountConnect normally via AWS Accounts (CloudFormation is easiest), then just add the S3 CUR policy below to that same CostLensAccessRole — no second role needed.
Billing analytics only, with the smallest possible IAM grant (no ReadOnlyAccess, no optimization checks)Create a separate role with only the S3 policy below (Step 2 further down), then connect it via AWS Accounts → Enter details manually — CostLens's connection check only verifies sts:AssumeRole succeeds, so a role scoped to nothing but S3 connects fine; it just won't have permission to run optimization checks, matching the "Billing analytics only" scope of this feature.

Step 1 — Enable Cost & Usage Reports in AWS

  1. Sign in to the AWS Console and go to Billing & Cost Management → Cost & Usage Reports.
  2. Click Create report.
  3. Fill in the report settings:
SettingValue
Report namecostlens-cur (or any name you choose)
Include resource IDs✅ Check this
Time granularityHourly
Report versioningOverwrite existing report
Compression typeGZIP
File formatCSV
  1. Click Next to configure the S3 delivery.
  2. 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.
  3. 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

  1. In AWS IAM → Roles → Create role, select AWS account as the trusted entity type.
  2. Choose Another AWS account and enter the CostLens AWS account ID (shown in the connect dialog inside CostLens).
  3. Check Require external ID and paste the External ID displayed in the CostLens connect dialog.
  4. 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:

json
{
  "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

If you're using a separate, CUR-only role (the minimal-access path above), name it CostLensCURReadOnly (or any name that fits your naming convention) and click Create role. If you're instead adding this policy to your existing CostLensAccessRole, skip straight to attaching the inline policy on that role.

Copy the Role ARN — you'll need it in the next step only if this is a new, separate role.


Step 3 — Connect the account and configure the bucket

  1. Connect (or use an already-connected) AWS account — see AWS Accounts. If you created a separate CUR-only role, connect it via Enter details manually, pasting this role's ARN.
  2. On that account's card in CostLens, expand Billing Data Source.
  3. Fill in the form:
FieldValue
S3 Bucket NameThe bucket name from Step 1
S3 PrefixThe prefix you set in Step 1 (e.g., costlens/)
Bucket RegionThe AWS region of the S3 bucket
  1. Click Test Access to verify CostLens can read the bucket. This must pass before you can save.
  2. Click Save.

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:

  1. Create the CUR on the management account — it will contain billing data for all linked accounts.
  2. In CostLens, create a separate account entry for each member account you want to analyse.
  3. 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_bucket configured (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:

  1. Open the Accounts page and expand the account card.
  2. In the Billing Data Source section, click Configure CUR.
  3. 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:

BadgeMeaning
(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

ProblemFix
"Test S3 Access" fails with 403The 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 404The bucket name or region is incorrect. S3 bucket names are global but region-specific endpoints are required.
Billing data not appearing after 24+ hoursCheck 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 servicesThe 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 accountVerify 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 ExplorerCUR uses unblended cost at the resource level, while Cost Explorer aggregates by service. Small differences due to rounding or service grouping are normal.
CostLens
Previous
GCP Accounts
CostLens
Next
Recommendations