誰でもできる！！ コピペ式Alibaba Cloud入門

# Aliyun CLIを始めよう

CLIは素晴らしいです。
敬虔なCLI信者(?)の@nago3でございます。

**CLIを使えば、APIからコンソールぽちぽちの背後を理解しながら進められるのです。**
それはきっと皆さんのクラウドを理解する大きな一助となるでしょう。

ついでに言うと、クラウドベンダーの資格を取得するにはこれをやっておくと尚いいとも思います。この記事が皆さんのクラウド学習に貢献できることを祈ります。

----------

と言うことでとりあえず、何も考えずコピペでもVPCからECSの構築ができるようにしちゃいましょう。

@mosuke5 さんの
[Alibaba Cloud 日本リージョンがTerraformに対応したので試した](https://qiita.com/mosuke5/items/a65683ce6569bffd7ef0)
の記事を参考に、cliでAPIの中身を見ていきます。構成図もお借りしています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/161922/0f884f0e-eee7-6344-78cc-092d699d3d24.png)

と言うことで、簡単な[Hello Apache]の表示を行っていこうと思います。
今回の記事はMacのターミナルで実施しています。

**[作成していく順番]**

```
1. VPC
2. VSwitch
3. EIP
4. SecurityGroup
5. ECS
```

**コマンド リファレンス**:
https://jp.alibabacloud.com/help?spm=a21mg.p38356.a1.1.18187d3fkezEic

## 注意

####前提条件: 
**<font color=red>1. 既に何らかのデータが入っている場合エラーが発生する場合があります。</font>**
**<font color=red>2. Aliyunのコマンドラインの導入、configureの設定まで行っていること!!</font>**
**<font color=red>3. jqコマンドが使えること!!</font>**

もし終わっていない場合は他の方が記事を出してくださっているので参考にしてください。
https://qiita.com/moChiii/items/19a2ef093d8e22856fa6
https://qiita.com/wa-ta-ru/items/4d9793a325e99c71c3ea

```
1. [環境変数設定]
2. [コマンド]
3. [確認]
```

の順番で実行していきます。
全部コピペで作成されていきます。

レスポンスにエラーなどが帰ってきている場合などは、
前の手順からコピペのし忘れがないか確認してみましょう。


## 1. VPCの作成

[環境変数設定]

```
REGION_ID="ap-northeast-1"
VPC_NAME="VPC"
VPC_DESC="Aliyun VPC"
VPC_CIDR_BLOCK="172.16.0.0/16"
```

[コマンド]

```
aliyun vpc CreateVpc \
  --RegionId ${REGION_ID} \
  --VpcName ${VPC_NAME} \
  --Description "${VPC_DESC}" \
  --CidrBlock ${VPC_CIDR}
```
```
 =>  {"RequestId":"vtb-xxxxxxxxxxxxxxxxxxxxx","VpcId":"vpc-xxxxxxxxxxxxxxxxxxxxxxxx","VRouterId":"vrt-xxxxxxxxxxxxxxxxxxxxxxxxx"}
```

[確認]

```
aliyun vpc DescribeVpcs \
  --VpcName ${VPC_NAME}
```
```
 => {"PageNumber":1,"Vpcs":{"Vpc":[{"VpcName":"test-vpc",....}
```

**ポイント:**
<font color=red>CLIでの操作なら、制限はありますがVPCのCIDR_BLOCKをいじれます！！</font>
ルートテーブルはデフォルトで作成されたものをそのまま使います。


## 2. VSwitchの作成

[環境変数設定]

```
VPC_ID=$( \
  aliyun vpc DescribeVpcs \
  --VpcName ${VPC_NAME} \
  | jq '.Vpcs.Vpc[].VpcId' \
  | sed 's/"//g'
)
ZONE_ID="ap-northeast-1a"
VSWITCH_NAME="VSw"
VSWITCH_DESC="Aliyun VSwitch"
VSWITCH_CIDR="172.16.1.0/24"
```

[コマンド]

