как я могу сделать общую итерацию субизображений корзины s3

мое ведро на s3 называется «python», а его подпапка — «boss». Итак, я хочу получить все изображения босса папки в лямбда-функции. в настоящее время я жестко кодирую значения, но помещаю изображение в корень, а не в подпапку.

bucket="python"
key="20180530105812.jpeg"

затем я хочу вызвать эту функцию один за другим для всех изображений

def lambda_handler(event, context):
    # Get the object from the event
    bucket="ais-django"
    key="20180530105812.jpeg"

    try:

        # Calls Amazon Rekognition IndexFaces API to detect faces in S3 object 
        # to index faces into specified collection

        response = index_faces(bucket, key)

        # Commit faceId and full name object metadata to DynamoDB

person F128115    schedule 07.06.2018    source источник


Ответы (3)


Вот лучшее, что вы можете сделать, добавьте уведомление о событии s3 в качестве триггера для лямбда-функции и настройте его для своего префикса объекта, который в вашем случае "boss/".

добавить триггер

здесь префикс будет "босс/"

префикс

Затем измените свое ведро и ключ к этому в своем коде:

bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key'].encode('utf8'))

С помощью этого всякий раз, когда объект будет загружен в ваш путь bucket/boss/, ваш код автоматически извлечет его и запустит, выполняя обработку в коде.

Благодаря этому ваша лямбда не потребует каких-либо жестко закодированных строк контейнера и ключа и будет автоматически запускаться при загрузке изображения в путь к вашей подпапке. Кроме того, если вы хотите, чтобы обрабатывались только изображения, добавьте шаблон filter, который будет .jpg , .jpeg , .png и т. д.

person Mausam Sharma    schedule 07.06.2018
comment
идеальное решение - person F128115; 07.06.2018
comment
что там ключевое? - person F128115; 12.06.2018
comment
Затем измените свое ведро и укажите это в своем коде. где поменять ключ? - person F128115; 12.06.2018
comment
«ключ» автоматически извлекается при загрузке нового объекта, потому что мы использовали уведомление о событии s3 в качестве триггера. - person Mausam Sharma; 13.06.2018
comment
Конфигурация определена неоднозначно. Не может быть перекрывающихся суффиксов в двух правилах, если префиксы перекрываются для одного и того же типа события. (Сервис: Amazon S3; код состояния: 400; код ошибки: InvalidArgument; идентификатор запроса: 562299C942F65845; идентификатор расширенного запроса S3: y6QMiq513oYJkgy7g7EqFDInubvM1ux9oRrFzPbAvPyfqyrCpNm9TMKPWJBk47+tbImt8Z8LxFk=) - person F128115; 13.06.2018
comment
У ваших двух разных лямбда-функций настроен один и тот же триггер. Например, уведомление о событии по тому же пути в корзине s3 - person Mausam Sharma; 13.06.2018
comment
Измените конфигурацию лямбда-среды - person Mausam Sharma; 13.06.2018
comment
Мосам сделал это :) . Мне нужна небольшая помощь в другом вопросе. не могли бы вы рассказать небольшое решение, пожалуйста? - person F128115; 13.06.2018

Вы можете отфильтровать эту папку в своем ведре. В качестве примера:

#import boto3

s3 = boto3.resource('s3')
python_bucket = s3.Bucket('python')

for images in python_bucket.objects.filter(Prefix="boss/"):
    print images.key

ОБНОВИТЬ:

Согласно вашему недавнему редактированию, вы можете перебрать ведро/папку и запустить свой скрипт. Это более полный фрагмент, который должен хорошо работать для вашей лямбда-функции:

import boto3

def lambda_handler(event, context):
    s3 = boto3.resource('s3')
    images = ""
    python_bucket = s3.Bucket('python')

    #Here, you're going through each image in your bucket/folder.
    for image in python_bucket.objects.filter(Prefix="boss/"):
        images += image.key

    return images
person 0xack13    schedule 07.06.2018

Используйте операцию list_object на клиенте s3.

bucket="python"
client=boto3.client('s3')
response = client.list_objects(
    Bucket=bucket,
    Prefix='boss'
)
numberofobjects=len(response['Contents'])
for x in range(1, numberofobjects):
    try:
        response2=index_faces(bucket, response['Contents'][x]['Key'])
person Manoj Acharya    schedule 07.06.2018
comment
привет, есть небольшое редактирование. Как я могу передать это по одному в response = index_faces (bucket, key)? - person F128115; 07.06.2018