() translation by (you can also view the original English article)
Im ersten Teil dieser zweiteiligen Tutorial-Serie hatten wir einen Überblick darüber, wie Buckets bei Google Cloud Storage zur Organisation von Dateien verwendet werden. Wir haben gesehen, wie man Buckets in Google Cloud Storage über die Google Cloud Console verwaltet. Es folgte ein Python-Skript, in dem diese Vorgänge programmatisch ausgeführt wurden.
In diesem Teil wird gezeigt, wie Objekte, d. h. Dateien und Ordner, in GCS-Eimern verwaltet werden. Der Aufbau dieses Tutorials ist ähnlich wie der des vorherigen Tutorials. Zunächst werde ich demonstrieren, wie grundlegende Vorgänge im Zusammenhang mit der Dateiverwaltung mithilfe der Google Cloud Console durchgeführt werden können. Anschließend wird ein Python-Skript vorgestellt, mit dem dieselben Vorgänge programmatisch ausgeführt werden können.
So wie es für die Benennung von Eimern in GCS einige Richtlinien und Einschränkungen gab, so folgt auch die Benennung von Objekten einer Reihe von Richtlinien. Objektnamen sollten gültige Unicode-Zeichen und keine Carriage Return- oder Line Feed-Zeichen enthalten. Es wird u. a. empfohlen, Zeichen wie "#", "[", "]", "*", "?" oder unzulässige XML-Steuerzeichen nicht zu verwenden, da sie falsch interpretiert werden und zu Mehrdeutigkeit führen können.
Außerdem folgen die Objektnamen in GCS einem flachen Namensraum. Das bedeutet, dass es in der GCS keine Verzeichnisse und Unterverzeichnisse gibt. Wenn Sie beispielsweise eine Datei mit dem Namen /tutsplus/tutorials/gcs.pdf
erstellen, sieht es so aus, als befände sich gcs.pdf
in einem Verzeichnis namens tutorials
, das wiederum ein Unterverzeichnis von tutsplus
ist. Aber laut GCS befindet sich das Objekt einfach in einem Bucket mit dem Namen /tutsplus/tutorials/gcs.pdf
.
Schauen wir uns an, wie man Objekte mit Google Cloud Console verwaltet, und springen dann zum Python-Skript, um dasselbe programmatisch zu tun.
Google Cloud Console verwenden
Ich werde dort weitermachen, wo wir im letzten Tutorial aufgehört haben. Beginnen wir mit der Erstellung eines Ordners.
.png)
.png)
.png)
Um einen neuen Ordner zu erstellen, klicken Sie auf die oben hervorgehobene Schaltfläche Ordner erstellen. Erstellen Sie einen Ordner, indem Sie den gewünschten Namen wie unten gezeigt eingeben. Der Name sollte den Namenskonventionen für Objekte entsprechen.
.png)
.png)
.png)
Lassen Sie uns nun eine Datei in den neu erstellten Ordner hochladen.
.png)
.png)
.png)
Nach der Erstellung listet der GCS-Browser die neu erstellten Objekte auf. Objekte können gelöscht werden, indem Sie sie in der Liste auswählen und auf die Schaltfläche "Löschen" klicken.
.png)
.png)
.png)
Wenn Sie auf die Schaltfläche "Aktualisieren" klicken, wird die Benutzeroberfläche mit allen Änderungen an der Objektliste aktualisiert, ohne dass die gesamte Seite aktualisiert wird.
Programmatische Verwaltung von Objekten
Im ersten Teil haben wir gesehen, wie man eine Compute Engine Instanz erstellt. Ich werde das Gleiche hier verwenden und auf dem Python-Skript aus dem letzten Teil aufbauen.
Schreiben des Python-Skripts
Es gibt keine zusätzlichen Installationsschritte, die für dieses Tutorial befolgt werden müssen. Weitere Einzelheiten zur Installation oder Entwicklungsumgebung finden Sie im ersten Teil.
gcs_objects.py
1 |
import sys |
2 |
from pprint import pprint |
3 |
|
4 |
from googleapiclient import discovery |
5 |
from googleapiclient import http |
6 |
from oauth2client.client import GoogleCredentials |
7 |
|
8 |
|
9 |
def create_service(): |
10 |
credentials = GoogleCredentials.get_application_default() |
11 |
return discovery.build('storage', 'v1', credentials=credentials) |
12 |
|
13 |
|
14 |
def list_objects(bucket): |
15 |
service = create_service() |
16 |
# Create a request to objects.list to retrieve a list of objects.
|
17 |
fields_to_return = \ |
18 |
'nextPageToken,items(name,size,contentType,metadata(my-key))'
|
19 |
req = service.objects().list(bucket=bucket, fields=fields_to_return) |
20 |
|
21 |
all_objects = [] |
22 |
# If you have too many items to list in one request, list_next() will
|
23 |
# automatically handle paging with the pageToken.
|
24 |
while req: |
25 |
resp = req.execute() |
26 |
all_objects.extend(resp.get('items', [])) |
27 |
req = service.objects().list_next(req, resp) |
28 |
pprint(all_objects) |
29 |
|
30 |
|
31 |
def create_object(bucket, filename): |
32 |
service = create_service() |
33 |
# This is the request body as specified:
|
34 |
# https://g.co/cloud/storage/docs/json_api/v1/objects/insert#request
|
35 |
body = { |
36 |
'name': filename, |
37 |
}
|
38 |
with open(filename, 'rb') as f: |
39 |
req = service.objects().insert( |
40 |
bucket=bucket, body=body, |
41 |
# You can also just set media_body=filename, but for the sake of
|
42 |
# demonstration, pass in the more generic file handle, which could
|
43 |
# very well be a StringIO or similar.
|
44 |
media_body=http.MediaIoBaseUpload(f, 'application/octet-stream')) |
45 |
resp = req.execute() |
46 |
pprint(resp) |
47 |
|
48 |
|
49 |
def delete_object(bucket, filename): |
50 |
service = create_service() |
51 |
res = service.objects().delete(bucket=bucket, object=filename).execute() |
52 |
pprint(res) |
53 |
|
54 |
|
55 |
def print_help(): |
56 |
print """Usage: python gcs_objects.py <command> |
57 |
Command can be:
|
58 |
help: Prints this help
|
59 |
list: Lists all the objects in the specified bucket
|
60 |
create: Upload the provided file in specified bucket
|
61 |
delete: Delete the provided filename from bucket
|
62 |
"""
|
63 |
if __name__ == "__main__": |
64 |
if len(sys.argv) < 2 or sys.argv[1] == "help" or \ |
65 |
sys.argv[1] not in ['list', 'create', 'delete', 'get']: |
66 |
print_help() |
67 |
sys.exit() |
68 |
if sys.argv[1] == 'list': |
69 |
if len(sys.argv) == 3: |
70 |
list_objects(sys.argv[2]) |
71 |
sys.exit() |
72 |
else: |
73 |
print_help() |
74 |
sys.exit() |
75 |
if sys.argv[1] == 'create': |
76 |
if len(sys.argv) == 4: |
77 |
create_object(sys.argv[2], sys.argv[3]) |
78 |
sys.exit() |
79 |
else: |
80 |
print_help() |
81 |
sys.exit() |
82 |
if sys.argv[1] == 'delete': |
83 |
if len(sys.argv) == 4: |
84 |
delete_object(sys.argv[2], sys.argv[3]) |
85 |
sys.exit() |
86 |
else: |
87 |
print_help() |
88 |
sys.exit() |
Das obige Python-Skript demonstriert die wichtigsten Operationen, die mit Objekten durchgeführt werden können. Dazu gehören:
- Erstellung eines neuen Objekts in einem Eimer
- Auflistung aller Objekte in einem Eimer
- Löschung eines bestimmten Objekts
Schauen wir uns an, wie jeder der oben genannten Vorgänge aussieht, wenn das Skript ausgeführt wird.
1 |
$ python gcs_objects.py
|
2 |
Usage: python gcs_objects.py <command> |
3 |
Command can be: |
4 |
help: Prints this help |
5 |
list: Lists all the objects in the specified bucket |
6 |
create: Upload the provided file in specified bucket
|
7 |
delete: Delete the provided filename from bucket |
8 |
|
9 |
$ python gcs_objects.py list tutsplus-demo-test
|
10 |
[{u'contentType': u'application/x-www-form-urlencoded;charset=UTF-8', |
11 |
u'name': u'tutsplus/', |
12 |
u'size': u'0'}, |
13 |
{u'contentType': u'image/png', |
14 |
resp = req.execute() |
15 |
u'name': u'tutsplus/Screen Shot 2016-10-17 at 1.03.16 PM.png', |
16 |
u'size': u'36680'}] |
17 |
|
18 |
$ python gcs_objects.py create tutsplus-demo-test gcs_buckets.py
|
19 |
{u'bucket': u'tutsplus-demo-test', |
20 |
u'contentType': u'application/octet-stream', |
21 |
u'crc32c': u'XIEyEw==', |
22 |
u'etag': u'CJCckonZ4c8CEAE=', |
23 |
u'generation': u'1476702385770000', |
24 |
u'id': u'tutsplus-demo-test/gcs_buckets.py/1476702385770000', |
25 |
u'kind': u'storage#object', |
26 |
u'md5Hash': u'+bd6Ula+mG4bRXReSnvFew==', |
27 |
u'mediaLink': u'https://www.googleapis.com/download/storage/v1/b/tutsplus-demo-test/o/gcs_buckets.py?generation=147670238577000 |
28 |
0&alt=media',
|
29 |
u'metageneration': u'1', |
30 |
u'name': u'gcs_buckets.py', |
31 |
u'selfLink': u'https://www.googleapis.com/storage/v1/b/tutsplus-demo-test/o/gcs_buckets.py', |
32 |
u'size': u'2226', |
33 |
u'storageClass': u'STANDARD', |
34 |
u'timeCreated': u'2016-10-17T11:06:25.753Z', |
35 |
u'updated': u'2016-10-17T11:06:25.753Z'} |
36 |
|
37 |
$ python gcs_objects.py list tutsplus-demo-test
|
38 |
[{u'contentType': u'application/octet-stream', |
39 |
u'name': u'gcs_buckets.py', |
40 |
u'size': u'2226'}, |
41 |
{u'contentType': u'application/x-www-form-urlencoded;charset=UTF-8', |
42 |
u'name': u'tutsplus/', |
43 |
u'size': u'0'}, |
44 |
{u'contentType': u'image/png', |
45 |
u'name': u'tutsplus/Screen Shot 2016-10-17 at 1.03.16 PM.png', |
46 |
u'size': u'36680'}] |
47 |
|
48 |
$ python gcs_objects.py delete tutsplus-demo-test gcs_buckets.py
|
49 |
''
|
50 |
|
51 |
$ python gcs_objects.py list tutsplus-demo-test
|
52 |
[{u'contentType': u'application/x-www-form-urlencoded;charset=UTF-8', |
53 |
u'name': u'tutsplus/', |
54 |
u'size': u'0'}, |
55 |
{u'contentType': u'image/png', |
56 |
u'name': u'tutsplus/Screen Shot 2016-10-17 at 1.03.16 PM.png', |
57 |
u'size': u'36680'}] |
Schlussfolgerung
In dieser Tutorial-Reihe haben wir gesehen, wie Google Cloud Storage aus der Vogelperspektive funktioniert, gefolgt von einer detaillierten Analyse von Buckets und Objekten. Dann haben wir gesehen, wie man wichtige Bucket- und objektbezogene Operationen über die Google Cloud Console durchführt.
Dann haben wir dasselbe mit Python-Skripten durchgeführt. Es gibt noch mehr, was man mit Google Cloud Storage machen kann, aber das bleibt Ihnen überlassen.