2016-06-07 3 views
0

AWS Lambda 함수에서 작업하고 있습니다. 나는 성공적으로 NASA APOD에 API 호출을하고 값을 되찾고있다. 이미지 URL을 가져 와서 해당 이미지를 다운로드 한 다음 S3에 업로드하고 싶습니다. "test.jpg"이미지에 액세스하려고 할 때 오류가 발생합니다. "오류 : EACCES : 권한이 거부되었습니다. 'test.jpg'"을 엽니 다. S3bucket.putObject를 http.request 외부로 이동하면 데이터가 null과 같습니다. 나는 간단한 것을 놓치고 있다는 것을 압니다. 생각?AWS Lambda 이미지 가져 오기 및 S3로 업로드

function GetAPOD(intent, session, callback) { 
    var nasa_api_key = 'demo-key' 
    , nasa_api_path = '/planetary/apod?api_key=' + nasa_api_key; 

    var options = { 
     host: 'api.nasa.gov', 
     port: 443, 
     path: nasa_api_path, 
     method: 'GET' 
    }; 

    var req = https.request(options, function (res) { 
     res.setEncoding('utf-8'); 

     var responseString = ''; 
     res.on('data', function (data) { 
      responseString += data; 
     }); 

     res.on('end', function() { 
      console.log('API Response: ' + responseString); 

      var responseObject = JSON.parse(responseString) 
      , image_date = responseObject['date'] 
      , image_title = responseObject['title'] 
      , image_url = responseObject['url'] 
      , image_hdurl = responseObject['hdurl'] 
      , image_desc = responseObject['explanation']; 

      var s3Bucket = new AWS.S3({ params: {Bucket: 'nasa-apod'} }); 

      var fs = require('fs'); 

      var file = fs.createWriteStream("test.jpg"); 
      var request = http.get(image_url, function(response) { 
       response.pipe(file); 

       var data = {Key: "test.jpg", Body: file}; 
       s3Bucket.putObject(data, function(err, data) { 
        if (err) { 
         console.log('Error uploading data: ', data); 
        } 
        else { 
         console.log('succesfully uploaded the image!'); 
        } 
       }); 
      }); 

     }); 
    }); 

    req.on('error', function (e) { 
     console.error('HTTP error: ' + e.message); 
    }); 

    //req.write(); 
    req.end(); 
} 
+0

어떻게 이미지에 액세스하려고합니까? 또는 이미지에 액세스하는 데 사용하는 방법은 무엇입니까? – error2007s

+0

s3Bucket.putObject의 file 변수에 데이터 객체의 Body로 액세스하고 있습니다. – Kris

답변

1

/tmp으로 파일을 작성해야합니다. Lambda 환경에서 쓰기 권한이있는 유일한 디렉토리입니다.

+0

마크 - 감사합니다. 파일을 쓰고 test.jpg와 관련된 오류를 내지 못했습니다. putObject가 호출되면 "NetworkingError : 파이프 할 수 없습니다. 읽을 수 없습니다."를 반환합니다. 한 걸음 더 가까이에! – Kris

+0

쓰기 스트림을 putObject에 전달 중입니다. 스트림을 닫고 새 읽기 스트림을 만들어야한다고 생각합니다. 양자 택일로, 나는 당신이 메모리에 이미 가지고 있기 때문에 임시 파일에 데이터를 쓰는 것이 정말로 필요하다고 생각하지 않는다. –

+0

감사합니다. 요청 변수가 메모리 또는 응답의 데이터일까요? 나는 둘 다 시도하고 다른 오류 메시지를 얻을. – Kris

0

나는 그것을 얻었다 !! 도움을 주신 Mark B에게 감사드립니다. 스트림에서 데이터를 로컬에서 저장하지 않고 버킷에 쓰지 않고도 가져올 수있었습니다. S3 용 putObject를 허용하도록 IAM 역할을 변경해야했습니다.

function GetAPOD(intent, session, callback) { 
    var nasa_api_key = 'demo-key' 
    , nasa_api_path = '/planetary/apod?api_key=' + nasa_api_key; 

    var options = { 
     host: 'api.nasa.gov', 
     port: 443, 
     path: nasa_api_path, 
     method: 'GET' 
    }; 

    var req = https.request(options, function (res) { 
     res.setEncoding('utf-8'); 

     var responseString = ''; 
     res.on('data', function (data) { 
      responseString += data; 
     }); 

     res.on('end', function() { 
      // console.log('API Response: ' + responseString); 

      var responseObject = JSON.parse(responseString) 
      , image_date = responseObject['date'] 
      , image_title = responseObject['title'] 
      , image_url = responseObject['url'] 
      , image_hdurl = responseObject['hdurl'] 
      , image_desc = responseObject['explanation']; 

      var image_name = image_date + '.jpg'; 

      var s3 = new AWS.S3(); 
      var s3Bucket = new AWS.S3({ params: {Bucket: 'nasa-apod'} }); 

      var request = http.get(image_url, function(response) { 
       var image_stream = null; 
       response.on('data', function (data) { 
        image_stream = data; 
       }); 

       response.on('end', function() { 
        var param_data = {Key: image_name, Body: image_stream, ContentType: "image/jpeg", ContentLength: response.headers['content-length']}; 
        s3Bucket.putObject(param_data, function(err, output_data) { 
         if (err) { 
          console.log('Error uploading data to S3: ' + err); 
         } 
        }); 
       }); 
      }); 
      request.end(); 

     }); 
    }); 

    req.on('error', function (e) { 
     console.error('HTTP error: ' + e.message); 
    }); 

    req.end(); 
} 
+0

나는 그것을 가지고 있다고 생각했는데, 내 S3 버켓에 파일을 넣었지 만 파일을 열려고 시도했을 때 파일이 유효하지 않습니다. – Kris

+0

ContentType과 ContentLength를 param_data 객체에 추가해야했습니다. 이제 작동 중입니다. – Kris

관련 문제