Wie verwende ich AWS S3 CLI, um Dateien in BASH auf stdout zu sichern?

88

Ich starte ein Bash-Skript, das einen Pfad in S3 (wie im Befehl ls angegeben ) verwendet und den Inhalt aller Dateiobjekte an speichert stdout. Im Wesentlichen möchte ich mit cat /path/to/files/*Ausnahme von S3 replizieren , z s3cat '/bucket/path/to/files/*'. Meine erste Neigung, die Optionen zu betrachten, besteht darin, den cpBefehl für eine temporäre Datei zu verwenden und dann catdas.

Hat jemand dies oder ähnliches versucht oder gibt es bereits einen Befehl, den ich nicht finde, der es tut?

Neil C. Obremski
quelle
Ich benutze PHP und die Services_Amazon_S3-Klasse, um ähnliche Dinge zu tun.
Missverstanden

Antworten:

145

Speichern Sie den Inhalt aller Dateiobjekte in stdout.

Sie können dies erreichen, wenn Sie -als Ziel des aws s3 cpBefehls übergeben. Zum Beispiel $ aws s3 cp s3://mybucket/stream.txt -.

Was Sie versuchen zu tun, ist so etwas? :: ::

#!/bin/bash

BUCKET=YOUR-BUCKET-NAME
for key in `aws s3api list-objects --bucket $BUCKET --prefix bucket/path/to/files/ | jq -r '.Contents[].Key'`
do
  echo $key
  aws s3 cp s3://$BUCKET/$key - | md5sum
done
Köcher
quelle
5
Beachten Sie jedoch, dass '-' als Platzhalter für stdout nicht in allen Versionen von awscli funktioniert. Die Version 1.2.9, die mit Ubuntu LTS 14.04.2 geliefert wird, unterstützt dies beispielsweise nicht.
Antoniob
Das Gleiche gilt. Ich bin auf Ubuntu 12.x und es funktioniert nicht in meiner Instanz von Bash.
Kode Charlie
Das Problem dabei ist, dass Sie keine bestimmte Version der Datei erhalten können.
Eamorr
auch nicht arbeiten an macOS High Sierra 10.13.6 ( aws --version: aws-cli/1.15.40 Python/3.6.5 Darwin/17.7.0 botocore/1.10.40)
MichaelChirico
Diese Antwort hat auch den Vorteil, dass der Dateiinhalt auf Ihr Terminal gestreamt und nicht als Ganzes kopiert wird. Weitere Informationen finden Sie
Khoa
47

Wenn Sie eine Version der AWS-CLI verwenden, die das Kopieren nach "-" nicht unterstützt, können Sie auch / dev / stdout verwenden:

$ aws s3 cp --quiet s3://mybucket/stream.txt /dev/stdout

Möglicherweise möchten Sie auch, dass das --quietFlag verhindert, dass eine Zusammenfassungszeile wie die folgende an Ihre Ausgabe angehängt wird:

download: s3: //mybucket/stream.txt to ../../dev/stdout

Drew
quelle
1

Sie können versuchen, s3streamcat zu verwenden . Es unterstützt auch die Formate bzip , gzip und xz.

Installieren mit

sudo pip install s3streamcat

Verwendung:

s3streamcat s3://bucketname/dir/file_path
s3streamcat s3://bucketname/dir/file_path | more
s3streamcat s3://bucketname/dir/file_path | grep something
Samarth
quelle
-3

Wenn Sie dies mit BASH erreichen möchten, müssen Sie eine externe App wie die AWS Command-Line Interface (CLI) aufrufen . Es gibt kein CAT-Äquivalent, daher müssten Sie die Datei lokal kopieren und dann CAT.

Alternativ können Sie eine App verwenden / schreiben, die direkt das AWS SDK aufruft, das für Sprachen wie Python, PHP und Java verfügbar ist. Mithilfe des SDK können Dateiinhalte im Arbeitsspeicher abgerufen und dann an stdout gesendet werden.

John Rotenstein
quelle
In der obigen Antwort ist aufgeführt, dass Sie 'cp' mit '-' als zweites Dateiargument verwenden können, um die Datei an stdout auszugeben.
Asfand Qazi