Alibaba Cloud SDK For Python で ECS を操作してみる

# はじめに
この記事は [Alibaba Cloud](https://www.alibabacloud.com) で提供する SDK for Python の導入から簡単な ECS 操作までの説明になります。
Alibaba Cloud とは中国で巨大なECサイトを運営するアリババグループと日本のソフトバンクが手を組んで提供しているクラウドサービスです。

# この記事の対象読者
- Alibaba Cloud 利用ユーザ or 興味がある人
- 運用を自動化したい人
- Python 開発者 or 興味がある人

# 実行環境
- Alibaba アカウント作成済み
- Alibaba Cloud Elastic Compute Service(ECS) 作成済み
- CentOS Linux release 7.4
- Python 2.7.5

# やってみる
## Access Key 作成
SDK の実行には Access Key が必要です。
作成するために画面上部のAccessKeysをクリックしましょう。

<img width="1159" alt="1.AccessKey.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/fcf5e99a-8d50-3ab3-775c-03c1d90aca37.png">

最初に作成したメインアカウントで操作した場合、以下のようなポップアップが表示されます。

<img width="599" alt="2.RAMUser.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/1c4f2b0a-e24c-f99c-33c0-294509163d29.png">

メインアカウントの Access Key は全ての API 操作権限を持ちます。
セキュリティリスク回避のため、スクリプトに利用するユーザには必要な権限のみ持たせましょう。
そのためには RAM ユーザの利用が必要です。

### Resource Access Management(RAM) とは?
特定のリソース、権限を絞ったユーザを作成する機能です。AWS/GCP でいうところの IAM ですね。
詳細は[こちらのページ](https://jp.alibabacloud.com/product/ram) を参照してください。

<img width="676" alt="3.RAMUserDescription.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/5eba17c5-4ca2-155d-77ea-af709e737f94.png">

RAM サービスを有効化後、画面右上の新規ユーザをクリックします。

<img width="1428" alt="4.UserCreate.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/5bca5a52-0e6a-4c87-dc09-1c5fb6736c4d.png">

ログイン名を入力し、"このユーザの Access Key を自動生成"にチェックをつけて OK を押下します。
アカウント作成成功と共に Access Key がダウンロード出来ます。

<img width="599" alt="5.UserCreate2.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/a1fa6703-0b05-696c-9f47-6c669e527b17.png">

作成したユーザ名をクリックし、ユーザの管理画面を開きます。

<img width="1423" alt="6.UserCreated.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/eb1438b9-26cf-3b10-3e10-2a6d25a180ec.png">

### 権限の付与
今回作成するスクリプトは ECS が対象となります。
AliyunECSFullAccess の権限を付与しましょう。

<img width="1246" alt="7.Auth.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/e1edeb1d-014d-fa83-0ef2-9ce80cbf3dba.png">

<img width="748" alt="8.AuthAdd.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/00fd3079-f80d-97c0-d60f-62847a566140.png">

<font color="Red">**作成した Access Key は Web 上のページや git へアップロードをしないように注意しましょう。不正利用される可能性があります。**</font>

## SDK の導入
今回の実行環境は Alibaba Cloud 上に作成した ECS になります。
OS は CentOS7.4 を利用。Python 2.7,pip インストール済みの環境です。
SDK は pip で簡単にインストール出来ます。

```
# Install the core library
sudo pip install aliyun-python-sdk-core

# Install the ECS management library
sudo pip install aliyun-python-sdk-ecs
```


では、実際にコードを記載していきましょう。
まずは必要なモジュールを import します。

```
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526 import DescribeInstancesRequest
from aliyunsdkecs.request.v20140526 import CreateInstanceRequest
from aliyunsdkecs.request.v20140526 import StartInstanceRequest
from aliyunsdkecs.request.v20140526 import StopInstanceRequest
```

ASClient を初期化します。
access-key-id と access-key-secret はダウンロードした Access Key の値を入力してください。
region-id については[このページ](https://jp.alibabacloud.com/help/doc-detail/40654.htm)を参照してください。
例えば、日本リージョンなら ap-northeast-1 を記載します。

```
client = AcsClient(
  "<access-key-id>",
  "<access-key-secret>",
  "<region-id>"
);
```

リクエストを初期化し、パラメータをセットします。

```
#  Initialize a request and set parameters
request = DescribeInstancesRequest.DescribeInstancesRequest()
request.set_PageSize(10)
```

リクエストを投げ、実行結果を整形して表示させます。

```
import json
from pprint import pprint

# Print response
response = client.do_action_with_exception(request)
pprint(json.loads(response))
```

以下、実際に作成したコードとその実行結果です。

## インスタンスの情報取得
### サンプルコード

```
#!/usr/bin/env python
# -*- coding: utf8 -*-

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526 import DescribeInstancesRequest

import json
from pprint import pprint

# Initialize AcsClient instance
client = AcsClient(
  "<access-key-id>", 
  "<access-key-secret>",
  "<region-id>"
);

# Initialize a request and set parameters
request = DescribeInstancesRequest.DescribeInstancesRequest()
request.set_PageSize(10)

# Print response
response = client.do_action_with_exception(request)
pprint(json.loads(response))
```

### 実行結果
インスタンスの各種情報が取得出来ました。

```
{u'Instances': {u'Instance': [{u'AutoReleaseTime': u'',
                               u'ClusterId': u'',
                               u'Cpu': 1,
                               u'CreationTime': u'2018-05-12T14:29Z',
                               u'DedicatedHostAttribute': {u'DedicatedHostId': u'',
                                                           u'DedicatedHostName': u''},
                               u'Description': u'ECS Web Server',
                               u'DeviceAvailable': True,

  --- <出力一部省略> ---

 u'PageNumber': 1,
 u'PageSize': 10,
 u'RequestId': u'97BA90F4-097E-4E1C-A177-3F6DE1F96B1A',
 u'TotalCount': 1}
```

他、いくつかのサンプルコードと実行結果を記載いたします。
必要なパラメータについては事前に実行した Describe の結果を参考にすると良いでしょう。

## インスタンスの作成
前述のコードとほぼ流れは一緒です。
最初は公式のドキュメント見て作成したのですが、"HTTP Status: 403 Error:InvalidResourceType"というエラーが発生。 request.set_VSwitchId で VSwitchID をセット後、エラーが出なくなりました。

### サンプルコード

```
#!/usr/bin/env python
# -*- coding: utf8 -*-

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526 import CreateInstanceRequest

import json
from pprint import pprint

# Initialize AcsClient instance
client = AcsClient(
  "<access-key-id>", 
  "<access-key-secret>",
  "<region-id>"
);


# Initialize a request and set parameters
request = CreateInstanceRequest.CreateInstanceRequest()
request.set_ImageId("centos_7_04_64_20G_alibase_201701015.vhd")
request.set_InstanceType("ecs.xn4.small")
request.set_VSwitchId("<VSwitchId>")
request.set_InstanceName("MyInstance")
request.set_SecurityGroupId("<SecurityGroupId>")
request.set_KeyPairName("<KeyPairName>")

# Print response
response = client.do_action_with_exception(request)
pprint(json.loads(response))
```

### 実行結果

```
{u'InstanceId': u'i-xxxxx',
 u'RequestId': u'xxxxx'}
```

## インスタンスの起動
### サンプルコード

```
#!/usr/bin/env python
# -*- coding: utf8 -*-

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526 import StartInstanceRequest

import json
from pprint import pprint

# Initialize AcsClient instance
  "<access-key-id>", 
  "<access-key-secret>",
  "<region-id>"
);

# Initialize a request and set parameters
request = StartInstanceRequest.StartInstanceRequest()
request.set_InstanceId("<InstanceId>")

# Print response
response = client.do_action_with_exception(request)
pprint(json.loads(response))
```

### 実行結果

```
{u'RequestId': u'xxxxx'}
```

## インスタンスの停止
### サンプルコード

```
#!/usr/bin/env python
# -*- coding: utf8 -*-

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526 import StopInstanceRequest

import json
from pprint import pprint

# Initialize AcsClient instance
client = AcsClient(
  "<access-key-id>", 
  "<access-key-secret>",
  "<region-id>"
);

# Initialize a request and set parameters
request = StopInstanceRequest.StopInstanceRequest()
request.set_InstanceId("<InstanceId>")

# Print response
response = client.do_action_with_exception(request)
pprint(json.loads(response))
```

### 実行結果

```
{u'RequestId': u'xxxxx'}
```

## 実行結果の記録
ActionTrail を有効化することにより Alibaba Cloud のリソースに対して行われた操作の記録が確認できます。

<img width="1246" alt="10.ActionTrail.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/120a47cb-ff9e-796a-6a6b-2cee5074c5e3.png">

特に必要な設定も無いので、導入は簡単です。もし、もっと詳細なログ管理がしたい場合は [Log Service](https://jp.alibabacloud.com/product/log-service) の利用を検討してください。

2018/06/03 追記: Log Service 利用に関する記事を書きました。よろしければ[こちら](https://qiita.com/feel_good/items/82f7c5c8812f3332dcb9)もご参照ください。

# おわりに
Alibaba Cloud を初めて触ってみましたが、中国リージョンのみに提供されているサービスがかなり多いようです。機会があればそちらで提供されているサーバレス系のサービスも利用して見たいですね。

ここまで読んでいただきありがとうございました。