# Bucket-Export

<FeatureStatus feature="BucketExport" />

Ein Bucket-Export liefert die Kostenzeilen eines Workspaces in einen Bucket, der Ihnen gehört, als
FOCUS-1.4-Dateien: ein Ordner je Abrechnungstag, als gzip-komprimiertes CSV oder als Parquet, mit
einem Manifest, das sagt, was der Ordner enthält. Costfluent liefert jeden Tag, sobald die Daten des
Workspaces ihn erreichen, und erneut, wann immer sich die Zeilen des Tages ändern. Um die Zahlen
eines Berichts einmalig in eine Tabellenkalkulation zu holen, exportieren Sie ihn stattdessen; siehe
[Als CSV oder Excel exportieren](/de/cost-reports/explore#als-csv-oder-excel-exportieren).

Costfluent legt nur Dateien an. Es liest, listet oder löscht nie etwas im Bucket. Jede Anfrage geht
an den Speicher-Host, den Costfluent aus der Region, dem Anbieter oder dem Speicherkonto des Ziels
bildet; kein Ziel nimmt eine Adresse an, die Sie eingeben. Jedes Ziel hat eigene Zugangsdaten,
getrennt von den Verbindungen, die Ihre Cloud-Kosten lesen:

| Ziel | Costfluent schreibt mit | Was es darf |
|---|---|---|
| AWS S3 | einer Rolle in Ihrem AWS-Konto, die dem Principal von Costfluent mit der externen ID Ihrer Organisation vertraut | `s3:PutObject` unter dem Ordner des Exports |
| Google Cloud Storage | dem Dienstkonto, das Costfluent für Ihre Organisation erstellt hat | Objekte im Bucket anlegen (Storage Object Creator) |
| Azure Blob Storage | einer SAS für den Container | Blobs anlegen und schreiben, sonst nichts |
| S3-kompatibler Object Storage von OVHcloud, STACKIT, Scaleway, IONOS oder Hetzner | einem eigenen Zugriffsschlüssel | `s3:PutObject` unter dem Ordner des Exports |

## Bevor Sie beginnen

<PlanAvailability feature="BucketExport" plan="Pro" />

- Ein Ziel hinzuzufügen, zu ändern, zu testen oder zu löschen erfordert die Organisationsrolle
  Eigentümer oder Integrationsverantwortliche Person und **Kosten exportieren** für den Workspace,
  damit niemand einen Datenstrom von Kosten einrichtet, die er nicht auch selbst exportieren dürfte.
  Wer den Workspace sehen kann, sieht seine Ziele und wie weit die Lieferung reicht.
- Ein Bucket für den Datenstrom, in AWS S3, Google Cloud Storage, Azure Blob Storage oder im Object
  Storage von OVHcloud, STACKIT, Scaleway, IONOS oder Hetzner.
- Ein Präfix: der Ordner im Bucket, unter dem der Datenstrom liegt, etwa `finops`. Costfluent
  schreibt alles unter `<prefix>/costfluent/`, oder unter `costfluent/`, wenn Sie das Präfix leer
  lässt, und jede Berechtigung unten nennt diesen Ordner. Ein Präfix hat bis zu 200 Zeichen aus
  Buchstaben, Ziffern und `! - _ . * ' ( )`, in Ordnern getrennt durch `/`, ohne `..`.
- Die ID des Workspaces, die seinen Ordner im Bucket benennt: **Einstellungen**, dann
  **Arbeitsbereiche**, listet sie in der Spalte **ID**.

## Schreibzugriff gewähren

Geben Sie dem Ziel die eine Berechtigung, die es braucht, beschränkt auf den Ordner des Exports. Ersetzen Sie in
den Richtlinien unten `<bucket>` durch den Namen des Buckets und `<prefix>` durch Ihr Präfix; ohne
Präfix ist die Ressource `arn:aws:s3:::<bucket>/costfluent/*`.

### AWS S3

Costfluent schreibt als Rolle in Ihrem Konto. Sein Principal-ARN und die externe ID Ihrer
Organisation sind dieselben, denen die Rolle einer AWS-Verbindung vertraut: Costfluent zeigt sie,
wenn Sie das Ziel hinzufügen, und unter
[Über die IAM-Konsole verbinden](/de/connect/aws#über-die-iam-konsole-verbinden), und die
Datenquelle `costfluent_aws_provider_info` des Terraform-Providers liest beide. Die
Vertrauensrichtlinie der Rolle:

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "<Principal-ARN von Costfluent>" },
      "Action": "sts:AssumeRole",
      "Condition": { "StringEquals": { "sts:ExternalId": "<Ihre externe ID>" } }
    }
  ]
}
```

Die Berechtigungsrichtlinie der Rolle:

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::<bucket>/<prefix>/costfluent/*"
    }
  ]
}
```

