Docker コンテナを使って Alibaba Cloud CLI を動かす

Pocket

最近 Alibaba Cloud を使用するようになりました。アリババ・クラウドも、他のクラウドサービスと同じようにコマンドラインからクラウドリソースを参照・操作する CLI が提供されています。

今回は Alibaba Cloud CLI の Python 版を、Docker コンテナで動かせるようにしてみます。

Alibaba Cloud CLI は2種類ある

Alibaba Cloud CLI は、Python 製の旧バージョンと、Go 言語製の新バージョンがあるようです。Python 版は aliyuncli 、Go 版は aliyun というコマンド名になっているので、巷の文献を読む際はコマンド名で見極められます。

Go 言語製の方が開発が続けられていますが、現状そこまでの機能差はないようなので、今回は Docker イメージが用意されている Python 版を使っています。

「Aliyun」の「yun」は「雲」の意で、「アリクラ」ってことみたいですね。

Docker コンテナでコマンドを用意する理由

ところで、そもそもなぜ CLI ツールを直接ホストマシンにインストールせず、Docker コンテナで用意するのか、私が思う利点を挙げておきます。

1. Docker 以外の依存モジュールを用意しなくて済む

ひとつは、Docker さえ入れておけば、ホストマシンに余計なものをインストールしなくて済む手軽さです。特に Python や Node.js ベースのツールは、ホストマシンにインストールされているランタイムのバージョンが影響したりするので、余計なトラブルを避けるためにはコンテナに閉じた環境がありがたいのです。

開発マシンを複数台使用していたり、新しいマシンと交換することになった場合も、Docker さえインストールしなおせばすぐに同様の環境を再現できるのも利点です。

2. アカウントや環境を切り替えやすい

開発環境と本番環境とでアカウントを複数用意していたり、複数の案件を並行して担当していたりすると、CLI に仕込むプロファイルが複数登場します。普通に CLI をインストールして使っていると、プロファイルの切り替えを忘れて「開発環境のつもりでうっかり本番環境を触っていた」といった事故に繋がる恐れがあります。

私は事故防止のため、Kubernetes CLI (kubectl) の場合は、デフォルトの KubeConfig を用意せず、必ず export KUBECONFIG でプロファイルを指定してからでないとコマンドが実行できないようにしています。ターミナルタブを閉じるとプロファイル指定も消えてしまうので、都度 export する手間はかかりますが、あえて手間をかける仕組みにしておくことで、間違えて他の環境を触ってしまうリスクが減らせます。

以前、Oracle Cloud の CLI を Docker コンテナで用意する拙記事を公開しましたが (OCI CLI と PSM CLI を Docker コンテナで構築する
)、これも同じ考えから始めたことでした。記事の中では分かりやすくするため、Docker イメージ名も Bash 関数名も oci に統一することで、普通の oci コマンドのように使ってみせていましたが、実際はアカウント別の名前を付けて、 oci-dev とか oci-prod とかいうコマンド (関数) 名で実行できるようにしたりしていました。

今回紹介する Alibaba Cloud CLI でも、アカウントをまたいだ作業を見越して、リスク回避のために Docker コンテナで環境を分離したいと思います。

Alibaba Cloud で Access Key を発行する

Docker コンテナを用意するまえに、CLI のセットアップに必要な Access Key を生成します。

Alibaba Cloud コンソールホームにログインしたら、画面右上のユーザアイコンを押下し、「アクセスキー管理」を選択します。RAM (Resource Access Management) コンソールの「AccessKey 管理」画面が開いたら、「AccessKey の作成」ボタンを押下します。

すると「AccessKey ID」と「AccessKey Secret」の文字列がダイアログ表示されるので、これを控えておきます。AccessKey Secret はダイアログを閉じると二度と確認できなくなるので注意してください。

Alibaba Cloud CLI の Docker コンテナを用意する

Access Key ID と Access Key Secret が用意できたら、いよいよ Alibaba Cloud CLI の Docker コンテナを準備していきます。

使用するのは以下の Docker イメージです。

順にコマンドを実行していきます。

# イメージを Pull し Docker コンテナをバックグラウンドに起動しておく
$ docker run -dit --name my-aliyuncli aliyunca/aliyuncli-python-toolbox:latest

# バックグラウンド起動しているコンテナのシェルにログインする
$ docker exec -it my-aliyuncli sh

