2017-05-25 210 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只讀訪問權限。謝謝!!!! –