Verwenden Sie die Ressourcen-API anstelle der Client-API im AWS SDK für Python (Boto3).

Einführung

Dieser Artikel ist AWS Beginner Adventskalender 2019 Dies ist der Artikel am 14. Tag von. Ich würde mich freuen, wenn Sie auf Fehler hinweisen könnten.

einpacken

In Boto3 verfügen einige Dienste über eine Ressourcen-API (aufgerufen von boto3.reosurce ('Dienstname')). Die Ressourcen-API ist abstrakter als die Client-API und kann implementiert werden, ohne unnötige Informationen zu schreiben. Wenn Sie also mit jeder API dasselbe tun können, ist es besser, der Ressourcen-API Priorität einzuräumen.

Gesamtstruktur der Artikel

Lassen Sie uns zunächst erneut bestätigen, was Boto3, Client-API und Ressourcen-API waren. Wenn Sie danach beide APIs verwenden, nehmen Sie die Verwendungsmuster von SQS, S3 und DynamoDB nacheinander auf und vergleichen Sie sie, um festzustellen, wie sie sich unterscheiden. Schließlich schreibe ich eine Liste und Impressionen der Dienste, für die die Ressourcen-API derzeit bereitgestellt wird.

Was ist Boto3?

Das mit Python bereitgestellte AWS SDK wird verwendet, um eine Verbindung vom Code zu verschiedenen AWS-Diensten (EC2, DynamoDB, S3 usw.) herzustellen. API-Referenzen finden Sie in den folgenden Ressourcen: Boto 3 Documentation

Zu den APIs gehören hauptsächlich Client-APIs, bei denen es sich um APIs auf niedriger Ebene handelt, und Ressourcen-APIs, bei denen es sich um APIs auf hoher Ebene handelt. Insbesondere wird es mit der folgenden Beschreibung aufgerufen.

# Client API
boto3.client('sqs')

# Resource API
boto3.resource('sqs')

Als nächstes überprüfen wir, welche Eigenschaften jede API hat.

Client-API (Low-Level-API)

Diese Methode hat eine Eins-zu-Eins-Entsprechung mit der vom AWS-Service bereitgestellten HTTP-API. HTTP-API Es ist vollständig zugeordnet, sodass Sie alles tun können, was die API kann. Da es sich jedoch um eine Allzweckeinstellung handelt, müssen die Parameter für die API direkt für die Methode festgelegt werden. Das folgende Beispiel zeigt die Ausführung von SQS send_message. In der API verwendete QueueUrl usw. sind angegeben.

import boto3

#SQS-Client-API-Version
sqs = boto3.client('sqs')

response = sqs.send_message(QueueUrl='https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue', MessageBody='...')

Referenzquelle: Boto3-Client-API-Dokument (send_message) https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sqs.html#SQS.Client.send_message

Ressourcen-API (High-Level-API)

Es ist eine Abstraktions-API auf hoher Ebene im Vergleich zur Client-API. Für Entwickler ist es einfacher, eine abstrakte Klasse dazwischen einzufügen, anstatt sie direkt der API zuzuordnen. In diesem Beispiel wird send_message mit der Ressourcen-API auf dieselbe Weise wie mit der Client-API ausgeführt.

queueName='target-queue-name'

#SQS-Ressourcen-API-Version
sqs = boto3.resource('sqs')

response = sqs.get_queue_by_name
                QueueName = queueName
            ).send_message(
                MessageBody = '...'
            )

Referenzquelle: "Ich habe versucht," Service Resource "in Boto3 (Python) (Lambda) zu verwenden." https://cloudpack.media/16114

Im Vergleich zur Client-API können Sie eine Nachricht schreiben, indem Sie den Warteschlangennamen abfragen, ohne die SQS-URL in den Code zu schreiben. Entwickler müssen nur den Namen der Warteschlange schreiben, da sie nicht jedes Mal die URL der Warteschlange kennen müssen.

Vergleich von Client-API und Ressourcen-API (S3)

Vergleichen Sie als Nächstes die S3-Client-API und die Ressourcen-API. Schreiben Sie beispielsweise den Code, um den Dateinamen aus dem Bucket abzurufen.