# 初回セットアップのコマンドを実行する
$$ aliyuncli configure
Aliyun Access Key ID []: 【Access Key ID を入力する】
Aliyun Access Key Secret []: 【Access Key Secret を入力する】
Default Region Id []: 【よく使うリージョン ID を入力する】
Default output format []: json

# 以下のディレクトリに各種設定ファイルが生成されていることを確認する
$$ ls /root/.aliyuncli/
configure       credentials     oascredentials  osscredentials

リージョン ID は以下で確認できます。東京リージョンは ap-northeast-1 です。

$ aliyuncli configure コマンドで生成された4つのファイルを見てみます。

$$ cat /root/.aliyuncli/configure 
[default]
output = json
region = ap-northeast-1

$$ cat /root/.aliyuncli/credentials 
[default]
aliyun_access_key_secret = 【Access Key Secret】
aliyun_access_key_id = 【Access Key ID】

$$ cat /root/.aliyuncli/oascredentials 
[OASCredentials]
accesskey = 【Access Key Secret】
accessid = 【Access Key ID】

$$ cat /root/.aliyuncli/osscredentials 
[OSSCredentials]
accesskey = 【Access Key Secret】
accessid = 【Access Key ID】

一つはリージョンと出力形式のデフォルトが書かれており、残り3つのファイルは Access Key のペアが書かれていますね。

これらをホストマシン側で用意して、以下のようにボリュームマウントしてコンテナを起動しておけば、 $ aliyuncli configure コマンドによる初期設定を省略できます。

$ docker run -dit -v "${HOME}/.aliyuncli:/root/.aliyuncli" --name my-aliyuncli aliyunca/aliyuncli-python-toolbox:latest

Bash 関数を定義する

さて、毎回 docker exec コマンドを叩くのは面倒なので、次のような Bash 関数を定義しておきます。

function aliyuncli() {
  docker exec -it my-aliyuncli aliyuncli "$@"
}

これで

$ docker exec -it my-aliyuncli aliyuncli ecs DescribeInstances

というように入力しないといけなかったところが、

$ aliyuncli ecs DescribeInstances

というように、通常の aliyuncli コマンドと同じ感覚で使えるようになりました。

Alibaba Cloud CLI で ECS を起動・停止してみる

それでは実際にコマンドを使って、Alibaba Cloud の IaaS である ECS の起動と停止を試してみます。

はじめに ECS の一覧を取得し、Instance ID を確認します。

$ aliyuncli ecs DescribeInstances

結果は JSON なので jq コマンドでパースしてみます。ただし、 docker exec の結果を直接 jq にパイプで渡すと、インデントが崩れて出力されてしまったため、moreutils に含まれる sponge コマンドを併用して対処しています。もしくは、docker exec-t オプションを外すことでも対処できます。

# Alibaba Cloud CLI の結果を jq でパースし、インスタンス ID の一覧を出力する
$ aliyuncli ecs DescribeInstances | sponge | jq -r '.Instances.Instance[].InstanceId'

# 出力例
i-6we8xxxxxxxxxxxxxxxx
i-6we8yyyyyyyyyyyyyyyy
i-6we8zzzzzzzzzzzzzzzz

インスタンス ID が確認できたら、以下のようなコマンドで起動します。

$ aliyuncli ecs StartInstance --InstanceId 'i-6we8xxxxxxxxxxxxxxxx'
{
    "RequestId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}

インスタンスが起動しているかどうかは先程の DescribeInstances コマンドで確認します。対象の ECS に接続したい場合は、Public IP も確認しておくと良いでしょう。

$ aliyuncli ecs DescribeInstances --InstanceIds '["i-6we8xxxxxxxxxxxxxxxx"]' | sponge | jq -r '.Instances.Instance[0] | .InstanceId + " [" + .Status + "] : " + .PublicIpAddress.IpAddress[]'

# 出力例
i-6we8xxxxxxxxxxxxxxxx [Running] : 47.1.1.1

Public IP が分かったので、これで SSH 接続などもできますね。

インスタンスの停止は次のように行えます。

$ aliyuncli ecs StopInstance --InstanceId 'i-6we8xxxxxxxxxxxxxxxx'
{
    "RequestId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}

まとめ

Alibaba Cloud CLI はコマンドのオプションに大文字が登場し、それがケースセンシティブなところが特徴的というか、少々慣れないところでしょうか…。

このように細かなところに独特の癖が見えますが、他のクラウドサービスでも出来ることはきちんと追随していますので、CLI も駆使して便利に使いこなしていきたいですね。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です