我有一个用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]只读文件系统'
我花了好几个小时试图解决这个问题但是我摔倒在脸上。任何帮助将不胜感激。
答案 0 :(得分:5)
'IOError:[Errno 30]只读文件系统'
您似乎缺少一些写访问权限。如果您的lambda有另一个策略,请尝试将此策略附加到您的角色:
ARN:AWS:IAM :: AWS:策略/ AWSLambdaFullAccess
它也可以在S3上完全访问,以防您无法在存储桶中写入。如果它解决了您的问题,那么您将删除一些权利。
答案 1 :(得分:1)
更改data = open('/tmp/' + FILE_NAME, 'wb')
更改wb for" r"
另外,我假设您的IAM用户可以完全访问S3吗?
或者问题出在该网址的请求中......
尝试cur_dt以" / tmp /&#34开头;
urllib.urlretrieve(dls, "/tmp/" + cur_dt + "test.xls")
答案 2 :(得分:1)
我已将图像上传到s3 Bucket。在“ Lambda测试事件”中,我创建了一个json测试事件,其中包含要上传到s3存储桶和图像名称的Image的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'
}