Connectez-vous à s3 avec AWS Lambda Python

AWS Lambda prend en charge Python, j'ai donc essayé de l'utiliser. Cette fois, je l'ai utilisé pour copier des fichiers entre des seaux de S3, mais j'aimerais le partager car il y avait différents points d'intérêt.

Chose que tu veux faire

  1. Je souhaite copier un fichier qui existe dans le bucket de s3 vers un autre bucket
  2. La copie avec un seul processus est lente, je souhaite donc copier des buckets avec plusieurs processus en même temps
  3. Je souhaite utiliser AWS Lambda Python

Je l'ai essayé principalement pour la troisième raison.

Ce que j'ai fait

J'ai créé une fonction Lambda pour obtenir un bucket s3 et implémenté un script à copier en parallèle.

Création d'une fonction Lambda

Créez une fonction Lambda.

--Cliquez sur Créer une fonction Lambda

Select blue print Sélectionnez le modèle que vous souhaitez utiliser.

--Sélectionnez hello-world-python

Configure function

Effectuez les réglages de base pour la fonction Lambda.

--Name: Nom de la fonction Lambda

Lambda function code

Fournit le code de programme à exécuter.

Vous pouvez choisir parmi les trois types suivants.

  1. Modifiez le code à l'écran
  2. Téléchargez le code depuis votre propre machine
  3. Téléchargez le code depuis s3

Si vous devez importer une bibliothèque Python standard ou une bibliothèque autre que boto3, vous devez choisir la méthode 2 ou 3.

Les détails sont résumés dans ici, veuillez donc vous référer à ceux qui sont intéressés.

Au fait, cette fois, puisque seules la bibliothèque standard et boto3 sont utilisées, elle est implémentée par la méthode 1.

Nous le mettrons en œuvre plus tard, donc nous ne le changerons pas au début.

Lambda function handler and role --Handler: nom du gestionnaire à exécuter (nom du module, nom de la fonction)

Advanced settings Définissez la mémoire disponible et le délai d'expiration.

--Memory (Mo): mémoire disponible

Review

Vérifiez les paramètres. S'il n'y a pas de problème, sélectionnez Créer une fonction

Implémentation de script

Implémentez le script à copier avec multi_process.

Voici un exemple simple.

#! /user/local/bin/python
# -*- coding:utf-8 -*-

import boto3
from multiprocessing import Process

  

def parallel_copy_bucket(s3client, source_bucket, dest_bucket, prefix):
    '''
Copier des buckets s3 en parallèle
    '''    
    #Copiez le bucket
    def copy_bucket(s3client, dest_bucket, copy_source, key):
        s3client.copy_object(Bucket=dest_bucket, CopySource=copy_source, Key=key)
        
    # list_Notez que vous ne pouvez obtenir que 1000 données par objet.
    result = s3client.list_objects(
        Bucket=source_bucket,
        Prefix=prefix
    )
    #Obtenir la liste des clés de la source de copie et copier
    if 'Contents' in result:
        keys = [content['Key'] for content in result['Contents']]
        p = None
        for key in keys:
            copy_source = '{}/{}'.format(source_bucket, key)
            p = Process(target=copy_bucket, args=(s3client, dest_bucket, copy_source, key))
            p.start()
        if p:
            p.join()


#Handler appelé à l'exécution
def s3_log_copy_handler(event, context):
    source_bucket = event["source_bucket"] #Copier le bucket source
    dest_bucket = event["dest_bucket"]     #Copier le bucket de destination
    prefixes = event["prefixes"]           #Copier les conditions de nom de fichier source
    s3client = boto3.client('s3')
    for prefix in prefixes:
        print("Start loading {}".format(prefix))
        parallel_copy_bucket(s3client, source_bucket, dest_bucket, prefix)
    print("Complete loading")

Essai

Définissez Configure Sample Event à partir du bouton ʻActions`

Définir les paramètres à transmettre au gestionnaire

Par exemple, si la configuration de s3 est la suivante

- samplelogs.source  #Copier le bucket source
    - /key1
        - hogehoge.dat
    - /key2
        - fugafuga.dat
- samplelogs.dest    #Copier le bucket de destination

Définissez le JSON comme suit.

.json


{
  "source_bucket": "samplelogs.source",
  "dest_bucket": "samplelogs.dest",
  "prefixes" : [
    "key1",
    "key2"
  ]
}

Où j'étais accro

Autoriser le rôle à traiter le compartiment s3

La règle d'exécution S3 par défaut définit uniquement «s3: GetObject» et «s3: PutObject». À ce moment, si vous appelez s3client.list_objects (), vous obtiendrez l'erreur ʻUne erreur client (AccessDenied) s'est produite: Accès refusé. Cette méthode ne peut pas être exécutée avec S3: GetObject et nécessite une autre autorisation d'exécution appelée S3: ListObejct. Par conséquent, vous devez ajouter s3: ListObject` à Policy.

multiprocessing.Pool

