web-dev-qa-db-ja.com

AWS ElasticBeanstalk NodeJSインストールのカスタマイズ(糸を使用)

NPMの代わりにyarnパッケージマネージャーを使用してNode JSアプリケーションをインストールするようにEBSを構成することは可能ですか?

27
Jiew Meng

私は方法を見つけましたが、それは少しハッキーです。

  1. .ebextensions/yarn.configファイルを作成します。 (名前は「ヤーン」である必要はありません。)
  2. このコンテンツをファイルに入れます:

    files:
    # Runs right before `npm install` in '.../50npm.sh'
    "/opt/elasticbeanstalk/hooks/appdeploy/pre/49yarn.sh" :
        mode: "000775"
        owner: root
        group: users
        content: |
            #!/bin/bash
    
            app="$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir)";
    
            # install node
            curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -;
    
            # install yarn
            curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo;
            yum -y install yarn;
    
            # install node_modules with yarn
            cd "${app}";
            yarn --production;
    

この拡張子は、3つのことを行うファイルを作成します。

  1. ノードをインストールします。
  2. 糸を取り付けます。
  3. Node_modulesとyarnをインストールします。

Elastic Beanstalkがyarn installを実行する前にnpm installを実行させるために、ファイルは/opt/elasticbeanstalk/hooks/appdeploy/preの下に作成されます。これにより、ファイルがデプロイ前のフックになります。つまり、デプロイの最初のフェーズでElastic Beanstalkがファイルを実行します。デフォルトでは、このディレクトリに50npm.shという別のファイルがあり、npm installを実行します。 Elastic Beanstalkはこのディレクトリ内のファイルをアルファベット順に実行するため、49yarn.sh(デフォルトファイル)の前に50npm.sh(ファイル)が実行され、yarn installの前にnpm installが実行されます。

潜在的な問題の1つは、Elastic Beanstalk UIで設定された環境変数(Configuration> Software Configurationの下)がデプロイ段階のこの時点で利用できないことです。プライベートnpmモジュールのインストールに使用するnpm authトークンがある場合、これは大きな問題です。

別の潜在的な問題は、これによりノードが手動でインストールされるため、Elastic Beanstalk UIで(Configuration> Software Configurationの下で)指定する「ノードバージョン」は、アプリケーションが使用するノードのバージョンに影響しないことです。 ;この拡張子で指定する必要があります。 Elastic Beanstalkの50npm.shは、ノードをインストールし、npm installを実行します。そのファイルを実行する前にyarn installを実行する必要があるため、ノードを手動でインストールする必要もあります。次に、Elastic Beanstalkがノードをインストールするときに、ノードが既にインストールされていることを検出しますが、正しいバージョンであることを確認しないため、ノードのインストールをスキップします。

参考として、糸のインストール手順はここから来ました: https://yarnpkg.com/docs/install#linux-tab

27
GreenRaccoon23

https://yarnpkg.com/lang/en/docs/install/ の指示に従ってこれを行いました

commands:
  01_install_yarn:
    command: "Sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo && curl --silent --location https://rpm.nodesource.com/setup_6.x | Sudo bash - && Sudo yum install yarn -y"
7

私が思いついたこの方法により、Elastic Beanstalksダッシュボードを介してノードバージョンを制御できます。

この質問をありがとう!それなしでは、この解決策に到達することはできませんでした:D

 "/opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh":
        mode:    "000755"
        owner:   root
        group:   users
        content: |
           #!/usr/bin/env bash
           #
           # Prevent installing or rebuilding like Elastic Beanstalk tries to do by
           # default.
           #
           # Note that this *overwrites* Elastic Beanstalk's default 50npm.sh script
           # (https://Gist.github.com/wearhere/de51bb799f5099cec0ed28b9d0eb3663).
    "/opt/elasticbeanstalk/hooks/configdeploy/pre/50npm.sh":
        mode:    "000755"
        owner:   root
        group:   users
        content: |
           #!/usr/bin/env bash
           #
           # Prevent installing or rebuilding like Elastic Beanstalk tries to do by
           # default.
           #
           # Note that this *overwrites* Elastic Beanstalk's default 50npm.sh script.
           # But their default script actually doesn't work at all, since the app
           # staging dir, where they try to run `npm install`, doesn't exist during
           # config deploys, so ebnode.py just aborts:
           # https://Gist.github.com/wearhere/de51bb799f5099cec0ed28b9d0eb3663#file-ebnode-py-L140
    "/opt/elasticbeanstalk/hooks/appdeploy/pre/49yarn.sh" :
        mode:    "000775"
        owner:   root
        group:   users
        content: |
           tmp="$(mktemp || bail)";
           app="$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir)";
           version="$(/opt/elasticbeanstalk/bin/get-config optionsettings -n aws:elasticbeanstalk:container:nodejs -o NodeVersion)";
           echo $version
           major="$(cut -d'.' -f1 <<<${version})"
           yum -y install python26 python26-libs
           wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo;

           wget "https://rpm.nodesource.com/pub_${major}.x/el/7/x86_64/nodejs-${version}-1nodesource.x86_64.rpm" -O "${tmp}";
           rpm -i --nosignature --force "${tmp}";
           rm -f "${tmp}";

           yum -y install yarn;

           cd "${app}";
           yarn --production;
3
KickTheDragon

EBはデフォルトでnpmをサポートしているため、。ebextensionsのデプロイメントスクリプトを介してyarnをインストールすることをお勧めします。それでいいはずです。

0
Akarsh Satija