```
aliyun vpc CreateVSwitch \
  --VpcId ${VPC_ID} \
  --ZoneId ${ZONE_ID} \
  --VSwitchName ${VSWITCH_NAME} \
  --Description "${VPC_DESC}" \
  --CidrBlock ${VSWITCH_CIDR}
```
```
 =>  {"RequestId":"EA3xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxxx","VSwitchId":"vsw-xxxxxxxxxxxxxxxxxxxxxxx"}
```

[確認]

```
aliyun vpc DescribeVSwitches \
  --VSwitchName ${VSWITCH_NAME}
```
```
 => {"PageNumber":1,"VSwitches":{"VSwitch":[{"CreationTime":"2018-11-....}
```


**ポイント:**
VSwitch は AWS で言うところの Subnet です。
ルートテーブルはデフォルトのものがそのまま使われます。
<font color=red>また、インターネットゲートウェイを作成する必要はありません</font>


## 3. EIPの作成

[環境変数設定]

```
REGION_ID="ap-northeast-1"
EIP_BANDWIDTH="1"
EIP_INTERNET_CHARGE_TYPE="PayByTraffic"
EIP_INSTANCE_CHARGE_TYPE="PostPaid"
```

[コマンド]

```
aliyun vpc AllocateEipAddress \
  --RegionId ${REGION_ID} \
  --Bandwidth ${EIP_BANDWIDTH} \
  --InternetChargeType ${EIP_INTERNET_CHARGE_TYPE} \
  --InstanceChargeType ${EIP_INSTANCE_CHARGE_TYPE}
```
```
 =>  {"ResourceGroupId":"rg-xxxxxxxxxxxx","RequestId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx","EipAddress":"47.74.xx.xx","AllocationId":"eip-xxxxxxxxxxxxxxxxxxxx"}
```

[確認]

```
aliyun vpc DescribeEipAddresses
```
```
 => {"PageNumber":1,"EipAddresses":{"EipAddress":[{"ChargeType":"PostPaid....}
```

**ポイント:**
この作成した EIP に最終的にアクセスして画面を表示します。


## 4. SecurityGroupの作成

[環境変数設定]

```
VPC_ID=$( \
  aliyun vpc DescribeVpcs \
  --VpcName ${VPC_NAME} \
  | jq '.Vpcs.Vpc[].VpcId' \
  | sed 's/"//g'
)
REGION_ID="ap-northeast-1"
ECS_SG_NAME="SG"
ECS_SG_DESC="Aliyun SG"
```

[コマンド]

```
aliyun ecs CreateSecurityGroup \
  --VpcId ${VPC_ID} \
  --RegionId ${REGION_ID} \
  --SecurityGroupName ${ECS_SG_NAME} \
  --Description "${ECS_SG_DESC}"
```
```
 =>  {"SecurityGroupId":"sg-xxxxxxxxxxxxxxxxxx","RequestId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx"}
```

[確認]

```
aliyun ecs DescribeSecurityGroups \
  --SecurityGroupName ${ECS_SG_NAME}
```
```
 => {"PageNumber":1,"TotalCount":1,"PageSize":10,"RegionId....}
```


## 5. セキュリティグループのルールの追加

[環境変数設定]

```
SG_ID=$( \
  aliyun ecs DescribeSecurityGroups \
    --SecurityGroupName ${SG_GROUP_NAME} \
    | jq '.SecurityGroups.SecurityGroup[].SecurityGroupId' \
    | sed 's/"//g'
)
REGION_ID="ap-northeast-1"
SG_DESC="Aliyun SG"
IP_PROTOCOL="tcp"
PORT_RANGE="80/80"
NIC_TYPE="intranet"
POLICY="accept"
DEST_CIDR_IP="0.0.0.0/0"
```

[コマンド]

