とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

M1 Macにasdfからaws-cliをインストール

やっとApple Siliconデビューしました。Intel Macで何も困っていなくてズルズルと使ってたんですが、たまたま縁があり、M1を使わせていただくことになりました。今のところ大変快適です。

Apple Siliconデビューしたのが遅かったからか、M1初期にあったツールが対応していないという状況にもなかなか出会わなくて、なーんだ普通じゃん?とか思ってたんですが、とうとう非対応なツールに巡り合ってしまいました。

$ aws
/opt/homebrew/Cellar/asdf/0.14.1/libexec/lib/commands/command-exec.bash: line 28: /Users/ttanaka/.asdf/installs/awscli/2.17.47/bin/aws: Bad CPU type in executable
/opt/homebrew/Cellar/asdf/0.14.1/libexec/lib/commands/command-exec.bash: line 28: /Users/ttanaka/.asdf/installs/awscli/2.17.47/bin/aws: Undefined error: 0

ふむ。少し試行錯誤していきます。

原因調査

asdfでaws-cliをインストールするときに使われるプラグインはこちらです。

github.com

asdf install awscliを実行したときに走るスクリプトはこちら

asdf-awscli/bin/install at main · MetricMike/asdf-awscli · GitHub

普通にバージョンを指定してインストールするとhttps://awscli.amazonaws.com/AWSCLIV2.pkgからインストーラーがダウンロードされて、必要なファイルが展開されるみたいですね。プレビルドされたバイナリが展開されるんですが、これがarm64に対応していないみたいです。

READMEにも書いてありますが、Rosetta 2をインストールすれば解決しそうです。が、なんか負けた気がして、少しスクリプトを見ていると、ソースからインストールする記述がありました。

elif [ "${ASDF_INSTALL_TYPE}" = "ref" ]; then
    install_source "${ASDF_INSTALL_VERSION}" "${ASDF_DOWNLOAD_PATH}" "${ASDF_INSTALL_PATH}" "${ASDF_CONCURRENCY}"
fi

READMEにもビルドできるぞっという記述が

GitHub - MetricMike/asdf-awscli

ということでソースからインストールします。

ソースからインストール

READMEにはPython 3.8+とあります。私の環境はPython 3.12.6 でした。asdfのバージョン指定部分がrefから始まっていればいいようなのでasdf install awscli ref:$(asdf latest awscli 2)を実行します。

$ asdf install awscli "ref:$(asdf latest awscli 2)"
...
ERROR: Ignored the following versions that require a different python version: 4.10 Requires-Python <3.11,>=3.6; 4.6 Requires-Python <3.11,>=3.6; 4.7 Requires-Python <3.11,>=3.6; 4.8 Requires-Python <3.11,>=3.6; 4.9 Requires-Python <3.11,>=3.6; 5.0 Requires-Python <3.11,>=3.7; 5.0.1 Requires-Python <3.11,>=3.7; 5.1 Requires-Python <3.11,>=3.7; 5.10.0 Requires-Python <3.12,>=3.7; 5.10.1 Requires-Python <3.12,>=3.7; 5.11.0 Requires-Python <3.12,>=3.7; 5.12.0 Requires-Python <3.12,>=3.7; 5.2 Requires-Python <3.11,>=3.7; 5.3 Requires-Python <3.11,>=3.7; 5.4 Requires-Python <3.11,>=3.7; 5.4.1 Requires-Python <3.11,>=3.7; 5.5 Requires-Python <3.12,>=3.7; 5.6 Requires-Python <3.12,>=3.7; 5.6.1 Requires-Python <3.12,>=3.7; 5.6.2 Requires-Python <3.12,>=3.7; 5.7.0 Requires-Python <3.12,>=3.7; 5.8.0 Requires-Python <3.12,>=3.7; 5.9.0 Requires-Python <3.12,>=3.7
ERROR: Could not find a version that satisfies the requirement pyinstaller==5.12.0 (from versions: 2.0, 2.1, 3.0, 3.1, 3.1.1, 3.2, 3.2.1, 3.3, 3.3.1, 3.4, 3.5, 3.6, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.5.1, 5.13.0, 5.13.1, 5.13.2, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.4.0, 6.5.0, 6.6.0, 6.7.0, 6.8.0, 6.9.0, 6.10.0)
ERROR: No matching distribution found for pyinstaller==5.12.0
...
FileNotFoundError: [Errno 2] No such file or directory: '/Users/ttanaka/.asdf/installs/awscli/ref-2.17.47/lib/aws-cli/bin/aws'
make: *** [install] Error 1
~
asdf-awscli: Expected /Users/ttanaka/.asdf/installs/awscli/ref-2.17.47/bin/aws to be executable.
asdf-awscli: An error ocurred while installing awscli 2.17.47.

悲しい。無事ビルドに失敗しました。pyinstallerがよくないみたいなのでNo matching distribution found for pyinstaller==5.12.0で検索してみると

github.com

見事それらしいところにヒット。このIssueの一番下でPythonのバージョンについて別のIssueに飛ばされていました。

github.com

私の環境と一致してそうですね。どうやらaws-cli v2はPython 3.12には対応していないようです。公式のREADMEにもサポートバージョンにも3.11までしか書かれていませんでした。

github.com

ということで、asdfでpython 3.11をインストールしていきます。

$ asdf plugin add python
$ asdf install python $(asdf latest python 3.11)
$ asdf global python $(asdf latest python 3.11)
$ python --version
Python 3.11.10

再チャレンジ

$ asdf install awscli ref:$(asdf latest awscli 2)
...
asdf-awscli: asdf-awscli 2.17.47 installation was successful!

\(^o^)/

インストールできました。

$ asdf list awscli
 *2.17.47
  ref:2.17.47

インストールされたバージョンのref:から始まるんですね。

$ asdf global awscli ref:2.17.47
$ aws --version
aws-cli/2.17.47 Python/3.11.10 Darwin/23.6.0 source-exe/arm64

ひゃっはー

これにて完了です。

まとめ

ソースからインストールするオプションがあるのは知りませんでした。aws-cliプラグインがたまたま実装していたのか、他のプラグインでも実装されているのかまでは確認していませんが、何かあればソースを見てみるの大事ですね。