2016-09-08 4 views
12

file.csv를 S3 버킷에 놓을 때 내 람다 함수에서 아래 오류가 표시됩니다. 파일이 크지 않고 읽기를 위해 파일을 열기 전에 60 초의 수면을 추가하기도했지만 어떤 이유로 파일에 추가 된 ".6CEdFe7C"가 추가되었습니다. 왜 그런가요?Python 읽기 전용 파일 시스템 오류 읽기 전용 파일을 열 때 S3 및 람다 오류

[Errno 30] Read-only file system: u'/file.csv.6CEdFe7C': IOError 
Traceback (most recent call last): 
File "/var/task/lambda_function.py", line 75, in lambda_handler 
s3.download_file(bucket, key, filepath) 
File "/var/runtime/boto3/s3/inject.py", line 104, in download_file 
extra_args=ExtraArgs, callback=Callback) 
File "/var/runtime/boto3/s3/transfer.py", line 670, in download_file 
extra_args, callback) 
File "/var/runtime/boto3/s3/transfer.py", line 685, in _download_file 
self._get_object(bucket, key, filename, extra_args, callback) 
File "/var/runtime/boto3/s3/transfer.py", line 709, in _get_object 
extra_args, callback) 
File "/var/runtime/boto3/s3/transfer.py", line 723, in _do_get_object 
with self._osutil.open(filename, 'wb') as f: 
File "/var/runtime/boto3/s3/transfer.py", line 332, in open 
return open(filename, mode) 
IOError: [Errno 30] Read-only file system: u'/file.csv.6CEdFe7C' 

코드 :

def lambda_handler(event, context): 

s3_response = {} 
counter = 0 
event_records = event.get("Records", []) 

s3_items = [] 
for event_record in event_records: 
    if "s3" in event_record: 
     bucket = event_record["s3"]["bucket"]["name"] 
     key = event_record["s3"]["object"]["key"] 
     filepath = '/' + key 
     print(bucket) 
     print(key) 
     print(filepath) 
     s3.download_file(bucket, key, filepath) 

위의 결과는 다음과 같습니다

mytestbucket 
file.csv 
/file.csv 
[Errno 30] Read-only file system: u'/file.csv.6CEdFe7C' 

키/파일 "file.csv"이 경우

, 그럼 왜 s3.download_file 방법을 수행 "file.csv.6CEdFe7C"를 다운로드 해보십시오. 함수가 트리거되면 파일은 file.csv.xxxxx이지만 줄 75가되면 파일은 file.csv로 이름이 변경됩니까?

+0

덤프가 읽기와 같지 않음! 따라서 임시 폴더 (또는 램)에있는 파일은'self._osutil.open (filename, 'wb')가 f :'가 아닌'rb'etc 만 덤프해야합니다. 따라서 처리하기 전에 소스 파일을 처리해야합니다. – dsgdfg

답변

36

AWS Lambda에는 /tmp 만 쓸 수있는 것 같습니다.

따라서이 작동합니다 :

filepath = '/tmp/' + key 
+1

1 시간 반 후, 나는 당신의 대답을 발견합니다 ... 왜 그들이 이것을 명확하게하지 않습니까? 감사! – john

+1

나는 같은 것을 궁금해하고 있었다. 그것은 심지어 어려웠다 이유의 인터넷 검색! 다행스럽게 도와 줄 수있어, 친구. –

+0

@john AWS는 방대한 문서 작성에 문제가 있습니다! –

-2

어코드

http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html에 NEX 예를 사용하는 방법을 보여줍니다, 첫 번째 매개 변수는 클라우드 이름이고, 두 번째는 다운로드 할 로컬 경로입니다. 반면에

enter image description here

amazaon docsenter image description here

따라서, 우리는 파일을 생성 512 메가 바이트가 말했다. 여기 내 람다 aws에 대한 내 코드입니다, 나를 위해 매력처럼 작동합니다.

.download_file(Key=nombre_archivo,Filename='/tmp/{}'.format(nuevo_nombre)) 
+0

시원한데 그건 당신의 코드입니다. 어떨까요? 당신의 대답이 그 문제를 해결할 수 있다면, 이유 **를 추가하십시오. ** 그것이 효과적입니다. 그렇지 않으면 삭제하십시오. – sjaustirni

+0

수정되었습니다. 추가 정보를 설정해야하는 경우 알려주십시오. –

+0

이미지에 코드를 넣지 마십시오. 그 동안 답안의 오타를 수정하십시오. 그러나 전반적으로 대답은 나아졌습니다. :-디 – sjaustirni