```
aliyun ecs AuthorizeSecurityGroup \
  --SecurityGroupId ${SG_ID} \
  --RegionId ${REGION_ID} \
  --Description "${SG_DESC}" \
  --IpProtocol ${IP_PROTOCOL} \
  --PortRange ${PORT_RANGE} \
  --NicType ${NIC_TYPE} \
  --Policy ${POLICY} \
  --SourceCidrIp ${DEST_CIDR_IP}
```
```
 =>  {"RequestId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx"}
```

[確認]

```
aliyun ecs DescribeSecurityGroupAttribute \
  --SecurityGroupId ${SG_ID}
```
```
 => {"PageNumber":1,"TotalCount":1,"PageSize":10,"RegionId....}
```


## 6. インスタンスの作成

<font color=red>今回は事前に用意した UserData を[Base64]にエンコードしております。</font>

**元データは以下の通りです。**

```
#!/bin/sh
yum install -y httpd
systemctl start httpd
systemctl enable httpd
```

[環境変数設定]

```
INSTANCE_NAME="INSTANCE"
ECS_DESC="Alicloud CLI INSTANCE"
REGION_ID="ap-northeast-1"
ZONE_ID="ap-northeast-1a"

VSWITCH_ID=$( \
  aliyun ecs DescribeVSwitches \
    --VpcId ${VPC_ID} \
    | jq ".VSwitches.VSwitch[].VSwitchId" \
    | sed 's/"//g'
)
SG_ID=$( \
  aliyun ecs DescribeSecurityGroups \
    --SecurityGroupName ${SG_GROUP_NAME} \
    | jq '.SecurityGroups.SecurityGroup[].SecurityGroupId' \
    | sed 's/"//g'
)

IMAGE_ID="alinux_17_01_64_20G_cloudinit_20171222.vhd"
INSTANCE_TYPE="ecs.n4.small"
INTERNET_CHARGE_TYPE="PayByTraffic"
INSTANCE_CHARGE_TYPE="PostPaid"

SYSTEM_DISK_CATEGORY="cloud_efficiency"
SYSTEM_DISK_SIZE=40
SYSTEM_DISK_NAME="SYS_DISK"
SYSTEM_DISK_DESC="AliCloud CLI System Disk"

USER_DATA="IyEvYmluL3NoDQp5dW0gaW5zdGFsbCAteSBodHRwZA0Kc3lzdGVtY3RsIHN0YXJ0IGh0dHBkDQpzeXN0ZW1jdGwgZW5hYmxlIGh0dHBk"
```

[コマンド]

```
aliyun ecs CreateInstance \
  --InstanceName ${INSTANCE_NAME} \
  --Description "${ECS_DESC}" \
  --RegionId ${REGION_ID} \
  --ZoneId ${ZONE_ID} \
  --VSwitchId ${VSWITCH_ID} \
  --SecurityGroupId ${SG_ID} \
  --ImageId ${IMAGE_ID} \
  --InstanceType ${INSTANCE_TYPE} \
  --InternetChargeType ${INTERNET_CHARGE_TYPE} \
  --SystemDisk.Category ${SYSTEM_DISK_CATEGORY} \
  --SystemDisk.Size ${SYSTEM_DISK_SIZE} \
  --SystemDisk.DiskName ${SYSTEM_DISK_NAME} \
  --SystemDisk.Description "${SYSTEM_DISK_DESC}" \
  --UserData ${USER_DATA}
```
```
 =>  {"InstanceId":"i-xxxxxxxxxxxxxxxxxxxx","RequestId":"xxxxxxxxxx-xxxxx-xxxxx-xxxxx-xxxxxxxxxxxxxxx"}
```

[確認]

```
aliyun ecs DescribeInstances \
  --InstanceName ${INSTANCE_NAME}
```
```
 => {"PageNumber":1,"TotalCount":1,"PageSize":10,"RegionId....}
```

**ポイント:**
この作業はあくまで作成です。
<font color=red>起動はしていません</font>


## 7. インスタンスとEIPの紐付け

[環境変数設定]

