Amplifyさん、勝手にyarnしないでください
久しぶりにAWS Amplify(Gen1)でバックエンドのデプロイをローカルから実行したらエラーに遭遇したので、対処法のメモです。
ハマったこと
amplify pushしたら以下のようなエラーが出ました。
🛑 Packaging lambda function failed with the error 
Command failed with exit code 1: yarn install --production
➤ YN0050: The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead
yarnを使った記憶がないのですが、Amplifyが勝手に使おうとしてエラーになっているみたいです。
対処方法
amplify.stateにインストールコマンドを追記すると回避できます。
{
  "pluginId": "amplify-nodejs-function-runtime-provider",
  "functionRuntime": "nodejs",
  "useLegacyBuild": true,
  "defaultEditorFile": "src/index.js",
+  "scripts": {
+    "build": "npm i"
+  }
}
参考issue
詳細
エラーになる条件
- 
amplify add function等で、AmplifyにNode.jsのLambdaを追加している - 
amplify pushする環境のyarnのバージョンが1.x系以外 
なぜエラーになるか
amplify pushした時に、Amplifyが生成したNode.jsのLambdaでは勝手に yarn install --production が実行されるようです。
このときamplify pushした環境にyarnがインストールされていなければ当然エラーになります。それだけならyarnをインストールすればよいのですが、Yarn2以降のバージョンでは--productionオプションは使用できません。ですので、環境にインストールされているyarnが新しいとamplify push時にエラーになってしまいます。
対処方法
- Yarnのバージョンを下げる。
 
Yarn 1.x系ならyarn install --productionでエラーにならないので、バージョンを下げれば通ります。
- ビルドコマンド(インストールコマンド)を書き換える。
 
最初に書いた対処方法になります。yarnのバージョンを下げたくない場合はこちらになります。
amplify add functionをしたときに、Lambdaのコードと共にamplify.stateという名前のファイルが作られているはずです。このファイルに追記することで、amplify push時に実行されるコマンドを上書きすることができます。
これってbuildでなくてinstallじゃないの?と思ってしまいますが気にしないことにします。
{
  "pluginId": "amplify-nodejs-function-runtime-provider",
  "functionRuntime": "nodejs",
  "useLegacyBuild": true,
  "defaultEditorFile": "src/index.js"
+  "scripts": {
+    "build": "npm i"
+  }
}
今回はnpm iにしましたが、エラーにならないなら--productionオプション無しのyarnでも良いかと思います。自分の環境にベストなコマンドを使いましょう。
最後に
早めにGen2に移行したい。
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion