AWS通过s3无服务器提供文件

时间:2018-09-21 23:57:46

标签: amazon-s3 aws-lambda boto3

我正在尝试使用python中的lambda函数从S3提供音频文件。

我的lambda函数正在生成一条Internal server error消息,CloudWatch日志显示:

23:42:07 An error occurred during JSON serialization of response: b'\xff\xfb\x90\xc4\x00\x00\...

下面是我的python lambda函数中的代码

import boto3

def getAudio(event, context):
    #[Validate permissions here]
    s3 = boto3.client('s3')
    my_bucket = 'my-app'
    my_key = "audio/%s.mp3"%(event['pathParameters']['audio_id'])
    s3_object = s3.get_object(Bucket=my_bucket, Key=my_key)
    return s3_object['Body'].read()

检索和传递音频文件的适当方法是什么?

我的终点是https://1cbbkp15ci.execute-api.us-east-1.amazonaws.com/dev/assert/audio/adfk-m1

1 个答案:

答案 0 :(得分:3)

为S3创建签名URL并重定向到该URL的最简单方法。

  

Lambda(验证权限和创建签名的URL)->重定向(302)   -> S3存储桶中的实际文件

Python签名的URL生成代码:

import boto3
import requests

# Get the service client.
s3 = boto3.client('s3')

# Generate the URL to get 'key-name' from 'bucket-name'
url = s3.generate_presigned_url(
    ClientMethod='get_object',
    Params={
        'Bucket': 'bucket-name',
        'Key': 'key-name'
    }
)

# Use the URL to perform the GET operation. You can use any method you like
# to send the GET, but we will use requests here to keep things simple.
response = requests.get(url)

此外,如果您希望投放的内容类型正确。在S3中设置对象的内容类型。您可以使用命令行甚至boto3进行设置。

  

aws s3api put-object --bucket bucket --key foo.mp3 --body foo.mp3   --content-type音频/ mpeg

希望有帮助。