```
EIP_ID=$( \
  aliyun vpc DescribeEipAddresses \
    --RegionId ${REGION_ID} \
    | jq ".EipAddresses.EipAddress[].AllocationId" \
    | sed 's/"//g'
)
INSTANCE_ID=$( \
  aliyun ecs DescribeInstances \
    --InstanceName ${INSTANCE_NAME} \
    | jq ".Instances.Instance[].InstanceId" \
    | sed 's/"//g'
)
INSTANCE_TYPE="EcsInstance"
```

[コマンド]

```
aliyun vpc AssociateEipAddress \
  --AllocationId ${EIP_ID} \
  --InstanceId ${INSTANCE_ID} \
  --InstanceType ${INSTANCE_TYPE}
```
```
 =>  {"RequestId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx"}
```

[確認]

```
aliyun ecs DescribeInstances \
  --InstanceName ${INSTANCE_NAME} \
  | jq ".Instances.Instance[].SecurityGroupIds.SecurityGroupId[]"
```
```
 => "sg-xxxxxxxxxxxxxxxxxxxx"
```


## 8. インスタンスの起動

[環境変数設定]

```
INSTANCE_ID=$( \
  aliyun ecs DescribeInstances \
    --InstanceName ${INSTANCE_NAME} \
    | jq ".Instances.Instance[].InstanceId" \
    | sed 's/"//g'
)
```

[コマンド]

```
aliyun ecs StartInstance \
  --InstanceId ${INSTANCE_ID}
```
```
 =>  {"RequestId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx"}
```

[確認]

```
aliyun ecs DescribeInstances \
  --InstanceName ${INSTANCE_NAME} \
  | jq ".Instances.Instance[].Status"
```
```
 => "Running"

(確認が早いと)
=> "Starting"
```

<font color=red> **これでサービスの起動が完了しました！！** </font>

ちなみに、早く確認すると "Starting" になります。
その場合は少し時間を置いてからもう一度コマンドを叩いてみてください。

## 9. 画面確認

最後にサービスが確かに動いていることを確認しましょう。

[環境変数設定]

```
ACCESS_EIP=$( \
  aliyun ecs DescribeInstances \
    --InstanceName ${INSTANCE_NAME} \
    | jq ".Instances.Instance[].EipAddress.IpAddress" \
    | sed 's/"//g'
)
```

[コマンド]

```
curl http://${ACCESS_EIP}
```
```
 =>
<!DOCTYPE html PUBLIC ...><html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Apache HTTP Server Test Page powered by Alinux</title>
<body>
<p>Hello Apache</p>     (<= これ！！)
</body></html>
```

<font color=red> **これで [Hello Apache] が確認できました！！** </font>

ちなみに画面で確認するには

```
aliyun ecs DescribeInstances \
  --InstanceName ${INSTANCE_NAME} \
  | jq ".Instances.Instance[].EipAddress.IpAddress" \
  | sed 's/"//g'
```
```
=> xxx.xxx.xxx.xxx
```

と表示されるので、この[xxx.xxx.xxx.xxx]にアクセスすれば

<img width="329" alt="“SS“ 2018-12-07 at 16.08.50.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/161922/1ddbecd7-90e2-0c2e-a00d-32c1d9b6cbd2.jpeg">

このように表示されます。


## 10.後片付け

最後はしっかり環境を片付けましょう。
アクセスする以外にも、ECSが起動していることで<font color=red>お金がかかります</font>。

設定をすれば停止をしていれば課金されないようにもできますが、基本的に使わなければ削除しましょう。

[環境変数設定]

