Windows10 WSL(Ubuntu18.04)でawscliをインストールしてみた

最初のブログを書いてからだいぶ時間が経ちましたが、技術的なブログは1つだけ。
ブログは気が向いたら書けばいいと、すでに心の中で言い訳をしているごきげんまるです。

自分はWindows10にLinux(Ubuntu18.04)を入れて使っています。
Windows Subsystem for Linuxです。
ファイルシステムとかの制御はwindowsベースなのでいろいろと問題もあったりしますが、Vagrantなどを起動せずにLinuxが使えるのは便利ですね。

今回はそのUbuntuでawscliをインストールして使えるようにした話になります。

AWS CLIとは・・・

AWSCLIで構築したりすることができるツールです。CLIはそのままコマンドラインインターフェスの略ですね。
AWSは基本的にはコンソール画面からGUIでポチポチすればネットワークやサーバなどを構築できますが、それをコマンドでやれると何がいいかというと、Linuxなどのコマンドラインからスクリプトでいろんなことが自動で実行できるようになります。

今回、なぜAWSCLIを使うことになったかというと、お客様から、「AWS上で構築した環境が正しくパラメータが設定されているかの確認をやれるようにしてほしい。」というリクエストがあったからです。
table1個、EC2を1つ、S3のBucket1つというレベルであれば目視確認でいいのですが、作成しているのはtableで数十個という単位なので、目視確認は時間がかかる。。。
じゃあスクリプトで値を取ってきて、エクセルとかで比較できるようになれば簡単だねという話になり、実現するのに何を使おうかという中でAWSCLIならいけるんじゃね?ということで使うことにしてみました。
※terraformingも検討したのですが、一部の値がとってこれないことが机上の調査で分かったので、やめました。


じゃあ使おうとなった時に、いちいちAWS上にEC2をLinuxで構築してというは面倒。簡単に試しつつ使ってみたかったので、WSL上にあるUbuntuでやってみることに。

といっても、Ubuntuリポジトリにawscliの1.14があります。
なので、apt installとかapt updateをすればawscli1.14.44あたりが最新で入るはずです。

~$ apt search awscli
Sorting... Done
Full Text Search... Done
awscli/bionic 1.14.44-1ubuntu1 all
  Universal Command Line Environment for AWS


じゃあブログにならないじゃんという話なのですが、実はawscliの最新は1.16(2018/12/03現在)なので、Ubuntuリポジトリにあるのは古いバージョンです。
まぁ、リポジトリにあるのは古いバージョンというのはよくある話です。
1.14でももちろん使えるのですが、試していたところ1.14では使えないコマンドがあり、どうしてもそのコマンドが使いたいということで最新の1.16を入れることにしました。


Linux環境にpipをインストール

AWSのいいところ、それはだいたいの情報がAWSの公式サイトに上がっていることです。
LinuxにAWSCLIをインストールする方法もググれば上位にAWSの公式サイトの情報が出てきます。AWSがCloudで1番使われる理由もこの辺りがあるんだろうなぁ。と感心します。
たまにわかりづらいですが…。

docs.aws.amazon.com

これを見ながらやればいけるはず。
ということで、サイトに記載されている通りpythonの確認を実施。
Ubuntu18.04はPython3が入っています。

~$ python3 --version
Python 3.6.5

Python 3 バージョン 3.3以上が入っているので、Python3は問題なし。
ということで、pipのインストール確認を実施。

~$ which pip
~$

コマンドないなー。インストールされてないなーということで、pipのインストール実施。
pipのインストールはpypa.ioからスクリプトをダウンロードし、ダウンロードしたスクリプトを実行しPathを通せばOKとのこと。
楽勝っすね。
公式サイトにある通り、

~$ curl -O https://bootstrap.pypa.io/get-pip.py
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1622k  100 1622k    0     0   723k      0  0:00:02  0:00:02 --:--:--  723k
~$ python get-pip.py --user

Command 'python' not found, but can be installed with:

sudo apt install python3
sudo apt install python
sudo apt install python-minimal

You also have python3 installed, you can run 'python3' instead.

何も考えず、サイトにあったコマンドをそのまま実行したら怒られた。
まぁ、当たり前の話でPythonは3です。
なので、python3 get-pip.py --userにすればOK。

~$ python3 get-pip.py --user
Traceback (most recent call last):
  File "get-pip.py", line 20890, in <module>
    main()
  File "get-pip.py", line 197, in main
    bootstrap(tmpdir=tmpdir)
  File "get-pip.py", line 82, in bootstrap
    import pip._internal
  File "/tmp/tmp29c2waaw/pip.zip/pip/_internal/__init__.py", line 40, in <module>
  File "/tmp/tmp29c2waaw/pip.zip/pip/_internal/cli/autocompletion.py", line 8, in <module>
  File "/tmp/tmp29c2waaw/pip.zip/pip/_internal/cli/main_parser.py", line 8, in <module>
  File "/tmp/tmp29c2waaw/pip.zip/pip/_internal/cli/cmdoptions.py", line 17, in <module>
  File "/tmp/tmp29c2waaw/pip.zip/pip/_internal/locations.py", line 10, in <module>
