Azure Cloud Shellを最強のAWS CLI環境にする

最近Azureも触りだしましたが、AWSにない便利な機能の一つに`Azure Cloud Shell`があります。

Azure Cloud Shellとは

> Azure Cloud Shell は、Azure リソースを管理するための、ブラウザーでアクセスできる対話形式の認証されたシェルです。 Bash または PowerShell どちらかのシェル エクスペリエンスを作業方法に合わせて柔軟に選択できます。

https://docs.microsoft.com/ja-jp/azure/cloud-shell/overview


[ブラウザ](https://shell.azure.com/)からちょっとしたコマンドが実行できるので便利ですね。また、[Windows ターミナル](https://www.microsoft.com/ja-jp/p/windows-terminal/9n0dx20hk701)やスマホアプリからも使用することができます。
Azure Cloud shellの環境にAWS CLIをインストールしてしまおうという作戦です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/556d8c66-a5b5-396a-9264-e8cae43a7447.png)

# Azure Cloud Shellの概要

公式サイトからの引用です

## 概念

> * Cloud Shell は、ユーザーごとにセッション単位で一時的に提供されるホスト上で実行されます。
> * Cloud Shell は、無操作状態で 20 分経過するとタイムアウトとなります。
> * Cloud Shell では、Azure ファイル共有がマウントされている必要があります
> * Cloud Shell では、Bash と PowerShell に対して同じ Azure ファイル共有が使用されます
> * Cloud Shell には、ユーザー アカウントごとに 1 台のマシンが割り当てられます。
> * Cloud Shell はファイル共有に保持されている 5 GB のイメージを使用して $HOME を永続化します
> * Bash では、標準の Linux ユーザーとしてアクセス許可が設定されます。

Bashが使え、5GBのファイル領域があり、$HOMEは永続化されるところがポイントです。

## 価格

> Cloud Shell のホストとなるマシンは無料です。ただし、前提条件として Azure Files 共有をマウントする必要があります。 ストレージのコストは通常どおりに適用されます。

月額約¥6.72/Giなので5G使っても月35円ぐらいです。


# AWS CLI V2のインストール

[Linux での AWS CLI バージョン 2 のインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux.html)を参考にしますが、ポイントは

* ホームディレクトリ内にインストールする

です。

```console
@Azure:~$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 31.9M  100 31.9M    0     0   102M      0 --:--:-- --:--:-- --:--:--  102M
@Azure:~$ unzip -q awscliv2.zip
@Azure:~$ ./aws/install -i ~/aws-cli -b ~/bin
You can now run: /home/xxxxxx/bin/aws --version
@Azure:~$ rm -rf aws
@Azure:~$ rm -rf awscliv2.zip
@Azure:~$
```

```console
@Azure:~$ ~/bin/aws --version
aws-cli/2.0.46 Python/3.7.3 Linux/4.15.0-1093-azure exe/x86_64.ubuntu.16
@Azure:~$
```

`~/bin`ディレクトリにパスが通るように、`.bashrc`に書いておきましょう

```console
@Azure:~$ echo 'export PATH=~/bin:$PATH' >> .bashrc
@Azure:~$
```

```console
@Azure:~$ source .bashrc
@Azure:~$ aws --version
aws-cli/2.0.46 Python/3.7.3 Linux/4.15.0-1093-azure exe/x86_64.ubuntu.16
@Azure:~$
```

これでインストールは完了です。

# 認証情報の設定

通常、AWSの認証情報は`~/.aws`に保管されますが、Azure Cloud Shellの説明に

