Как я могу сделать итерацию S3 Bucket Sub изображений общего - PullRequest
0 голосов
/ 07 июня 2018

мой контейнер на 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 ]

0 голосов
/ 07 июня 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
0 голосов
/ 07 июня 2018

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

add trigger

здесь префиксом будет «босс»

prefix

Затем поменяйте ведрои введите это в своем коде:

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

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

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

0 голосов
/ 07 июня 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'])
...