Как я могу сделать итерацию 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'])