2017-05-25 169 views
1

我用Python编写的2.7 AWS lambda函数中,我想:AWS Python的lambda函数 - 文件上传到S3

1)抓住.xls文件形成一个HTTP地址。

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') 

然而,当我运行这个功能,我收到以下错误:

'IO错误:[错误30]只读文件系统'

我花了几个小时试图解决这个问题,但我倒在了我的脸上。任何帮助,将不胜感激。

回答

1

变化data = open('/tmp/' + FILE_NAME, 'wb')改变 “R”

也是WB,我想你的IAM用户完全访问权S3?

也许问题出在那个URL的请求...... 尝试cur_dt以“/ tmp目录/”开头 urllib.urlretrieve(dls, "/tmp/" + cur_dt + "test.xls")

+0

这当然有帮助! –

1

'IOError: [Errno 30] Read-only file system'

你似乎缺少一些写访问权。如果您的拉姆达有另一个策略,尝试将此策略附加到自己的角色:

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

它有S3完全访问权限,以及,如果你不能在你的水桶写。如果它解决了您的问题,那么您将在此之后删除一些权利。

+0

你懂了!我将IAM设置为Lambda只读访问权限。谢谢!!!! –