はじめに
私は下記の観点のもと AWS CLI を Python のバージョン・パッケージ管理と仮想環境を使ってプロジェクト単位でインストールしています。
- 身も蓋もないですが、ローカル環境をあまり汚したくない
- Python のパッケージ管理で AWS CLI 自体のバージョン管理が行える
- パッケージ + Git 管理下で、新たな端末または他者にも AWS CLI の環境構築が展開しやすくなる
- CICD ツール や AWS の CodeDeploy を導入している際にどの道必要となる場合がある
基本的にはパッケージ管理による恩恵が大きいですが、AWS CLI もパッケージ管理下に置くことで、AWS との連携も含めた柔軟な環境構築が可能になります。
Python のバージョン・パッケージ管理・仮想環境構築のとして pyenv + Pipenv を選択しています。
ここら辺のベストプラクティスは正直自分には分かりません(汗)、職場の状況やチームの規模に応じて柔軟に対応できるかが重要かなと思います。
注意点
AWS CLI を仮想環境にインストールする手順は公式でも用意されていますが、そちらは virtualenv
を使用しており、本記事は pyenv + Pipenv
を対象としております。
また、2020 年 1 月 10 日から AWS CLI の Python インストールのバージョン要件が 2 系は 2.7 以上、3 系は 3.4 以上になりました。
上記のような変更も時たまあるため、なるべく柔軟に対応するためにもバージョン管理はしておいた方が良いかなと思っています。
現在、AWS CLI v2 が 2020 年 2 月 10 日からリリースされており、そちらが最新のメジャーバージョンになっていますが、本記事では AWS CLI v1 を対象としております。はっきりと追えているわけではないですが、AWS CLI v2 では Python 依存がなくなったので、プロジェクト単位で管理するなら Docker が前提になるのかなと思っています。
やりたいこと
- AWS CLI v1 を pyenv + Pipenv のパッケージ管理下において、比較的簡単に環境構築してみる
- ローカルから AWS CLI v1 のコマンドを打って接続を確認する
対象環境とユーザー
- macOS Catalina バージョン 10.15.3
- デフォルトシェルが zsh
- homebrew が既にインストール済み
AWS CLI のインストール
pyenv のインストール
まず、homebrew 経由で pyenv をインストール
1$ brew update
2$ brew install pyenv
pyenv の path を ~/.bash_profile
に追加
1$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
2$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
3$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
4$ source ~/.bash_profile # 必ずして下さい、設定が反映されません
pyenv のインストール確認
1$ pyenv version
23.*.* (set by /Users/hoge/.pyenv/version) # バージョンが表示されればOK
python をインストール
pyenv で 3.4 以上の python をインストール(AWS CLI が 3.4 以降をサポート)
1$ pyenv install -list # インストール可能なpythonのバージョンリスト表示
2$ pyenv install 3.7.4
python 3.7.4 が global(≒ 標準)で動くように設定
1$ pyenv global 3.7.4
2$ python --version
3Python 3.7.4
Pipenv のインストール
pip でインストール、、、(homebrew でもインストールできますが試してません)
1$ pip install pipenv
2$ pipenv version
3pipenv, version 2018.11.26
当該ディレクトリを pipenv 管理下に変更
1$ mkdir hoge
2$ cd hoge
3$ pipenv --python 3.7.4
4$ pipenv shell
5
6(hoge) $ # とカレントディレクトリ名が()に囲まれてshellの先頭に現れます
やっと AWS CLI v1 をインストール
pipenv 内では pipenv install
でインストールします、--dev
をオプションにつけることで開発と本番を切り分けられます。
1(hoge)$ pipenv install --dev awscli
2(hoge)$ pip list
3
4Package Version
5--------------- -------
6awscli 1.18.11
7botocore 1.15.11
8colorama 0.4.3
9docutils 0.15.2
10jmespath 0.9.5
11pip 20.0.2
12pyasn1 0.4.8
13python-dateutil 2.8.1
14PyYAML 5.2
15rsa 3.4.2
16s3transfer 0.3.3
17setuptools 45.1.0
18six 1.14.0
19urllib3 1.25.8
20wheel 0.34.2
インストールされたパッケージは Pipfile で管理され、requirements.txt と同様に閲覧することができます。
1(hoge)$ cat Pipfile
2
3[[source]]
4name = "pypi"
5url = "https://pypi.org/simple"
6verify_ssl = true
7
8[dev-packages]
9awscli = "*"
10
11[packages]
12
13[requires]
14python_version = "3.7"
インストール確認
1(hoge)$ aws --version
2
3aws-cli/1.18.11 Python/3.7.4 Darwin/19.3.0 botocore/1.15.11
AWS CLI のセットアップ
IAM ユーザーのプロファイルを設定
IAM ユーザーのアクセスキーを作成して、credentials-hogeuser.csv
をダウンロードします。通常 hogeuser は IAM ユーザー名が入ります。ダウンロードした CSV から Access key ID
と Secret access key
を控えます。
AWS CLI にユーザープロファイルを設定
1$ aws configure --profile hogeuser
2
3AWS Access Key ID [None]: *** # Access key ID が入ります
4AWS Secret Access Key [None]: *** # Secret access key が入ります
5Default region name [None]: ap-northeast-1 # IAMユーザーを作成したリージョン名が入ります
6Default output format [None]: json
AWS ではプロファイルを「設定の集合」と言う意味で扱うらいしいです、意味を理解するのに手間取る 💦
--profile
でユーザー名を指定することで、プロファイルに名前を付けています、今回は単純に hogeuser
としています。
適当なコマンドで接続確認
S3 のバケットを作成して、一覧を取得してみる
1$ aws --profile hogeuser s3 ls
2
32019-10-21 19:51:58 ***
42019-10-21 19:51:57 ***
既に AWS 上でバケットを作成している場合、それらの一覧が取得されるはずです。
エラーが出る場合は、IAM の S3 へのアクセス権限が許可されていない場合が考えられます。
おわりに
AWS CLI と言うより Pipenv の話になってしまいましたが、個人的には環境設定をなるべくテキスト・コード化したいと考えて、このような仕組みにしています。
まぁ、これが個人開発以外で適切に機能した試しはないような気がしますが、、、