AWS SAMがAWS CLIを見失う?ならPATH設定を要チェック!
photo credit: dolbinator1000 Over The Hill via photopin (license)
LinuxにAWS 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がヒット。 文言が少し違っていますが、同じ問題のように思えます(↓これ)。
「とりあえず /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"
結構時間がかかって解決しました。割と大きめの落とし穴にハマった気分でした。