<Stepper>

1. Erstellen Sie in der IAM-Konsole eine Rolle mit einer benutzerdefinierten Vertrauensrichtlinie und
   fügen Sie die Vertrauensrichtlinie oben ein, mit dem Principal-ARN von Costfluent und Ihrer externen
   ID.
2. Geben Sie der Rolle die Berechtigungsrichtlinie oben als Inline-Richtlinie, mit Ihrem Bucket und
   Ihrem Präfix.
3. Notieren Sie den ARN der Rolle, etwa `arn:aws:iam::123456789012:role/costfluent-export`, und die
   Region des Buckets, etwa `eu-central-1`. Das Ziel fragt nach beidem.

</Stepper>

Costfluent übergibt dieselbe Berechtigungsrichtlinie bei jeder Übernahme der Rolle auch als
Sitzungsrichtlinie, sodass seine Sitzung nur Objekte unter dem Ordner ablegen kann, was auch immer
die Rolle sonst erlaubt.

:::caution
Belassen Sie die Standardverschlüsselung des Buckets bei von Amazon S3 verwalteten Schlüsseln (SSE-S3).
Die Sitzung darf nichts außer `s3:PutObject` aufrufen, daher lehnt ein Bucket, dessen
Standardverschlüsselung einen KMS-Schlüssel nutzt, das Schreiben ab.
:::

### Google Cloud Storage

