0

我在 s3 上的存储桶被命名为 'python' ,它的子文件夹是 'boss' 。所以我想在 lambda 函数中获取文件夹老板的所有图像。目前我正在硬编码值,但将图像放在根目录中而不是子文件夹中。

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
4

3 回答 3

1

在 s3 客户端上使用 list_object 操作。

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'])
于 2018-06-07T05:37:53.473 回答
1

您可以在存储桶中过滤该文件夹。举个例子:

#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
于 2018-06-07T05:40:00.483 回答
1

这是您可以做的最好的事情,将 s3 事件通知添加为 lambda 函数的触发器,并将其配置为您的对象前缀,即“boss/”在您的情况下

添加触发器

这里的前缀是“boss/”

字首

然后在您的代码中更改您的存储桶和密钥:

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

借助此功能,无论何时将对象上传到您的存储桶/boss/路径,您的代码都会自动获取它并运行它在代码中进行处理

有了这个,您的 lambda 将不需要任何硬编码的存储桶和密钥字符串,并将针对子文件夹路径中的图像上传自动运行。此外,如果您只想处理图像,请将过滤器模式添加为.jpg 、 .jpeg 、 .等

于 2018-06-07T08:42:16.863 回答