2015-08-27 18 views
16

我們正在致力於在AWS Lambda中部署和維護代碼的project/framework。我想建立/捆綁爲一個lambda函數的所有node.js的代碼放到一個js文件,因爲:如何構建用於AWS Lambda nodejs運行時的單個js文件

  • 較小的代碼庫與拉姆達幫助冷啓動問題
  • 拉姆達擁有50MB
代碼zip大小限制

我們不想創建一個自定義捆綁器來做到這一點,因爲已經有很多選項(systemjs,browserify,webpack等)。但是我們關心的是一些節點模塊與捆綁器/構建器不兼容的問題。

具體aws-sdkknown issues with webpack,說它有browserify support,但我已經說過了誰曾與問題AWS browserify'ing-SDK人

我們要選擇一個現有的捆綁(或2),但我們希望以確保它可用於儘可能多的模塊/代碼。我們正在試圖爲JAWS創建一個插件生態系統,所以讓這個權利很重要(不要因爲他們使用的模塊X而禁用人員)。

問題:

  1. 我怎麼會去捆綁/建築來滿足這些約束?
  2. 我們可以向我們的產品的消費者提供任何指導方針,以確保他們編寫/使用的代碼將捆綁在一起嗎?例如:動態要求()會導致問題AFAIK。
+0

你試過browserify使用下列選項: ''' { 內建的:假的, commondir:假的, browserField:假的, detectGlobals:假的, ignoreMi sins:true, } ''' – twilson63

回答

1

aws-sdk-js現在正式supports browserify。你可以爲什麼這是一件好事on my blog

我創建了一個名爲serverless-plugin-browserify的無服務器插件,它將以極小的配置完成所有繁重工作。

具體回答這個問題,我解決了這個問題,這browserify配置:

{ 
    disable: false, //Not an official option, used as internal option to skip browserify 
    exclude: [], //Not an option, but will use for setting browserify.exclude() if defined in yml 
    ignore: [], //Not an option, but will use for setting browserify.ignore() if defined in yml 

    basedir:   this.serverless.config.servicePath, 
    entries:   [], 
    standalone:  'lambda', 
    browserField:  false, // Setup for node app (copy logic of --node in bin/args.js) 
    builtins:   false, 
    commondir:  false, 
    ignoreMissing: true, // Do not fail on missing optional dependencies 
    detectGlobals: true, // We don't care if its slower, we want more mods to work 
    insertGlobalVars: {  // Handle process https://github.com/substack/node-browserify/issues/1277 
    //__filename: insertGlobals.lets.__filename, 
    //__dirname: insertGlobals.lets.__dirname, 
    process: function() { 
    }, 
    }, 
    debug:   false, 
} 

你可以看到我的全部代碼here有一個完整的例子here

0

可能的答案可能是使該函數的行爲類似於引導加載程序。使功能從S3下載打包代碼,解包並運行它。

不得不觸摸代碼的方式,你提出的方式似乎是一個壞主意,可能會導致不可預知的和難以調試的錯誤。

2

我更喜歡不使用單個文件解決方案,而是上傳包含我所有代碼的zip文件。我爲此使用了大量的食物。下面的代碼僅上傳生產依賴項,不包括以前上傳的開發項目和zip存檔。您也可以使用gulp.src的參數排除測試文件夾或任何其他文件。

僅舉,aws-sdk圖書館是我的發展依賴作爲AWS LAMBDA已經複印件;)

var gulp = require('gulp'); 
var lambda = require('gulp-awslambda'); 
var zip = require('gulp-zip'); 
var settings = require('./settings'); 
var argv = require('yargs').argv; 
var p = require('./package.json'); 

gulp.task('default', function() { 
    var profile = argv.profile; 
    var src = ['**', '!*.zip', '!node_modules/aws-sdk{,/**}']; 
    var i; 
    for (i in p.devDependencies) { 
     src.push("!node_modules/" + i + "{,/**}"); 
    } 
    if (!profile) { 
     profile = settings.aws.defaultProfile; 
    } 
    return gulp.src(src) 
     .pipe(zip('archive.zip')) 
     .pipe(lambda(settings.aws.lambda, { 
      region: settings.aws.region, 
      profile: profile 
     })) 
     .pipe(gulp.dest('.')); 
}); 
+0

npm更新至v3後停止工作 – dchertousov

2

這並不直接回答你的問題,但serverless項目可能正是有人在這種情況需要。

它允許您以正常的webpack風格的多文件體系結構構建項目,然後使用CLI實用程序將您的項目構建到經過Lambda優化的文件中。

CLI還處理函數初始化,部署和一些我還沒有需要的其他函數。它甚至會創建/配置觸發器(例如,創建s3對象或通過AWS API服務設置新的REST API)。

我只有幾個Lambda功能,但是直到我開始使用serverless時,即使保持這些功能也是一種痛苦。

(這是崇洋媚外的職位,但要清楚,我不隸屬於W /項目)

相關問題