NPMの代わりにyarnパッケージマネージャーを使用してNode JSアプリケーションをインストールするようにEBSを構成することは可能ですか?
私は方法を見つけましたが、それは少しハッキーです。
.ebextensions/yarn.config
ファイルを作成します。 (名前は「ヤーン」である必要はありません。)このコンテンツをファイルに入れます:
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つのことを行うファイルを作成します。
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
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"
私が思いついたこの方法により、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;
EBはデフォルトでnpmをサポートしているため、。ebextensionsのデプロイメントスクリプトを介してyarnをインストールすることをお勧めします。それでいいはずです。