```
VPC_ID=$( \
  aliyun vpc DescribeVpcs \
    --VpcName ${VPC_NAME} \
    | jq '.Vpcs.Vpc[].VpcId' \
    | sed 's/"//g'
)
VSWITCH_ID=$( \
  aliyun vpc DescribeVSwitches \
    --VSwitchName ${VSWITCH_NAME} \
    | jq '.VSwitches.VSwitch[].VSwitchId' \
    | sed 's/"//g'
)
EIP_ID=$( \
  aliyun vpc DescribeEipAddresses \
    --RegionId ${REGION_ID} \
    | jq ".EipAddresses.EipAddress[].AllocationId" \
    | sed 's/"//g'
)
SG_ID=$( \
  aliyun ecs DescribeSecurityGroups \
    --SecurityGroupName ${SG_GROUP_NAME} \
    | jq '.SecurityGroups.SecurityGroup[].SecurityGroupId' \
    | sed 's/"//g'
)
INSTANCE_ID=$( \
  aliyun ecs DescribeInstances \
    --InstanceName ${INSTANCE_NAME} \
    | jq ".Instances.Instance[].InstanceId" \
    | sed 's/"//g'
)

```

[コマンド]

##### 1. インスタンスの削除

<font color=red>まずは停止</font>

```
aliyun ecs StopInstance \
  --InstanceId ${INSTANCE_ID}
```

停止を確認

```
aliyun ecs DescribeInstances \
  --InstanceName ${INSTANCE_NAME} \
  | jq ".Instances.Instance[].Status"
```
```
=> "Stopped"     (<= これになったら大丈夫！！)
```

<font color=red>停止したのを確認してから削除</font>

```
aliyun ecs DeleteInstance \
  --InstanceId ${INSTANCE_ID}
```

[確認]

```
aliyun ecs DescribeInstances \
  --InstanceName ${INSTANCE_NAME} \
  | jq ".Instances.Instance[]"
```
```
=> 何もなければOK!!
```

----------------------

##### 2. セキュリティグループの削除

```
aliyun ecs DeleteSecurityGroup \
  --SecurityGroupId ${SG_ID}
```

[確認]

```
aliyun ecs DescribeSecurityGroups \
  --SecurityGroupName ${ECS_SG_NAME} \
  | jq ".SecurityGroups.SecurityGroup[]"
```
```
=> 何もなければOK!!
```

----------------------

##### 3. EIPの削除

```
aliyun vpc ReleaseEipAddress \
  --AllocationId ${EIP_ID}
```

[確認]

```
aliyun vpc DescribeEipAddresses \
  --AllocationId ${EIP_ID} \
  | jq ".EipAddresses.EipAddress[]"
```
```
=> 何もなければOK!!
```

**ポイント:**
EIPの削除コマンドは Delete ではなく
<font color=red>Release</font>
を使います。

**最初はこれで迷ったのは自分だけではないはず...**

----------------------

##### 4. VSwitchの削除

```
aliyun vpc DeleteVSwitch \
  --VSwitchId ${VSWITCH_ID}
```

[確認]

```
aliyun vpc DescribeVSwitches \
  --VSwitchName ${VSWITCH_NAME} \
  | jq ".VSwitches.VSwitch[]"
```
```
=> 何もなければOK!!
```

----------------------

##### 5. VPCの削除

```
aliyun vpc DeleteVpc \
  --VpcId ${VPC_ID}
```

[確認]

```
aliyun vpc DescribeVpcs \
  --VpcName ${VPC_NAME} \
  | jq ".Vpcs.Vpc[]"
```
```
=> 何もなければOK!!
```

<font color=red> **作業は以上になります。お疲れ様でした！！** </font>


## 最後に

最後までお付き合いいただきありがとうございました。
@mosuke5 さんが terraform で行なっていた自動化作業を分解して、
1つの設定にどのようなサービスが紐付けられているかをみていきました。

今回残念だったのは、ルートテーブル周りを調べきれなかったため、
デフォルトをそのまま使ってしまったことです。
今度はルーティング関連の記事を書いてもいいかもしれないですね。

黒い画面で作業するのは最初は慣れないかもしれませんが、
やればやるほど GUI ではわからない細かな仕様までも感じることができると思います。
皆さんも良かったら CLI を使ってみましょう。



## 参考元

https://qiita.com/mosuke5/items/a65683ce6569bffd7ef0
https://qiita.com/moChiii/items/19a2ef093d8e22856fa6
https://qiita.com/wa-ta-ru/items/4d9793a325e99c71c3ea