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?


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

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


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


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.