#Gemeinsame Konstante(Bucket- und Dateipräfixe in S3)
BUCKET_NAME= "xxx-bucket"
S3_PREFIX = "image-file-done/"
#S3-Client-API-Version
s3_client = boto3.client('s3')
#Rückgabetyp:<class 'dict'>
s3_objects = s3_client.list_objects_v2(Bucket=BUCKET_NAME, Prefix=S3_PREFIX)

for filename in s3_objects['Contents']:
    print('client:'+filename['Key'])

#S3-Ressourcen-API-Version
s3_resource = boto3.resource('s3')
#Rückgabetyp:<class 'boto3.resources.collection.s3.Bucket.objectsCollection'>
s3_objects = s3_resource.Bucket(BUCKET_NAME).objects.filter(Prefix=S3_PREFIX)

for filename in s3_objects:
    print('resource:'+filename.key)

Bis zum Anruf ist es fast gleich, aber der Typ nach dem Anruf ist unterschiedlich. Wenn es von der Client-API aufgerufen wird, wird es im Wörterbuchtyp zurückgegeben. Daher müssen Daten abgerufen werden, die das bei jeder Implementierung zurückgegebene Wörterbuchtypformat kennen. Wenn es sich um eine Ressourcen-API handelt, handelt es sich um ein Objekt für boto3. Selbst wenn Sie die Ressourcen-API mit anderen Diensten verwenden, können Sie Code mit einer ähnlichen Beschreibung schreiben.

Vergleich von Client-API und Ressourcen-API (DynamoDB)

Vergleichen Sie abschließend die DynamoDB-Client-API und die Ressourcen-API. Insbesondere verstehe ich das Boto3-Dokument nicht gut und es scheint, dass ich es oft versehentlich unter Bezugnahme auf andere Beschreibungen kopiere. (Es ist mein altes Ich ...)

#Gemeinsame Konstante(Tabellenname, Hash-Schlüsselname, Sortierschlüsselname)
TABLE_NAME='XXXXX_IFO'
HASH_KEY_NAME='XXXXX_CODE'
SORT_KEY_NAME='DATE_TIME'
#DynamoDB-Client-Version
dynamodb_client = boto3.client('dynamodb')
#Rückgabetyp: <class 'dict'>
response = dynamodb_client.get_item(
    TableName=TABLE_NAME,
    Key={
        HASH_KEY_NAME:{
            'S': '54620100'  
        },
        SORT_KEY_NAME:{
            'S': '2019050621'
        }
    }
)
#DynamoDB-Ressourcen-API
dynamodb_resource = boto3.resource('dynamodb')
table = dynamodb_resource.Table(TABLE_NAME)
#Rückgabetyp: <class 'dict'>
response = table.get_item(
    Key={
        HASH_KEY_NAME: '54620100',
        SORT_KEY_NAME: '2019050621'
    }
)

Ich habe es nach langer Zeit mit der Client-API geschrieben, aber es ist ein wenig schwierig, weil ich die Parameter im gleichen Format wie die CLI schreibe. Die Rückgabetypen selbst sind Wörterbuchtypen, aber die Operationen in der Tabelle können über das Tabellenobjekt ausgeführt werden, und die Beschreibung des Schlüsselelements ist erheblich einfacher, da Sie die Typinformationen nicht einzeln schreiben müssen.

Dienste, für die Ressourcen-APIs bereitgestellt werden (Stand: 14. Dezember 2019)

Die Ressourcen-API bietet eine begrenzte Anzahl von Diensten. Insbesondere werden die folgenden Dienste unterstützt.

Referenzquelle: "Boto 3-Dokumentation" https://boto3.amazonaws.com/v1/documentation/api/latest/index.html

Bei Verwendung der oben genannten Dienste muss zunächst die Ressourcen-API berücksichtigt werden, bevor die Client-API verwendet wird. In den Codebeispielen von Boto3 (Beispieldokumentation) ist DynamoDB eine Ressource. Da jedoch andere EC2- und CloudWatch-Clients Clients sind, müssen Sie sich anscheinend sowohl die verfügbaren Dienste als auch die Codebeispiele ansehen.

