aliyuncli を使ってAlibaba Cloudを操作してみた

## 概要

最近のいくつかのニュースの通り、中国でNo1シャアを持つAlibaba Cloudは日本に登場しました。UI画面では試す方も多いと思いますが、デベロッパーであればコマンドラインツールを使いたがるのでしょう。

Alibaba Cloudを操作するためのコマンドラインツールは [aliyuncli](https://pypi.python.org/pypi/aliyuncli/2.1.4) というpython cliツールがあります。最新のバージョンは2.1.4のようです。現在このツールが対応しているAlibaba Cloudリソースは以下となっています。

<table>
<thead>
 <tr>
   <td>Product</td>
   <td>SDK</td>
 </tr>
</thead>
<tbody>
  <tr>
   <td>BatchCompute</td>
   <td>aliyun-python-sdk-batchcompute</td>
  </tr>
  <tr>
   <td>Bsn</td>
   <td>aliyun-python-sdk-bsn</td>
  </tr>
  <tr>
   <td>Bss</td>
   <td>aliyun-python-sdk-bss</td>
  </tr>
  <tr>
   <td>Cms</td>
   <td>aliyun-python-sdk-cms</td>
  </tr>
  <tr>
   <td>Crm</td>
   <td>aliyun-python-sdk-crm</td>
  </tr>
  <tr>
   <td>Drds</td>
   <td>aliyun-python-sdk-drds</td>
  </tr>
  <tr>
   <td>Ecs</td>
   <td>aliyun-python-sdk-ecs</td>
  </tr>
  <tr>
   <td>Ess</td>
   <td>aliyun-python-sdk-ess</td>
  </tr>
  <tr>
   <td>Ft</td>
   <td>aliyun-python-sdk-ft</td>
  </tr>
  <tr>
   <td>Ocs</td>
   <td>aliyun-python-sdk-ocs</td>
  </tr>
  <tr>
   <td>Oms</td>
   <td>aliyun-python-sdk-oms</td>
  </tr>
  <tr>
   <td>OssAdmin</td>
   <td>aliyun-python-sdk-ossadmin</td>
  </tr>
  <tr>
   <td>Ram</td>
   <td>aliyun-python-sdk-ram</td>
  </tr>
  <tr>
   <td>Ocs</td>
   <td>aliyun-python-sdk-ocs</td>
  </tr>
  <tr>
   <td>Rds</td>
   <td>aliyun-python-sdk-rds</td>
  </tr>
  <tr>
   <td>Risk</td>
   <td>aliyun-python-sdk-risk</td>
  </tr>
  <tr>
   <td>R-kvstore</td>
   <td>aliyun-python-r-kvstore</td>
  </tr>
  <tr>
   <td>Slb</td>
   <td>aliyun-python-sdk-slb</td>
  </tr>
  <tr>
   <td>Ubsms</td>
   <td>aliyun-python-sdk-ubsms</td>
  </tr>
  <tr>
   <td>Yundun</td>
   <td>aliyun-python-sdk-yundun</td>
  </tr>
</tbody>
</table>

`Aliyuncli`コマンドラインを使って、Alibaba Cloudリソースを操作してみたいと思います。そして、日本リージョンに展開していないリソースを含むため、日本リージョンに使用可能なリソースだけ試します。

## Dockerファイル

Aliyuncli は python コマンドラインツールなので、pythonパッケージをインストールしなければなりません。ちょっと試したいなら、 `virtualenv` などを使用してもよいでしょうが、最近`docker`が流行っていそうなので、`docker`で試したいと思います。

そして、`DockerFile`を準備しました

```
# cd #directory_have_this_file
# docker build .
# docker images 
# ...
# aliyun                latest              adb983972e8d        2 months ago        220 MB
# ...
# docker run -it aliyun /bin/bash
# aliyuncli configure
# ....
# aliyuncli ecs 
# ....

FROM centos
MAINTAINER Bui Hong Ha

LABEL Install python-pip
RUN curl 'https://bootstrap.pypa.io/get-pip.py' -o 'get-pip.py'
RUN python get-pip.py

LABEL Install aliyuncli
RUN pip install aliyuncli
RUN pip install aliyun-python-sdk-slb aliyun-python-sdk-ecs aliyun-python-sdk-rds aliyun-python-sdk-oss aliyun-python-sdk-r-kvstore

LABEL Installing jq
RUN curl -L https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 -o /bin/jq
RUN chmod +x /bin/jq

LABEL Setup Locale
RUN echo "export LANG=\"en_US.UTF-8\"" >> ~/.bashrc
```

## コマンドを実行してみる

ステップ毎に書きたいと思います。

### ステップ 1: Dockerイメージを作成する

`DockerFile`を基づいて、Docker imageを作ります。`Docker file`を保存するところへ移動し、`docker build` でイメージを作成します。

```
$ cd docker-file-あるところ
$ ls
total 8
-rw-r--r--  1 user  staff   564B Oct 21 14:06 Dockerfile
$ docker build --tag aliyuncli .
Sending build context to Docker daemon  2.56 kB
Step 1/13 : FROM centos
latest: Pulling from library/centos
93857f76ae30: Pull complete
Digest: sha256:4eda692c08e0a065ae91d74e82fff4af3da307b4341ad61fa61771cc4659af60
Status: Downloaded newer image for centos:latest
 ---> a8493f5f50ff
Step 2/13 : MAINTAINER Bui Hong Ha
 ---> Running in ...
...
```

出来上がるまで5分ぐらいかかるので、その間にコーヒを入れていきます。


### ステップ 2: コンテナを作成

ビルドが問題なく実行完了したら、イメージが出来上がります。`docker images`で以下のイメージが表示されたらOK!

```
$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED              SIZE
aliyuncli             latest              2c78aa25abe5        About a minute ago   217 MB
```

これで、コンテナを起動します。コマンドラインツールを使いたいため、起動時に `interactive`をつけて実行します。実行が成功したら、コンテナのコマンド入力に入ります。以下のとおりに表示したら、問題がなくインストール実行できてます

```
docker run -it aliyuncli /bin/bash
[root@30c2625926e7 /]#
[root@30c2625926e7 /]#
[root@30c2625926e7 /]# aliyuncli
usage: aliyuncli <command> <operation> [options and parameters]
<aliyuncli> the valid command as follows:

ecs                                      	| oss
r-kvstore                                	| rds
slb
```

### ステップ 3: Alibabaアカウントアクセスキー設定

アクセスキーを取得するところは、ログイン直後のホームメニューの「AccessKeys」メニューになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/74420/c191c577-95f9-4ae6-8a71-ff19f243a625.png)

