Saya mencoba yang berikut ini. Tetapi ketika saya menimpa file yang dipanggil oleh lambda, karena ini terjadi dalam satu lingkaran. Adakah yang bisa tolong bantu saya. Di bawah ini juga menempelkan potongan kode yang saya gunakan untuk lambda.

Tugas

  1. Baca file dalam folder bernama 'Folder A' saat diunggah ke folder ini
  2. Kemudian ganti kolom tertentu yang memiliki karakter lebih dari 10
  3. kemudian unggah file ini kembali ke folder yang sama tetapi sayangnya itu terjadi dalam satu lingkaran karena lambda memanggil
  4. Mencoba pindah ke folder lain yang disebut TrimmedFile kemudian berfungsi dengan baik tanpa loop apa pun.

Dapatkah seseorang memberi tahu saya cara membaca, mengedit, menyimpan file di folder yang sama dengan yang dipanggil?

    import json
    import urllib.parse
    import boto3
    import json
    import os
    import csv
    print('Loading function')
    s3 = boto3.client('s3')
    
    def lambda_handler(event, context):
        # Get the object from the event and show its content type
        bucket = event['Records'][0]['s3']['bucket']['name']
        key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
        try:
            #print("CONTENT TYPE: " + key['ContentType'])
            #for record in event['Records']:
            print("file name " + key)
            #bucket = record['s3']['bucket']['name']
            #file_key = urllib.parse.unquote_plus(record['s3']['object']['key'], encoding='utf-8')
        
        file_key = key
        csvfile = s3.get_object(Bucket=bucket, Key=file_key)
        csvcontent = csvfile["Body"].read().decode("utf-8")
        file = csvcontent.split("\n")
        csv_reader = csv.reader(file)
        line_count = 0
        colindex = ''
        content = []
        contentstring = ''
        s33 = boto3.resource('s3')
        copy_source = {
              'Bucket': bucket,
              'Key': file_key
            }
        new_bucket = s33.Bucket(bucket)
        print(file_key)
        print(bucket)
        src_folder = "FolderA/"
        new_filekey = file_key.replace(src_folder,"")
        print(new_filekey)
        new_bucket.copy(copy_source, 'BKP/' + new_filekey )
        for row in csv_reader:
            if row:
                row = list(map(str.strip, row))
                if line_count == 0:
                    if 'ColToTruncate' in row:
                        colindex = row.index('ColToTruncate')
                        line_count += 1
                    else:
                        print('No ColToTruncate column found in '+ file_key)
                        return 'No ColToTruncate column found in '+ file_key
                else:
                    if len(row[colindex ]) >= 10:
                        row[colindex ] = row[colindex ][0:2]
                    line_count += 1  
                content.append(row)
                contentstring += ', '.join(row) 
                contentstring = contentstring + '\n'
        #print(contentstring)
        #filename = file_key + '.csv'
        uploadByteStream = bytes(contentstring.encode('utf-8'))
        #new_key = 'TrimmedFiles/' + new_filekey
        s3.put_object(Bucket=bucket, Key=file_key , Body=uploadByteStream)
        return True
    except Exception as e:
        print(e)
        print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e
-1
Jeeva 11 Mei 2021, 13:54

2 jawaban

Jawaban Terbaik

Saya yakin Anda telah membuat Pemicu acara di S3 dan mengaitkannya dengan Lambda dan ketika Anda mengganti file, Anda memicu lambda dan itu menjadi loop.

Mungkin ada 2 cara untuk menanganinya:

1.Konfigurasikan jenis acara PUT OR POST (yang sesuai dengan kasus Anda) untuk memicu lambda. Sekarang simpan file yang diperbarui di lokasi lain dan kemudian salin ke yang asli. Melakukan s3 ini akan menghasilkan acara "S3:ObjectCreated:Copy" yang tidak akan memanggil Lambda lagi.

 # Copying file from secondary location to original location
 copy_sr = {
        "Bucket":bucket,
        "Key"   :file_key_copy
        
    }
    
    s3_resource.meta.client.copy(copy_sr, 
    final_bucket,file_key_copy
    )
    
    #Deleting the file from the secondary location
    s3_client.delete_object(Bucket=bucket,
    Key=file_key_copy
    ) 

2.Gunakan antrian SQS dan konfigurasikan untuk tidak mendahului pesan yang diterima dua kali dalam jangka waktu tertentu (tergantung pada frekuensi file yang diperbarui)

1
Naman 12 Mei 2021, 10:27

Ini untuk mendemonstrasikan cara membaca file dan dan menggantinya setelah mengedit. Itu dapat bertindak sebagai kode kerangka.

import boto3
import base64
import json
import io


client = boto3.client('s3')
res = boto3.resource('s3')

def lambda_handler(event, context):

    file_key = event['file_key']
    file_obj = s3_res.Object("bucket_name", file_key)

    content_obj = file_obj.get()['Body'].read().decode('utf-8') # fetching the data in

    res.Object("bucket_name", file_key).delete() # Here you are deleting the old file

    ######Performing your operation and saving in new_data variable#########

    new_file = io.BytesIO(new_data.encode())

    client.upload_fileobj(new_file, "bucket_name", file_key) # uploading the file at the exact same location.
0
KnowledgeGainer 11 Mei 2021, 16:11