Costfluent schreibt als das Dienstkonto, das es für Ihre Organisation erstellt hat, dasselbe, für
das eine Google-Cloud-Verbindung ihren Abrechnungsexport freigibt. Fügen Sie zuerst das Ziel hinzu
([Ziel hinzufügen](#ziel-hinzufügen)): Das erstellt das Dienstkonto, falls Ihre Organisation noch
keines hat, und zeigt seine Adresse. Gewähren Sie dieser Adresse dann die Rolle Storage Object Creator
(`roles/storage.objectCreator`) auf dem Bucket, in den Berechtigungen des Buckets in der Google
Cloud Console oder mit:

```bash
gcloud storage buckets add-iam-policy-binding gs://<bucket> \
  --member=serviceAccount:<Adresse des Dienstkontos> \
  --role=roles/storage.objectCreator
```

Die Rolle legt Objekte an, kann sie aber nicht lesen, listen, ersetzen oder löschen. Die Rolle gilt für den
ganzen Bucket, während Costfluent nur unter dem Ordner des Exports schreibt; um auch die Berechtigung
auf den Datenstrom zu beschränken, geben Sie dem Datenstrom einen eigenen Bucket. Beschränkt Ihre
Organisation Freigaben auf bekannte Domains, erlauben Sie zuerst das Dienstkonto von Costfluent, wie es
auch eine Google-Cloud-Verbindung braucht ([GCP verbinden](/de/connect/gcp#in-der-konsole-verbinden)).

### Azure Blob Storage

Costfluent schreibt mit einer Shared Access Signature (SAS) für den Container. Es nimmt nur eine SAS
an, deren Berechtigungen es aus dem Token selbst lesen kann:

- eine Container-SAS (`sr=c`), keine Konto-SAS und keine, die an eine gespeicherte
  Zugriffsrichtlinie gebunden ist;
- die Berechtigungen Erstellen, Schreiben oder beide (`sp=c`, `sp=w` oder `sp=cw`) und sonst keine:
  Eine SAS, die auch lesen, hinzufügen, auflisten oder löschen darf, wird abgelehnt;
- nur HTTPS und ein Ablaufdatum, das noch nicht erreicht ist.

Öffnen Sie im Azure-Portal die freigegebenen Zugriffstoken des Containers, wählen Sie als Berechtigungen nur
Erstellen und Schreiben, erlauben Sie nur HTTPS, wählen Sie das Ablaufdatum und generieren Sie das Token. Kopieren Sie
das Blob-SAS-Token, den Teil nach dem `?`, nicht die SAS-URL. Mit der Azure CLI:

```bash
az storage container generate-sas \
  --account-name <Speicherkonto> \
  --name <Container> \
  --permissions cw \
  --https-only \
  --expiry <YYYY-MM-DDTHH:MMZ> \
  --output tsv
```

:::note
Costfluent zeigt das Ablaufdatum der SAS neben dem Ziel. Ist es erreicht, scheitert die Lieferung,
bis Sie eine neue SAS in das Ziel einfügen; eine mit dem Schlüssel des Speicherkontos signierte SAS
hört außerdem auf zu funktionieren, wenn dieser Schlüssel rotiert wird.
:::

### S3-kompatibler Object Storage

Wählen Sie den Anbieter und geben Sie die Region des Buckets ein. Zusammen ergeben sie den einzigen Host, an den
Costfluent schreibt:

| Anbieter | Host | Regionen |
|---|---|---|
| OVHcloud | `s3.<region>.io.cloud.ovh.net` | etwa `gra`, `sbg`, `de` oder `eu-west-par` |
| STACKIT | `object.storage.<region>.onstackit.cloud` | etwa `eu01` oder `eu02` |
| Scaleway | `s3.<region>.scw.cloud` | `fr-par`, `nl-ams`, `pl-waw`, `it-mil` |
| IONOS | `s3.<region>.ionoscloud.com` | `eu-central-1` (die Region `de`), `eu-central-2`, `eu-south-2` |
| Hetzner | `<location>.your-objectstorage.com` | `fsn1`, `nbg1`, `hel1` |

Erstellen Sie einen Zugriffsschlüssel für den Datenstrom und beschränken Sie ihn darauf, Objekte unter dem
Ordner des Exports abzulegen, mit dieser Richtlinie für den Benutzer des Schlüssels oder als
Anweisung einer Bucket-Richtlinie, die diesen Benutzer als Principal nennt, je nachdem, was der
Anbieter bietet:

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::<bucket>/<prefix>/costfluent/*"
    }
  ]
}
```

:::caution
Costfluent kann nicht erkennen, was ein Schlüssel erlaubt, ohne damit zu schreiben, daher nimmt es
einen Schlüssel, der auch lesen oder löschen darf, genauso an wie einen, der nur schreiben darf. Geben Sie
dem Ziel einen eigenen Schlüssel, der nur Objekte unter dem Ordner ablegen kann. Kann der Anbieter
einen Schlüssel nicht auf den Ordner eines Buckets beschränken, geben Sie dem Datenstrom einen eigenen
Bucket oder ein eigenes Projekt.
:::

## Ziel hinzufügen

<Stepper>

1. Öffnen Sie **Einstellungen**, dann **Arbeitsbereiche**, und wählen Sie den Workspace, dessen Kosten der
   Bucket erhält.
2. Fügen Sie ein Ziel für den Bucket-Export hinzu und wählen Sie, wohin es liefert: AWS S3, Google Cloud
   Storage, Azure Blob Storage oder S3-kompatibler Object Storage.
3. Geben Sie den Bucket und das Präfix ein und das, womit das Ziel schreibt: den ARN der Rolle und die
   Region des Buckets für AWS; das Speicherkonto, den Container und das SAS-Token für Azure; den
   Anbieter, die Region, die Zugriffsschlüssel-ID und den geheimen Zugriffsschlüssel für
   S3-kompatiblen Speicher. Cloud Storage braucht nur den Bucket und zeigt die Adresse des
   Dienstkontos, dem Sie die Rolle gewähren.
4. Wählen Sie CSV oder Parquet.
5. Testen Sie das Ziel. Costfluent schreibt ein kleines Objekt in den Ordner, das vor der ersten
   Lieferung zeigt, dass die Berechtigung greift; siehe [Testobjekte](#testobjekte).

</Stepper>

Das Schlüsselpaar und die SAS werden verschlüsselt gespeichert und nie wieder angezeigt; um eines zu
ändern, geben Sie ein neues ein. Ein Ziel in AWS oder Cloud Storage speichert kein Geheimnis.

### Testobjekte

Jeder Test schreibt `<prefix>/costfluent/_costfluent-check/<yyyyMMddTHHmmssZ>.txt`, benannt nach dem
Zeitpunkt des Tests in UTC, sodass Tests sich nie gegenseitig oder eine Lieferung überschreiben. Das
Objekt enthält eine Zeile, die sagt, dass Costfluent es geschrieben hat, um den Ordner zu prüfen,
und dass es gefahrlos gelöscht werden kann. Costfluent löscht es nie; löschen Sie es, wann Sie wollen.

Bei AWS bittet der Test AWS außerdem, Costfluent die Rolle mit einer externen ID übernehmen zu
lassen, die nicht die Ihrer Organisation ist. Die Rolle muss das ablehnen: Eine Rolle, die
Costfluent ohne Ihre externe ID einlässt, ließe jeden Kunden von Costfluent in Ihren Bucket
schreiben, daher scheitert der Test, bis die Vertrauensrichtlinie sie verlangt.

Der Test läuft im Hintergrund, und sein Ergebnis erscheint nach kurzer Zeit am Ziel. Ein
gescheiterter Test nennt seinen Grund: Das Schreiben wurde abgelehnt, der Bucket wurde nicht
gefunden, die Zugangsdaten wurden abgelehnt, die Rolle verlangt Ihre externe ID nicht, die SAS ist
abgelaufen, oder der Speicher hat nicht geantwortet.

## Was im Bucket landet

### Schlüsselaufbau

```text
<prefix>/costfluent/<Workspace-ID>/focus-1.4/billing-date=<YYYY-MM-DD>/version=<yyyyMMddTHHmmssZ>/part-00000.csv.gz
<prefix>/costfluent/<Workspace-ID>/focus-1.4/billing-date=<YYYY-MM-DD>/version=<yyyyMMddTHHmmssZ>/part-00001.csv.gz
<prefix>/costfluent/<Workspace-ID>/focus-1.4/billing-date=<YYYY-MM-DD>/version=<yyyyMMddTHHmmssZ>/manifest.json
```

- Der Ordner des Workspaces ist seine ID (`wsp_…`), nie sein Name, daher verschiebt eine Umbenennung
  des Workspaces den Datenstrom nicht.
- `billing-date` ist der Tag, an dem der Leistungszeitraum der Zeilen beginnt (`ChargePeriodStart`),
  in UTC.
- Ein Ziel mit Parquet schreibt `part-00000.parquet` und so weiter statt `.csv.gz`.
- Ein Teil enthält höchstens 1.000.000 Zeilen, nummeriert ab `part-00000`. Das Manifest wird zuletzt
  geschrieben.

### Versionen

Jede Lieferung eines Tages landet in einem neuen Ordner `version=`, benannt nach dem Zeitpunkt in
UTC, den Costfluent vor ihrem ersten Upload für sie reserviert hat. Um den Datenstrom zu lesen, nehmen Sie
je Abrechnungstag den neuesten Ordner `version=`, der ein `manifest.json` enthält, und lassen Sie die
anderen weg:

- Ein Ordner ohne Manifest ist noch nicht vollständig. Bricht ein Lauf mittendrin ab, vervollständigt
  der nächste Lauf denselben Ordner mit denselben Schlüsseln, statt einen neuen anzufangen.
- Ein Tag wird nur dann unter einer neueren Version erneut geliefert, wenn sich seine Zeilen geändert
  haben: Ein Anbieter hat den Tag neu ausgewiesen, oder die Integrationen oder Konten des Workspaces
  haben sich geändert. Ein Tag, dessen Zeilen sich nicht geändert haben, wird nicht erneut
  geschrieben.
- Ein Tag, der auf nichts neu ausgewiesen wurde, erhält eine neuere Version, deren Manifest keine
  Teile und `"rows": 0` nennt.

Costfluent löscht nie eine ältere Version. Behalten Sie sie als Verlauf oder entfernen Sie sie selbst.

### Das Manifest

`manifest.json` sagt, was der Versionsordner enthält:

```json
{
  "focusVersion": "1.4",
  "workspaceId": "wsp_…",
  "billingDate": "2026-10-25",
  "version": "20261026T080000Z",
  "format": "csv",
  "rows": 1834,
  "columns": ["BillingPeriodStart", "BillingPeriodEnd", "BillingCurrency", "…"],
  "parts": [
    {
      "key": "finops/costfluent/wsp_…/focus-1.4/billing-date=2026-10-25/version=20261026T080000Z/part-00000.csv.gz",
      "rows": 1834,
      "bytes": 51840,
      "sha256": "…"
    }
  ]
}
```

- `format` ist `csv` oder `parquet`, und `columns` listet jede Spalte der Teile in ihrer Reihenfolge.
- `rows` ist die Zeilenzahl des Tages, die Summe der Zeilen seiner Teile.
- Das `sha256` jedes Teils ist der SHA-256 der hochgeladenen Bytes in Hexadezimal mit Kleinbuchstaben,
  bei CSV der komprimierten Datei, sodass ein Verbraucher prüfen kann, dass er den ganzen Teil
  gelesen hat.

### Die Dateien

Die Zeilen sind die Kostenzeilen des Workspaces für den Tag, so wie Costfluent sie speichert: aus
den Integrationen, die der Workspace enthält, innerhalb der Konten, die er abdeckt. Die Spalten sind
die Spalten von FOCUS 1.4, so benannt, wie FOCUS sie benennt (`BilledCost`, `ChargePeriodStart`),
gefolgt von den eigenen Spalten von Costfluent, die das Präfix `x_` tragen, das FOCUS eigenen
Spalten gibt (`x_AmortizedCost`). Beträge stehen in den Abrechnungs- und Preiswährungen, die FOCUS
definiert; die Währungseinstellungen, Segmente und virtuellen Tags des Workspaces gelten nicht.

- **CSV**: gzip-komprimiertes UTF-8 nach RFC 4180: eine Kopfzeile mit den Spaltennamen, Zeilen
  enden mit CRLF, ein Feld steht nur in Anführungszeichen, wenn es ein Komma, ein Anführungszeichen
  oder einen Zeilenumbruch enthält, mit verdoppelten Anführungszeichen. Beträge stehen exakt wie
  gespeichert, mit bis zu 12 Nachkommastellen, Zeitstempel als `yyyy-MM-ddTHH:mm:ssZ` in UTC,
  `Tags` und `AllocatedTags` als JSON-Objekte. Ein leeres Feld ist ein fehlender Wert.
- **Parquet**: dieselben Spalten, typisiert: Beträge als `DECIMAL(38, 12)`, Zeitstempel als
  UTC-Zeitstempel, alles andere als Zeichenketten, die Tag-Spalten als ihre JSON-Objekte. Eine
  Zeilengruppe enthält höchstens 100.000 Zeilen.

:::note
Die Dateien sind ein Datenstrom, keine Tabellenkalkulation. Werte stehen exakt wie gespeichert,
daher bleibt ein Wert, der mit `=`, `+`, `-` oder `@` beginnt, wie er ist, während der CSV-Export aus
Cost Reports ihm einen Apostroph voranstellt, damit eine Tabellenkalkulation ihn nicht als Formel
ausführt. Laden Sie die Dateien in ein Data Warehouse oder ein Skript; um Kosten in einer
Tabellenkalkulation zu öffnen, nutzen Sie [Als CSV oder Excel
exportieren](/de/cost-reports/explore#als-csv-oder-excel-exportieren).
:::

## Wie es sich verhält

- Die Lieferung läuft alle vier Stunden. Jeder Lauf liefert einem Ziel höchstens 31 Tage, die
  ältesten zuerst, daher füllt ein neues Ziel seinen Verlauf über mehrere Läufe.
- Die Tage reichen vom ersten Tag, den der Verlauf des Plans aufbewahrt, bis zum Tag, bis zu dem die
  Daten des Workspaces reichen: dem letzten Tag, den jede Verbindung des Workspaces geliefert hat,
  den Berichte als „Daten bis“ zeigen. Ein Tag danach wartet, bis jede Verbindung ihn geliefert hat,
  und ein Tag, dessen Zeilen noch verarbeitet werden, wartet auf den nächsten Lauf, sodass ein Tag nie
  halb geliefert wird.
- Ein Tag ohne Kostenzeilen erhält keinen Ordner: Ein fehlender Tag bedeutet, dass Costfluent für
  ihn keine Kosten hat, nicht Kosten von null.
- Das Ziel zeigt, wie weit die Lieferung reicht: noch nicht geliefert; geliefert, mit dem Tag, bis zu
  dem geliefert ist; im Rückstand, wenn dieser Tag mehr als zwei Tage vor heute liegt, etwa während
  einer Nachlieferung oder solange die Daten einer Verbindung ausbleiben; oder fehlerhaft, mit dem
  Grund des zuletzt abgelehnten Schreibens. Ein fehlerhaftes Ziel wird beim nächsten Lauf erneut
  versucht.
- Ein geändertes Präfix oder Format beginnt die Lieferung vom ersten Tag an neu, unter dem neuen
  Ordner oder im neuen Format. Die schon gelieferten Dateien bleiben, wo sie sind. Ein anderer Bucket
  ist ein anderes Ziel: Löschen Sie dieses und fügen Sie ein neues hinzu.
- Ein gelöschtes Ziel liefert nicht mehr, und sein gespeichertes Schlüsselpaar oder seine SAS wird
  gelöscht. Die Dateien bleiben im Bucket. Entfernen Sie auch auf Ihrer Seite die Rolle, die Berechtigung
  oder den Schlüssel; das Dienstkonto von Costfluent für Cloud Storage besteht, solange Ihre
  Organisation besteht, daher überdauert seine Berechtigung ein gelöschtes Ziel, bis Sie sie entfernen.

## Verwandte Seiten

- [Als CSV oder Excel exportieren](/de/cost-reports/explore#als-csv-oder-excel-exportieren)
- [AWS verbinden](/de/connect/aws)
- [GCP verbinden](/de/connect/gcp)
- [Power BI und Excel](/de/developers/power-bi)
- [Tarife und Abrechnung](/de/plans-and-billing)