ImportError: cannot import name 'sysconfig'

えっと。。。最後ImportErrorって書いてあるんすけど。。。
sysconfigがimportできないってことだけど、sysconfigはLinuxの標準ライブラリのはず。それがimport出来ないってことはここにあるはずの何かが足りないってことか。
と思ってググってみると、
Qiitaのブログで2018年5月からget-pip.pyを実行するとImportError: cannot import name 'sysconfig'が出るというブログを発見。
読ませていただいたところ、暫定的な解決策としてPPAを変えたらいけたということで、やってみることに。

~$ sudo add-apt-repository ppa:deadsnakes/ppa
~$ sudo apt-get update
~$ sudo apt-get install python3.6 python3.6-dev
~$ sudo python3.6 get-pip.py
Traceback (most recent call last):
  File "get-pip.py", line 20890, in <module>
    main()
  File "get-pip.py", line 197, in main
    bootstrap(tmpdir=tmpdir)
  File "get-pip.py", line 82, in bootstrap
    import pip._internal
  File "/tmp/tmpx467y94c/pip.zip/pip/_internal/__init__.py", line 40, in <module>
  File "/tmp/tmpx467y94c/pip.zip/pip/_internal/cli/autocompletion.py", line 8, in <module>
  File "/tmp/tmpx467y94c/pip.zip/pip/_internal/cli/main_parser.py", line 8, in <module>
  File "/tmp/tmpx467y94c/pip.zip/pip/_internal/cli/cmdoptions.py", line 17, in <module>
  File "/tmp/tmpx467y94c/pip.zip/pip/_internal/locations.py", line 10, in <module>
ImportError: cannot import name 'sysconfig'

ダメじゃああああああん orz。。
pipインストールできない。詰んだ。
※このブログを書いているときに分かったのですが、pypaのGitサイトでIssueが出ていて、そこを見れば簡単に解決出来たのですが、only英語であったのと、この時は英語読みたくない病が発病していた為、ちゃんと読まなかったのです…。

仕事で入れているんでなければここで諦めてSplatoon2でも始めるのですが、仕事でAWSCLIが必要であったことから、諦めたいけど諦めずに考えることに。
上で試したのは結局python3を入れなおすことで、今やりたいのはpipを入れること。
pipかぁ、pypa.io以外にpipのインストールスクリプトが置いてあるサイトはないのかな。
インストールスクリプト、、、
ん、インストールか。ダメもとでUbuntuリポジトリで探してみるかなぁ。

~$ apt search pip
~~大量出力~~

見るのメンドイ…。
そういえばUbuntuはコマンドうってみて無かった時にaptで入れろとか出るなぁ。

~$ pip --version

Command 'pip' not found, but can be installed with:

sudo apt install python-pip

(゚∀゚)キタコレ!!
Ubuntuリポジトリにpipあるやん!!!

ちょっと待てよ。pythonって書いてあるな。
python3も欲しいな。。。無いかなぁ。

~$ apt search python3-pip
Sorting... Done
Full Text Search... Done
python3-pip/bionic-updates 9.0.1-2.3~ubuntu1 all
  Python package installer


(゚∀゚)キタコレ!!
python3もあるじゃん!
両方インストールしてしまおう。

~$ sudo apt install python-pip python3-pip
~$ which pip
/usr/bin/pip
~$ which pip3
/usr/bin/pip3
pip --version
pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)
~$ pip3 --version
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)

ということでようやっとAWSCLIインストールに必要となるpipのインストールが完了しました。
無駄に時間喰ったなぁ。。。

Linux環境にAWSCLIをインストール

ようやく本命のAWSCLIのインストールです。
pipを使ってインストール。

~$ pip install awscli --upgrade --user
Collecting awscli
~~中略~~
Successfully installed PyYAML-3.13 awscli-1.16.67 botocore-1.12.61 colorama-0.3.9 docutils-0.14 futures-3.2.0 jmespath-0.9.3 pyasn1-0.4.4 python-dateutil-2.7.5 rsa-3.4.2 s3transfer-0.1.13 six-1.11.0 urllib3-1.24.1

Successfully installedでawscli-1.16.71が出ているので、無事成功。
AWSCLIは簡単に入ったわー。よかったー。
コマンドを実行出来るか確認。

~$ aws --version

Command 'aws' not found, but can be installed with:

sudo apt install awscli

ちょwwwwwww
コマンド見当たらないとか出てるんですけどおおお

冷静にサイトを見ると、AWSCLI実行ファイルのパスを追加しないといけないらしい。

~$ export PATH=~/.local/bin:$PATH
~$ aws --version
aws-cli/1.16.67 Python/2.7.15rc1 Linux/4.4.0-17134-Microsoft botocore/1.12.57
~$ source .profile
~$ cat .profile
~~中略~~
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

無事インストール完了しました。
ちなみにですが、インストールを実施した12/3頃はバージョンが1.16.67でしたが、今日(12/7)確認してみたら1.16.71になっていました。
AWS関連はupdateが早くて多い。。。