AWS CLI v2をsudoを使わずにインストールする

# 忙しい方へ

インストール先はrootユーザのディレクトリなので、そうじゃないディレクトリに置いてパスを通すことができるよ、というだけです。
これで何をやってるかわかるのであれば以後は読まなくていいかもｗ

※追記
brewでawscliをインストールするとv2が入るようになってました。
https://formulae.brew.sh/formula/awscli
v1は明示的にv1を指定すれば多分入れられます
https://formulae.brew.sh/formula/awscli@1

後述の通りv1とv2は一部互換性がないそうなので、これからbrewでインストールする場合は注意しましょう。

# 本題

今週、AWS CLIのV2がGAになりました。
[AWSのブログ](https://aws.amazon.com/jp/blogs/news/aws-cli-v2-is-now-generally-available/)
[クラスメソッドさんのブログ](https://dev.classmethod.jp/cloud/aws/aws-cli-v2-is-now-generally-available/)


個人的にはまだ全然試せてないのでこれからなんですが、使うには**まずはインストールしなければいけない**ですよね。
[インストールの方法](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html)は公式に載っています。
自分の環境は仕事でも個人でもMacなのですが、もともとcliはbrewでインストールしてました。
何かしらのパッケージマネージャによって管理される状態にしておきたかったからですね。

なのでできたらbrewで行きたかったんですが、これを書いている時点ではまだbrewではインストールできません。
（なので、brewでインストールできるようになったらこの内容は不要かもしれません。）

インストールの手順を抜粋すると下記です。
Macでのインストール手順ですが、対象のファイルが変わるだけでLinuxでの手順もほぼ同様です。

```shell:Macでのインストール手順
curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-macos.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```

問題なのは`sudo ./aws/install`で、仕事用のPCのユーザでは管理者権限を制限されていてsudoできない、なんてことがあるかと思います。
そうしたらせっかく試そうと思ったのに試せないじゃん、となっちゃいますが、回避する方法がきちんとドキュメントに書いてあるのでここに残しておきます。

# インストールスクリプトの中身

`./aws/install`の中身は全部抜粋すると長くなるので割愛しますが、ざっくりいうと`/usr/local/aws-cli`というディレクトリを作ってその中に動作させるプログラムを配置し、`/usr/local/bin/aws2`というシンボリックリンクを作成する、という動作をするようです。
sudoさせられるのは、通常`/usr`以下に書き込むにはroot権限が必要な状態になっているからかと思います。
`/usr/loca/bin`にシンボリックリンクを置くのはPATHが通っているディレクトリにシンボリックリンクを置いてどこからでも使えるようにするためでしょう。
（記憶が曖昧なんですが、そもそもデフォルトでPATH通ってましたっけ…？）

※そもそもこのディレクトリなんなのみたいな話は話が逸れるので参考サイトを置いておきます
https://linuc.org/study/knowledge/544/

ただ、インストール先のディレクトリとシンボリックリンクを置くディレクトリは変更することができる、と書いてあります。

以下ドキュメントから抜粋

> --install-dir または -i
> 
このオプションは、すべてのファイルをコピーするフォルダを指定します。次の例では、/usr/local/aws-cli という名前のフォルダにファイルをインストールします。このフォルダを作成するには、/usr/local への書き込み権限が必要です。
> 
デフォルト値は /usr/local/aws-cli です。
>
--bin-dir または -b
>
このオプションは、インストールフォルダ内のメイン aws プログラムが、指定されたパス内のファイル aws2 にシンボリックリンクされるように指定します。この例では、シンボリックリンク /usr/local/bin/aws2 を作成します。指定したフォルダへの書き込み権限が必要です。パスにすでに存在するフォルダへのシンボリックリンクを作成すると、インストールディレクトリをユーザーの $PATH 変数に追加する必要がなくなります。
>
デフォルト値は /usr/local/bin です。

つまり、**適当なディレクトリにファイルを置いて、自分でPATHを通した任意のディレクトリにシンボリックリンクを配置する**ことでsudoを使わないでインストールすることができます。

# インストール先ディレクトリを変える

自分の場合は使っているユーザのホームディレクトリ配下に下記のようなディレクトリを作りました。

## ディレクトリを作成し、PATHを通す

```shell
mkdir $HOME/awscli2
mkdir $HOME/local/bin
```

もちろん`$HOME/local/bin`にはPATHを通してあります。

Bashの場合は`~/.bash_profile`に

```shell:.bash_profile
export PATH=$PATH:$HOME/local/bin
```

を追記して`.bash_profile`を読み込み直しましょう。
`source ~/.bash_profile`を実行するか、ターミナルを立ち上げ直せばOKです。

自分はfishを使っているのでユニバーサル変数に追加しています。
fishの環境変数の設定の仕方はbashとはちょっと違ってやや混乱するので注意。
`.fish/config/config.fish`に環境変数を設定するコマンドを追記するのでもいいと思います（お好みで）
ただ、下記は永続的な設定なので`.fish/config/config.fish`のではなくターミナルで一回実行するだけにしましょう。
$fish_user_pathsの中身が間違って空になったりすると後で面倒なことになります（1敗）
参考
https://qiita.com/ledsun/items/8ca1a450b21c8ebc9670

```shell:fish
set -U fish_user_paths $HOME/local/bin $fish_user_paths
```

## オプション指定してインストールする

その上で、インストール時にこんな感じでオプション指定しました。
※環境変数でホームディレクトリ指定してますが、実際にはフルパス指定しています。

```shell
./aws/install -i $HOME/awscli2/ -b ＄HOME/local/bin/
```

これで実行できるようになります、なお、現在はv1との併用のため`aws2`という名前でシンボリックリンクが作られます。

```shell
aws2 --version
aws-cli/2.0.0dev4 Python/3.7.4 Darwin/18.7.0 botocore/2.0.0dev3
```

ドキュメントより

>AWS CLI バージョン 2 のプレビューリリースでは、AWS CLI バージョン 1 とバージョン 2 がサイドバイサイドで共存できるよう、シンボリックリンクに aws2 という名前が付けられます。AWS CLI バージョン 2 の今後のリリースでは、このコマンド名が変更される可能性があります。


ともあれ、これでV2になったaws cliを試すことができるようになりました。

# 気になるポイント

- あくまでも**手動インストール**なのでアップデートがあったら自分でやらなきゃいけないこと
- 一部下位互換性のない変更がある
    - https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cliv2-migration.html

# 関連
[venvを使ってAWS CLI（v1）とAWS CLI v2を使い分ける（Mac, Linux編）](https://dev.classmethod.jp/cloud/aws/separate-aws-cli-v1-and-v2-with-venv-for-mac-and-linux/)
[AWS CLI v2をソースコードからインストールする](https://dev.classmethod.jp/cloud/aws/install-aws-cli-v2-from-sourcecode/)