【问题标题】:AWS Python Lambda Function - Upload File to S3AWS Python Lambda 函数 - 将文件上传到 S3
【发布时间】:2017-10-26 06:20:09
【问题描述】:

我有一个用 Python 2.7 编写的 AWS Lambda 函数,我想在其中:

1) 从 HTTP 地址获取 .xls 文件。

2) 将其存储在临时位置。

3) 将文件存储在 S3 存储桶中。

我的代码如下:

from __future__ import print_function
import urllib
import datetime 
import boto3
from botocore.client import Config

def lambda_handler(event, context):

    """Make a variable containing the date format based on YYYYYMMDD"""
    cur_dt = datetime.datetime.today().strftime('%Y%m%d')

    """Make a variable containing the url and current date based on the variable
    cur_dt"""
    dls = "http://11.11.111.111/XL/" + cur_dt + ".xlsx"
    urllib.urlretrieve(dls, cur_dt + "test.xls")

    ACCESS_KEY_ID = 'Abcdefg'
    ACCESS_SECRET_KEY = 'hijklmnop+6dKeiAByFluK1R7rngF'
    BUCKET_NAME = 'my-bicket'
    FILE_NAME = cur_dt + "test.xls";

    data = open('/tmp/' + FILE_NAME, 'wb')

    # S3 Connect
    s3 = boto3.resource(
        's3',
        aws_access_key_id=ACCESS_KEY_ID,
        aws_secret_access_key=ACCESS_SECRET_KEY,
        config=Config(signature_version='s3v4')
    )

    # Uploaded File
    s3.Bucket(BUCKET_NAME).put(Key=FILE_NAME, Body=data, ACL='public-read')

但是,当我运行此函数时,我收到以下错误:

'IOError: [Errno 30] 只读文件系统'

我已经花了好几个小时试图解决这个问题,但我脸色难看。任何帮助将不胜感激。

【问题讨论】:

  • 如果某个答案对您有所帮助,通常会勾选它旁边的复选标记作为已接受的解决方案。

标签: python-2.7 amazon-s3 aws-lambda


【解决方案1】:

'IOError: [Errno 30] 只读文件系统'

您似乎缺少一些写入权限。如果您的 lambda 有其他策略,请尝试将此策略附加到您的角色:

arn:aws:iam::aws:policy/AWSLambdaFullAccess

它也对 S3 具有完全访问权限,以防您无法在存储桶中写入。如果它解决了您的问题,您将在此之后删除一些权利。

【讨论】:

  • 你明白了!!!我将 IAM 设置为 Lambda 只读访问权限。谢谢!!!!
【解决方案2】:

我已将图像上传到 s3 Bucket。在“Lambda 测试事件”中,我创建了一个 json 测试事件,其中包含要上传到 s3 存储桶的图像的 BASE64 和图像名称。 Lambda 测试 JSON 事件作为休闲 ======>

            { 
                "ImageName": "Your Image Name",
                "img64":"BASE64 of Your Image"
            }

以下是将图像或任何文件上传到 s3 的代码 ======>

import boto3
import base64
def lambda_handler(event, context):
    s3 = boto3.resource(u's3')
    bucket = s3.Bucket(u'YOUR-BUCKET-NAME')
    path_test = '/tmp/output'         # temp path in lambda.
    key = event['ImageName']          # assign filename to 'key' variable
    data = event['img64']             # assign base64 of an image to data variable 
    data1 = data
    img = base64.b64decode(data1)     # decode the encoded image data (base64)
    with open(path_test, 'wb') as data:
        #data.write(data1)
        data.write(img)
        bucket.upload_file(path_test, key)   # Upload image directly inside bucket
        #bucket.upload_file(path_test, 'FOLDERNAME-IN-YOUR-BUCKET /{}'.format(key))    # Upload image inside folder of your s3 bucket.
    print('res---------------->',path_test)
    print('key---------------->',key)

    return {
            'status': 'True',
       'statusCode': 200,
       'body': 'Image Uploaded'
      }

【讨论】:

  • 嘿,为什么是base64?比原始二进制文件更容易压缩和使用?
  • 当时我们的用例需要base 64,也不知道有什么其他格式来存储图片。
【解决方案3】:

更改 data = open('/tmp/' + FILE_NAME, 'wb') 将 wb 更改为 "r"

另外,我假设您的 IAM 用户对 S3 具有完全访问权限吗?

或者问题可能出在该网址的请求中...... 试试 cur_dt 以“/tmp/”开头 urllib.urlretrieve(dls, "/tmp/" + cur_dt + "test.xls")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 2021-08-27
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多