> SSH キーなどのシークレットを格納するときは、ベスト プラクティスを使用します。 [Azure Key Vault などのサービスには、設定用のチュートリアルが用意されています。](https://docs.microsoft.com/ja-jp/azure/key-vault/key-vault-manage-with-cli2#prerequisites)

とありますので、これを使って認証情報を保存してみましょう。

## Key Vaultの作成と認証情報の登録

Key Vaultの作成
`cloud-shell-aws-cli`がKey Vaultの名称です。

```console
@Azure:~$ az keyvault create --name cloud-shell-aws-cli --resource-group [リソースグループ名] --location japaneast
```

AWS アクセスキーの登録

```console
@Azure:~$ az keyvault key create --vault-name cloud-shell-aws-cli --name aws-access-key-id --protection software
@Azure:~$ az keyvault secret set --vault-name cloud-shell-aws-cli --name aws-access-key-id --value [AWS アクセスキー]
```

シークレットキーの登録

```console
@Azure:~$ az keyvault key create --vault-name cloud-shell-aws-cli --name aws-secret-access-key --protection software
@Azure:~$ az keyvault secret set --vault-name cloud-shell-aws-cli --name aws-secret-access-key --value [シークレットキー]
```

AWS リージョンの登録（機密性はありませんが。。）

```console
@Azure:~$ az keyvault key create --vault-name cloud-shell-aws-cli --name aws-default-region --protection software
@Azure:~$ az keyvault secret set --vault-name cloud-shell-aws-cli --name aws-default-region --value ap-northeast-1
```

## Key Vaultに登録した値の取得

登録した値の取得は以下でできます。

```console
@Azure:~$ az keyvault secret show --vault-name cloud-shell-aws-cli --id https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-default-region
{
  "attributes": {
    "created": "2020-09-06T02:02:45+00:00",
    "enabled": true,
    "expires": null,
    "notBefore": null,
    "recoveryLevel": "Recoverable+Purgeable",
    "updated": "2020-09-06T02:02:45+00:00"
  },
  "contentType": null,
  "id": "https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-default-region/28db5ad04abf4a1a92d43f7ae9cccae8",
  "kid": null,
  "managed": null,
  "name": "aws-default-region",
  "tags": {
    "file-encoding": "utf-8"
  },
  "value": "ap-northeast-1"
}
@Azure:~$
```

このままだと扱いづらいので必要な値だけを取得します。

```console
@Azure:~$ az keyvault secret show --vault-name cloud-shell-aws-cli --id https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-default-region --output tsv --query "[value]"
ap-northeast-1
@Azure:~$
```

余談となりますが、`az keyvault secret show`のパラメーターで必要な`id`は`https://[Key Vault名].vault.azure.net/secrets/[Key名]`の書式ですが、以下のコマンドで取得することも可能です。

```console
@Azure:~$ az keyvault secret list --vault-name cloud-shell-aws-cli
[
  {
    "attributes": {
      "created": "2020-09-06T02:01:33+00:00",
      "enabled": true,
      "expires": null,
      "notBefore": null,
      "recoveryLevel": "Recoverable+Purgeable",
      "updated": "2020-09-06T02:01:33+00:00"
    },
    "contentType": null,
    "id": "https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-access-key-id",
    "managed": null,
    "name": "aws-access-key-id",
    "tags": {
      "file-encoding": "utf-8"
    }
  },
  {
    "attributes": {
      "created": "2020-09-06T02:02:45+00:00",
      "enabled": true,
      "expires": null,
      "notBefore": null,
      "recoveryLevel": "Recoverable+Purgeable",
      "updated": "2020-09-06T02:02:45+00:00"
    },
    "contentType": null,
    "id": "https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-default-region",
    "managed": null,
    "name": "aws-default-region",
    "tags": {
      "file-encoding": "utf-8"
    }
  },
  {
    "attributes": {
      "created": "2020-09-06T02:01:44+00:00",
      "enabled": true,
      "expires": null,
      "notBefore": null,
      "recoveryLevel": "Recoverable+Purgeable",
      "updated": "2020-09-06T02:01:44+00:00"
    },
    "contentType": null,
    "id": "https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-secret-access-key",
    "managed": null,
    "name": "aws-secret-access-key",
    "tags": {
      "file-encoding": "utf-8"
    }
  }
]
@Azure:~$
```

ここまでで認証情報をKey Vaultに登録及び取得ができました。

なのでこれも`.bashrc`に登録しちゃいましょう。

```console
@Azure:~$ echo 'export AWS_ACCESS_KEY_ID=`az keyvault secret show --vault-name cloud-shell-aws-cli --id https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-access-key-id --output tsv --query "[value]"`' >> .bashrc
@Azure:~$ echo 'export AWS_SECRET_ACCESS_KEY=`az keyvault secret show --vault-name cloud-shell-aws-cli --id https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-secret-access-key --output tsv --query "[value]"`' >> .bashrc
@Azure:~$ echo 'export AWS_DEFAULT_REGION=`az keyvault secret show --vault-name cloud-shell-aws-cli --id https://cloud-shell-aws-cli.vault.azure.net/secrets/aws-default-region --output tsv --query "[value]"`' >> .bashrc
@Azure:~$
```

```console
@Azure:~$ source .bashrc
@Azure:~$ 
```

# 動作確認

```console
@Azure:~$ aws sts get-caller-identity
{
    "UserId": "XXXXXXXXXXXXXXXXXXX",
    "Account": "999999999999",
    "Arn": "arn:aws:iam::999999999999:user/XXXXXXXXXX"
}
```

うまくいきました。