Как я могу сделать итерацию S3 Bucket Sub изображений общего

Мое ведро на 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

3 ответа

Решение

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

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

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

префикс

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

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

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

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

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

#import boto3

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

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

ОБНОВИТЬ:

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

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

Используйте операцию 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'])
Другие вопросы по тегам