メインコンテンツまでスキップ

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

· 約7分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

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

Azure Cloud Shellとは

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

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

ブラウザからちょっとしたコマンドが実行できるので便利ですね。また、Windows ターミナルやスマホアプリからも使用することができます。 Azure Cloud shellの環境にAWS CLIをインストールしてしまおうという作戦です。

image.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 のインストールを参考にしますが、ポイントは

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

です。

@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:~$
@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に書いておきましょう

@Azure:~$ echo 'export PATH=~/bin:$PATH' >> .bashrc
@Azure:~$
@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 などのサービスには、設定用のチュートリアルが用意されています。

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

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

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

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

AWS アクセスキーの登録

@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 アクセスキー]

シークレットキーの登録

@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 リージョンの登録(機密性はありませんが。。)

@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に登録した値の取得

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

@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:~$

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

@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のパラメーターで必要なidhttps://[Key Vault名].vault.azure.net/secrets/[Key名]の書式ですが、以下のコマンドで取得することも可能です。

@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に登録しちゃいましょう。

@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:~$
@Azure:~$ source .bashrc
@Azure:~$

動作確認

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

うまくいきました。