「AccessKeys」をクリックすると、アクセスキーを取得する画面へ移動し、以下のような画面が表示されます。「AccessKeyの管理続ける」ボタンを押しますと、アクセスキーとsecretsを取得できます

![image](https://qiita-image-store.s3.amazonaws.com/0/74420/a02bc273-f346-2340-222b-6f15a03b3429.png)

この画面で、アクセスキーの①とアクセスキーの秘密鍵をコピーできます。

![image](https://qiita-image-store.s3.amazonaws.com/0/74420/f3ce75b1-102c-3978-e016-61b118d9a355.png)

①、②をコピーし、コマンドラインを戻って、以下のどおりに`configure`を行います

```
[root@30c2625926e7 /]# aliyuncli configure
Aliyun Access Key ID [None]: ①でコピーしたアクセスキー
Aliyun Access Key Secret [None]: ②でコピーしたアクセスキーの鍵
Default Region Id [None]: ap-northeast-1
Default output format [None]:
```
日本リージョンのIDは 【ap-northease-1】となります。デフォルトリージョンをNoneにする場合は【cn-hangzhou】となります。
Apiの出力結果は【None】にする場合、テーブルと表示されます。出力形式はテーブルとJson形式とサポートされます。

### ステップ 4: ひたすらコマンドラインを試す

準備はステップ3までに終わったら完了します。次に、いくつかのコマンドラインを試したいと思います

##### 1. ECSインスタンスを取得する

いくつかのECS情報を抽出する

```
$ aliyuncli ecs DescribeInstances | jq ".Instances.Instance[] | {name: .InstanceName, region: .RegionId, family: .InstanceTypeFamily, cpu: .Cpu, memory: .Memory}"

{
  "name": "instance1",
  "region": "ap-northeast-1",
  "family": "ecs.n4",
  "cpu": 1,
  "memory": 2048
}
{
  "name": "instance2",
  "region": "ap-northeast-1",
  "family": "ecs.n4",
  "cpu": 2,
  "memory": 2048
}
...
```

##### 2. ECSインスタンスを停止する

コマンドラインでECSインスタンスを停止してみます

```
$ aliyuncli ecs StopInstance --InstanceId i-6wehmzs9b5uv14a1mmud
{
    "RequestId": "9A05F358-56A8-4D8E-B5AD-37D2F3CB215D"
}
```

上記のコマンドを実行すると、コンソール画面UI側で暫く待つと「停止済み」の状態に遷移します。
![image](https://qiita-image-store.s3.amazonaws.com/0/74420/d79fd005-55f7-61e0-c272-0701b1d5d834.png)

##### 3. ECSインスタンスを起動する

2で停止したインスタンスを起動してみます。

```
$ aliyuncli ecs StartInstance --InstanceId i-6wehmzs9b5uv14a1mmud
{
    "RequestId": "99FD381B-EE3C-4DC1-B619-56671822986D"
}
```

![image](https://qiita-image-store.s3.amazonaws.com/0/74420/91eff50e-0872-fa01-a668-ad015cbec362.png)

コマンドを実行し暫く待つと、インスタンスの状態が「実行中」となります。

##### 4. OSSをaliyuncli操作してみる

準備ステップで設定した `configure`はアクセスキーの準備だけです。aliyuncliを使ってOSS操作したい場合、別途で`aliyuncli oss Config` を実行し設定しないといけません。

```
$ aliyuncli oss Config --host oss-ap-northeast-1.aliyuncs.com --accessid [AccessId] --accesskey [AccessKey]
Your configuration is saved into /root/.aliyuncli/osscredentials .
```

OSS設定が完了すれば、`aliyun oss` で実行可能なコマンドを参照できます。

```
[root@30c2625926e7 /]# aliyuncli oss GetAllBuckets
unsupported command : GetAllBuckets
The valid command as follows::
    GetAllBucket
    CreateBucket              oss://bucket --acl [acl]
    DeleteBucket              oss://bucket
    DeleteWholeBucket         oss://bucket
    GetBucketLocation         oss://bucket
    PutBucketCors             oss://bucket localfile
    GetBucketCors             oss://bucket
    DeleteBucketCors          oss://bucket
...
```

Bucketを取得してみます

```
[root@30c2625926e7 /]# aliyuncli oss GetAllBucket
CreateTime           BucketLocation       BucketName
2017-01-24 07:59:13  oss-ap-northeast-1   testbucket111
2017-04-07 07:37:47  oss-cn-qingdao       testbucket222

Bucket Number is: 2
1.551(s) elapsed
```

## 結論

Alibaba CloudはGUIコンソール画面だけではなく、充実なCLIツールをサポートしています。Dockerを使うと、簡単にAliyuncli 実行できる環境が作れて試すことができます。Aliyuncliを使えば、いくつかのクラウドリソースの操作を自動化できます。

いくつかの簡単なコマンドを紹介しました。より詳細なコマンドを試したい人は[ドキュメント](https://jp.aliyun.com/help/product/29991.htm?spm=a3c0i.mja.a1.18.waw7y0)を参照できます。後は実際にコマンドを試して打って結果を見るのは大事ですね。