こんにちは、エンジニアの @akase244 です。
「AWS Lambdaを触ってみたい」と急に思いたち、AWSのドキュメントを読んでいたのですが、Lambdaを触るための前準備として以下の3つが説明されており、その中の「SAM CLI のインストール」がうまくいかずハマってしまったので、その際のメモを残しておこうと思います。
Lambdaを触るための前準備
冒頭で大まかな流れを書きましたが、もう少し詳しく書くとこんな感じになります。
- AWS アカウントのセットアップ
- AWSアカウントを作成する。
- IAMユーザーを作成する。
- AWS CLI のセットアップ
- AWS CLIをインストールする。
- 作成済みのIAMユーザーの情報を元にAWS CLIの設定を行う。
- SAM CLI のインストール
- SAM CLIをインストールする。
SAM CLIのインストール方法
今回ハマってしまった「SAM CLIのインストール」ですが、AWSのドキュメント(Installing the AWS SAM CLI)によると、以下の3つが揃っていることが条件となっています。
- Docker
- AWS CLI
- Python 2.7 または Python 3.6 で pipコマンドが実行できる環境
これらの条件が揃った上で
$ pip install --user --upgrade aws-sam-cli
を実行するとSAM CLIのインストールが完了します。
なぜかコマンドが見つからない
インストール自体はうまくいったように見えたのですが、samコマンドを実行してみると「コマンドが見つからない」というエラーが表示されました。
$ sam --version -bash: sam: command not found
pip installで導入済みのパッケージの一覧から「aws-sam-cli」を検索してみると、やはりインストールはうまくいっているように見えるので恐らくコマンドサーチパスが通っていないのではないかと予想しました。
$ pip list |grep aws-sam-cli aws-sam-cli 0.10.0
バイナリファイルのパスを確認
色々と調べていると「pip showで確認できる」とのことで実行してみると、イマイチ欲しい情報ではありませんでした。
$ pip show aws-sam-cli Name: aws-sam-cli Version: 0.10.0 Summary: AWS SAM CLI is a CLI tool for local development and testing of Serverless applications Home-page: https://github.com/awslabs/aws-sam-cli Author: Amazon Web Services Author-email: aws-sam-developers@amazon.com License: Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ Location: /Users/akase244/Library/Python/2.7/lib/python/site-packages Requires: chevron, aws-lambda-builders, boto3, Flask, docker, requests, six, python-dateutil, pathlib2, click, dateparser, aws-sam-translator, cookiecutter, serverlessrepo, enum34, PyYAML Required-by:
今回欲しい情報は「rpm -ql パッケージ名」や「repoquery --installed -l パッケージ名」の実行結果のようにインストール済みパッケージのファイル一覧です。
さて答えになりますが、実はおしいところまで迫っていました。
「pip show」に「-f」オプションをつけることで「pip show」の実行結果に「Files:」という情報が付加されて表示されます。
$ pip show -f aws-sam-cli Name: aws-sam-cli Version: 0.10.0 Summary: AWS SAM CLI is a CLI tool for local development and testing of Serverless applications Home-page: https://github.com/awslabs/aws-sam-cli Author: Amazon Web Services Author-email: aws-sam-developers@amazon.com License: Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ Location: /Users/akase244/Library/Python/2.7/lib/python/site-packages Requires: chevron, aws-lambda-builders, serverlessrepo, boto3, Flask, docker, requests, six, python-dateutil, pathlib2, click, dateparser, aws-sam-translator, cookiecutter, enum34, PyYAML Required-by: Files: ../../../bin/sam aws_sam_cli-0.10.0.dist-info/INSTALLER aws_sam_cli-0.10.0.dist-info/METADATA aws_sam_cli-0.10.0.dist-info/RECORD ・ ・ 省略 ・ ・ tests/unit/local/services/test_base_local_service.py tests/unit/local/services/test_base_local_service.pyc tests/unit/test_yamlhelper.py tests/unit/test_yamlhelper.pyc
なお、確認したかったのはバイナリファイルへのパスですので、このようにgrepするとよいでしょう。
$ pip show -f aws-sam-cli |grep '/bin' ../../../bin/sam
コマンドサーチパスの設定
「pip show -f 」の結果をよく見るとこのように出力されています。
Location: /Users/akase244/Library/Python/2.7/lib/python/site-packages ・ ・ 省略 ・ ・ Files: ../../../bin/sam
つまり、「/Users/akase244/Library/Python/2.7/bin」に対してコマンドサーチパスを通すことでうまくいきそうだということがわかります。
なので「.bash_profile」に以下の行を追加してみます。
export PATH=$PATH:$HOME/Library/Python/2.7/bin
.bash_profileを再読込すると今度はうまくいきました!
$ source .bash_profile $ sam --version SAM CLI, version 0.10.0
おまけ1
pipコマンドを使い慣れてる方にとっては当たり前なのかもしれませんが、あまり使ったことがなかったので思いがけずハマってしまいました。
まぁ、そんな人のためにインストール時にPATHについて丁寧なメッセージが表示されてるので、ちゃんと読みましょうってことなんですけどね。。。
$ pip install --user --upgrade aws-sam-cli Collecting aws-sam-cli Using cached https://files.pythonhosted.org/packages/30/bf/e2302637eb5766342b405383d8b25c5db6ccb66ca4ce8030ef63b2a33dab/aws_sam_cli-0.10.0-py2-none-any.whl Requirement already satisfied, skipping upgrade: chevron~=0.12 in ./Library/Python/2.7/lib/python/site-packages (from aws-sam-cli) (0.13.1) ・ ・ 省略 ・ ・ Installing collected packages: aws-sam-cli The script sam is installed in '/Users/akase244/Library/Python/2.7/bin' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. Successfully installed aws-sam-cli-0.10.0
おまけ2
samコマンドがうまく実行できなかった際に、pip installでの導入に失敗しているのではないかと思い再インストールしてみようとしたのですが、実はpip uninstallでもバイナリファイルのパスを知ることができます。
$ pip uninstall aws-sam-cli Uninstalling aws-sam-cli-0.10.0: Would remove: /Users/akase244/Library/Python/2.7/bin/sam /Users/akase244/Library/Python/2.7/lib/python/site-packages/aws_sam_cli-0.10.0.dist-info/* /Users/akase244/Library/Python/2.7/lib/python/site-packages/samcli/* /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/functional/* /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/integration/* /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/* Would not remove (might be manually added): /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/conftest.py /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/test_application_metadata.py /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/test_application_policy.py /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/test_parser.py /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/test_permission_helper.py /Users/akase244/Library/Python/2.7/lib/python/site-packages/tests/unit/test_publish.py Proceed (y/n)?