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 20268 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

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

  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

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

  1. In CostLens, go to Accounts → Add Account.
  2. Under the Billing Only section, click Cost & Usage Reports.
  3. Fill in the form:
FieldValue
Account nameOptional — auto-populated if the IAM role has iam:GetAccountAlias
S3 Read-Only IAM Role ARNThe ARN from Step 2c
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 S3 Access to verify CostLens can read the bucket. This must pass before you can connect.
  2. 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:

  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
AWS Accounts
CostLens
Next
Recommendations