銀の弾丸

プログラミングに関して、いろいろ書き残していければと思っております。

AWS SAMがAWS CLIを見失う?ならPATH設定を要チェック!

f:id:takamints:20191013125055j:plain
photo credit: dolbinator1000 Over The Hill via photopin (license)

LinuxAWS CLIをインストールしてコンソールから普通に使えていたのに、SAMでサーバーレスアプリのパッケージを作成しようとすると「AWS CLIが見つからない」というエラーが出て失敗しました。ビルドできるのになんでやねんと。

どうやら、AWS CLIのPATH設定と、AWS SAMのPATH検索方法の行き違いみたいなことで発生した問題のようでした。

目次

実行環境

$ sam --version
SAM CLI, version 0.22.0)
$
$ aws --version
aws-cli/1.16.258 Python/3.6.5 Linux/4.19.78-2-lts botocore/1.12.248
$
$ uname -srm
Linux 4.19.78-2-lts x86_64
$

sam package でエラー

sam package でパッケージを作ろうとするとエラーを履いて失敗しました。

$ sam package --s3-bucket <bucket-name> --output-template-file packaged.yaml

Error: Cannot find AWS CLI installation, was looking at executables with names: 
['aws']
$

エラーメッセージは「AWS CLIのインストールが見つからない。コマンド 名 aws を探していましたが・・・」みたいな感じ。

いやしかし、AWS CLI はインストールしており、コンソールから普通に使えている状態。以下のようにPATHも通っていますよ。

$ which aws
/home/<user>/.local/bin/aws

ただ、気になったのは aws がホームディレクトリ以下の自宅の床下みたいな所 にあるということ。 どうやら、pipで自分だけ使えるようにインストールしたら、こうなるようです。 全ユーザーが使えるようにしたらこうはならないらしいです。

とりあえずの対策

Cannot find AWS CLI installation, was looking at executables with names

エラーメッセージで検索すると、Close済のGitのIssueがヒット。 文言が少し違っていますが、同じ問題のように思えます(↓これ)。

github.com

「とりあえず /usr/bin/usr/local/bin に上記 aws コマンドを置けばOK」とありますので、シンボリックリンクを張ってみると、、、

あっさり解決・・・

[~] $ cd /usr/local/bin
[/usr/local/bin] $ sudo ln -S aws /home/<user>/.local/bin/aws
[/usr/local/bin] $ cd ~/sam-app
[~/sam-app] $ sam package --s3-bucket my-sam-app-bucket --output-template-file \
packaged.yaml


Successfully packaged artifacts and wrote output template to file packaged.yaml.
Execute the following command to deploy the packaged template
aws cloudformation deploy --template-file /home/<user>/..../packaged.yaml 
--stack-name <YOUR STACK NAME>

しかしこれ、やっぱり aws コマンドの場所が気持ち悪い。 街の通り(/usr/local/bin)から自宅の床下(~/.local/bin)に抜け穴を掘ってるみたいです。

正しい解決法

さらにIssueを読み進めると、ヒントがもひとつ書いてあった。

SAMはawsのありかを自前でチェックしているらしいのです。 なんでそんなことしてるのかは知りませんが、そのおかげで PATH に含まれてる ~ を正しく解釈できないらしい。 ほら言わんこっちゃない。なんで自前でやっちゃうかな。本来それはOSに任せるべきなのでは? とか言ってても仕方がない。

とにかくそういうことらしいので、自分の .bashrc を確認すると、・・・

.bashrc

export PATH="~/.local/bin:$PATH"

普通に ~ を使っていましたね。 結局このせいでAWS SAMはAWS CLIを見つけられず、インストールされていないなんて言っていたわけです。

以下のように ~ を使わないように修正すれば問題解決。 上に書いた /usr/local/bin からのシンボリックリンクも不要です。

export PATH="/home/<user>/.local/bin:$PATH"

結構時間がかかって解決しました。割と大きめの落とし穴にハマった気分でした。