ComposerでPackagistが読めない場合の対処法(on IPv6環境)

はじめに

composer install/update周りでハマったので残してとく。

事象

composer install/updateをローカル環境だと大丈夫だけど、
AWS上から叩いたらエラーになる

環境

EC2 + AMI + Jenkins pipline

事象

Jenkinsにcomposer installさせるとエラーになる。

Downloading (connecting...)
Downloading (failed)
[Composer\Downloader\TransportException]                                                                                                    
  The "https://registry.npmjs.org/flatpickr/-/flatpickr-4.2.4.tgz" file could not be downloaded: failed to open stream: Connection timed out  
install [--prefer-source] [--prefer-dist] [--dry-run] [--dev] [--no-dev] [--no-custom-installers] [--no-autoloader] [--no-scripts] [--no-progress] [--no-suggest] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] [--ignore-platform-reqs] [--] []...
script returned exit code 1

ファイルが取れないとか言ってるけど、ローカルだと上手くいくし、
node周り以外はダウンロードが上手くいっているので「???」な状態に。

やったこと

サーバー上でcomposer diag

結果

HTTP/HTTPSアクセスが両方コケる。

このとき、IPv6で繋ぎに行ってるのが気になってググる

以下が出てきたので、

https://getcomposer.org/doc/articles/troubleshooting.md#operation-timed-out-ipv6-issues-

言われるがままに以下を実行

sudo sh -c "echo 'precedence ::ffff:0:0/96 100' >> /etc/gai.conf"

IPv4を優先させるらしい。

リトライ

無事に成功 (プロジェクトなのでキャプチャとかは自重)

おわりに

端折って結果だけ書きましたが、 npm周りでしかエラーが出なかったので、npm周りの設定を疑ったりとかして色々見てました。

アーキテクチャがよく判ってないと、余計な周り道するなーと。

とりあえず、composer install/updateでエラーが出たら、

composer diagをぶっ叩くというのを徹底しようと思います。