Impressionen

Bis jetzt habe ich die Client-API und die Ressourcen-API verwendet, ohne viel darauf zu achten. Daher habe ich die Ergebnisse verschiedener Untersuchungen als Reflexion zusammengefasst. Wie Sie dem SQS-Beispiel entnehmen können, müssen keine unnötigen Informationen in den Codeteil geschrieben werden. Daher werde ich in Zukunft zunächst prüfen, ob der Dienst über eine Ressourcen-API verfügt. Wenn diese bereitgestellt wird, überlegen Sie, ob sie gut verwendet werden kann, und verwenden Sie dann die Client-API. Ich möchte es benutzen. Es scheint, dass in der Client-API auf Qiita und im Internet viele Implementierungen geschrieben sind. Daher möchte ich die Informationen zur Ressourcen-API erweitern, indem ich in Zukunft selbst Artikel schreibe.

Recommended Posts

Verwenden Sie die Ressourcen-API anstelle der Client-API im AWS SDK für Python (Boto3).
Entwicklung des AWS SDK für Python (Boto3) in Visual Studio 2017
Verwenden Sie das AWS SDK für Python (boto) in einer Proxy-Umgebung
boto3 (AWS SDK für Python) Hinweis
Verwenden Sie das Kintone API SDK für Python mit Raspberry Pi (speichern Sie Daten einfach in Kintone von Raspberry Pi).
Verwenden Sie pathlib in Maya (Python2.7), um sich auf das kommende Python3.7 vorzubereiten
Verwenden Sie für den Diktatschlüssel in Python etwas anderes als eine <br> Zeichenfolge
Tipps zum Erreichen der ATND-API mit Python
Verwendung von OAuth und API für Dienstkonten mit Google API Client für Python
Verwenden Sie in Ihrem Python keine readlines () für Anweisungen!
Definieren Sie die Antwort der boto3-Client-API in der Datenklasse
Rufen Sie Polly aus dem AWS SDK für Python auf
[BigQuery] Verwendung der BigQuery-API für die Python-Tabellenerstellung-
[Für Anfänger] Wie man den Befehl say mit Python benutzt!
[AWS IoT] Registrieren Sie Dinge in AWS IoT mithilfe des AWS IoT Python SDK
Flottenbereitstellung mit AWS IoT SDK für Python v2
Verwenden Sie config.ini mit Python
Verwenden Sie Datumsangaben in Python
Verwenden Sie Valgrind mit Python
Verwenden Sie LiquidTap Python Client ③
Evernote-API in Python
Verwenden Sie LiquidTap Python Client ②
Verwenden Sie den Profiler in Python
C-API in Python 3
Verwenden Sie LiquidTap Python Client ①
Führen Sie das AWS IoT Device SDK für Python auf Raspberry Pi aus
Abrufen von Daten aus der Analyse-API mit Google API Client für Python
Hit Mastodons API in Python
Mal sehen, wie def in Python verwendet wird
Verwenden Sie die Trello-API mit Python
Verwenden Sie den let-Ausdruck in Python
[Python] Scraping in AWS Lambda
AWS CDK-Lambda + API-Gateway (Python)
Verwenden Sie die Twitter-API mit Python
Verwenden Sie den Parameterspeicher in Python
Verwenden Sie in Python ein Diktat mit Listenschlüssel
Techniken zum Sortieren in Python
Verwenden Sie Random Forest mit Python
Verwenden Sie Spyder von Python IDE
Blender Python API in Houdini (Python 3)
Verwenden Sie die Unterschall-API mit Python3
Einfacher IRC-Client mit Python
Über "für _ in range ():" von Python
Verwenden Sie die e-Stat-API von Python
Wrap (Teil der) AtCoder Library in Cython zur Verwendung in Python
Best Practice für die Anmeldung im JSON-Format unter AWS Lambda / Python
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
Installieren Sie Networkx in der Python 3.7-Umgebung zur Verwendung in Malware Data Science-Büchern
Ein Hinweis für diejenigen, die Python in Visual Studio verwenden (ich)