Lors de l'exécution dans plusieurs processus, si vous spécifiez un pool, vous obtiendrez l'erreur ʻOSErrors- [Errno 38] Fonction non implémentée`. Il s'agit d'un problème car vous ne disposez pas des autorisations de système d'exploitation nécessaires pour conserver le pool lors de l'exécution sur Lambda. Vous devez déconfigurer le pool et l'exécuter.

Paramètres TimeOut

Lambda doit être configuré pour expirer lorsque le temps d'exécution dépasse la valeur spécifiée. Étant donné que la valeur maximale du délai d'expiration est de 300 s (5 min), l'exécution ne peut pas être terminée pour les éléments qui prennent plus de temps à s'exécuter. Par conséquent, si vous avez un compartiment avec un fichier raisonnablement volumineux, vous devez exécuter la fonction Lambda plusieurs fois.

Impressions

Je pense que c'est un bon endroit pour l'utiliser, mais je pense qu'il convient aux traitements légers tels que les alertes, les notifications push et les petits transferts de fichiers. Au contraire, il ne semble pas convenir à l'écriture de traitements lourds. De plus, maintenant que vous disposez d'un point de terminaison d'API, il peut convenir aux API ultra-légères. Je vais l'essayer la prochaine fois.

Voici un résumé des points heureux et malheureux en utilisant la fonction Lambda.

--Je suis heureux

référence

https://boto3.readthedocs.org/en/latest/ http://qiita.com/m-sakano/items/c53ba194a8574f44e78a http://www.perrygeo.com/running-python-with-compiled-code-on-aws-lambda.html

Recommended Posts

Connectez-vous à s3 avec AWS Lambda Python
Connectez-vous à BigQuery avec Python
Connectez-vous à Wikipedia avec Python
Exporter un instantané RDS vers S3 avec Lambda (Python)
Téléchargez ce que vous avez dans la demande vers S3 avec AWS Lambda Python
Je veux AWS Lambda avec Python sur Mac!
Notifier HipChat avec AWS Lambda (Python)
[AWS] Essayez d'ajouter la bibliothèque Python à la couche avec SAM + Lambda (Python)
Exporter les journaux CloudWatch vers S3 avec AWS Lambda (Pythyon ver)
[Python] Exportez régulièrement de CloudWatch Logs vers S3 avec Lambda
[AWS] Utilisation de fichiers ini avec Lambda [Python]
Connectez-vous à MySQL avec Python dans Docker
Je veux jouer avec aws avec python
[AWS] Associez Lambda et S3 à boto3
Connectez-vous à Pepper avec l'interpréteur Python de PEPPER Mac
[AWS] Faites des choses de type SSI avec S3 / Lambda
Envoyer les images prises avec ESP32-WROOM-32 vers AWS (API Gateway → Lambda → S3)
Connectez python à mysql
LINE BOT avec Python + AWS Lambda + API Gateway
Application sans serveur avec AWS SAM! (APIGATEWAY + Lambda (Python))
Exemple de notification Slack avec python lambda
[AWS / Lambda] Comment charger une bibliothèque externe Python
Télécharger des fichiers sur Google Drive avec Lambda (Python)
Résumé de l'étude de Python pour utiliser AWS Lambda
Connectez-vous à MySQL avec Python sur Raspberry Pi
Pages HTML dynamiques créées avec AWS Lambda et Python
Exploitez TwitterBot avec Lambda, Python
[S3] CRUD avec S3 utilisant Python [Python]
[Python] Scraping dans AWS Lambda
Opération S3 avec python boto3
Connectez-vous à Postgresql avec GO
[AWS lambda] Déployer, y compris diverses bibliothèques avec lambda (générer un zip avec un mot de passe et le télécharger vers s3) @ Python
Déployer la fonction Python 3 avec Serverless Framework sur AWS Lambda
Écrire plusieurs enregistrements dans DynamoDB avec Lambda (Python, JavaScript)
Créer une couche pour AWS Lambda Python dans Docker
Connectez-vous à sqlite depuis python
Basculer python vers 2.7 avec des alternatives
Écrire en csv avec Python
Connectez-vous à la région tokyo de s3
Créez des tweets ordinaires comme une flotte avec AWS Lambda et Python
Comment utiliser Python lambda
Publié en tant que pièce jointe à Slack sur AWS Lambda (Python)
[AWS] Que faire lorsque vous souhaitez piper avec Lambda
Défi problème 5 avec Python: lambda ... j'ai décidé de copier sans
Créez rapidement une API avec Python, lambda et API Gateway à l'aide d'AWS SAM
[Python] Permet d'importer les packages pip3 sur AWS Lambda
Surveillance du site et notification d'alerte avec AWS Lambda + Python + Slack
Connectez Raspberry Pi à Alibaba Cloud IoT Platform avec «Python»
[Présentation de l'application Udemy Python3 +] 58. Lambda
Python: comment utiliser async avec
Récapitulatif si vous utilisez AWS Lambda (Python)
Lien pour commencer avec python
Connectez-vous à plusieurs bases de données avec SQL Alchemy
[Python] Ecrire dans un fichier csv avec Python
[AWS] Créer une API avec API Gateway + Lambda
Ravi de vous rencontrer avec python
Essayez d'exploiter Facebook avec Python