18

私たちは、AWS Lambda でのコードのデプロイと維持を支援するプロジェクト/フレームワークに取り組んでいます。次の理由により、ラムダ関数のすべての node.js コードを 1 つの js ファイルにビルド/バンドルしたいと考えています。

  • 小さいコードベースは、ラムダ コールド スタートの問題に役立ちます
  • Lambda には 50MB のコード zip サイズ制限があります

すでに多くのオプション (systemjs、browserify、webpack など) があるため、これを行うためのカスタム バンドラーを作成したくありません。ただし、一部のノード モジュールがバンドラー/ビルダーとうまく連携しないという問題が懸念されています。

具体的aws-sdkにはwebpack に関する既知の問題があり、 browserify をサポートしていると述べていますが、aws-sdk の browserify で問題が発生した人々と話をしました。

既存のバンドラー (または 2 つ) を選択したいのですが、それができるだけ多くのモジュール/コードで機能することを確認したいと考えています。私たちは JAWS 用のプラグイン エコシステムを作成しようとしているので、これを正しく行うことが重要です (使用するモジュール X がバンドルされないため、人々をオフにしたくありません)。

質問:

  1. これらの制約を満たすためにバンドル/ビルドを行うにはどうすればよいですか?
  2. 私たちの製品の消費者が記述/使用するコードがバンドルされることを保証するために、消費者に与えることができるガイドラインはありますか? 例:動的なrequire()は問題を引き起こします。
4

4 に答える 4

2

これはあなたの質問に直接答えるものではありませんが、サーバーレスプロジェクトはまさにこの状況にある人が必要としているものかもしれません。

通常の webpack スタイルのマルチファイル アーキテクチャでプロジェクトをビルドし、CLI ユーティリティを使用してプロジェクトを Lambda 最適化ファイルにビルドできます。

CLI は、関数の初期化、展開、および私がまだ必要としていない他の機能も処理します。トリガーの作成/設定も行います (例: s3 オブジェクトの作成や、AWS API サービスを介した新しい REST API の設定)。

私は Lambda 関数をいくつかしか持っていませんが、それらを維持することさえ苦痛でしたserverless

(これは冗談の投稿ですが、明確にするために、私はプロジェクトと提携していません)

于 2016-06-14T14:05:18.333 に答える
2

私は単一ファイル ソリューションを使用するのではなく、すべてのコードがパックされた zip ファイルをアップロードすることを好みます。これにはgulpを使用します。以下のコードは、開発用のものと以前のアップロードからの 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('.'));
});
于 2015-11-25T15:09:34.400 に答える
1

aws-sdk-jsが browserify を正式にサポートするようになりました。なぜこれが私のブログで素晴らしいことなのかがわかります。

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,
}

ここで私の完全なコードと完全な例をここで見ることができます

于 2017-01-05T15:04:24.283 に答える
0

考えられる答えは、関数をブートローダーのように動作させることです。関数が S3 からパッケージ化されたコードをダウンロードし、展開して実行するようにします。

あなたが提案している方法でコードに触れなければならないことは、予測不可能でデバッグが困難なバグにつながる可能性がある悪い考えのようです。

于 2015-10-30T18:08:10.713 に答える