aliyun-cliの各認証メソッドについて

## はじめに

Alibaba Cloudは [aliyun-cli](https://github.com/aliyun/aliyun-cli) というCommand Line Interface があります。aliyun-cli にはPython版もありましたが、今はgo版のaliyun-cliの利用が推奨されています。

aliyun-cliのコンフィグを設定する際に、下記４つの認証メソッドがあります。

| Authentication methods | Description |
|:--|:--|
| AK | Use AccessKey ID and Secret to access Alibaba Cloud services |
| StsToken | Use STS token to access Alibaba Cloud services |
| RamRoleArn | Use the AssumeRole to access Alibaba Cloud services |
| EcsRamRole | Use the EcsRamRole to access ECS resources |

今回はそれぞれの認証メソッドでコンフィグを設定して、使ってみます。

## 前提条件

以下今回利用する環境などのリソースになります。
 
- aliyun-cliのテスト環境: 日本リージョン(id: ap-northeast-1)のECSインスタンス
  - インスタンスID: i-6we12cxexwbs11780z7r 
  - aliyun-cliインストール済み、サービスロール未設定
- ECS用のサービスロール ecs-role
- 認証メソッドStsTokenとRamRoleArnの時に利用するユーザーロール assume-role-test
  - ARN: `acs:ram::564********921:role/assume-role-test` 
- RAMユーザーtest_userのAccessKeyとSecretKey
  - AssumeRole実行用のシステムポリシーAliyunSTSAssumeRoleAccess
  - AttachInstanceRamRole実行用のシステムポリシーAliyunECSFullAccess(ちょっと権限的に広すぎたが)
 
サービスロールやユーザーロールは何かについては

## AccessKey Method

RAMユーザーtest_userの認証情報を利用して、認証メソッド AK、プロファイル名 AK でコンフィグを設定します。

```
# aliyun configure --mode AK --profile AK
Configuring profile 'AK' in 'AK' authenticate mode...
Access Key Id []: LTAI*****FnK
Access Key Secret []: bjoWdM******SvILI
Default Region Id []: ap-northeast-1
Default Output Format [json]: json (Only support json))
Default Language [zh|en] en:
```

はじめてaliyun configureが実行されると .aliyunの配下にconfig.jsonが生成されます。config.jsonの中身はcurrent、profiles、meta_pathという３つのKeyとValueで構成されるJSON形式なもので、profilesのValueは配列になっています。
※ なぜかdefaultというprofileも作成されるようになっています

```
{
  "current": "AK",
  "profiles": [{
    "name": "default",
    "mode": "AK",
    "access_key_id": "",
    "access_key_secret": "",
    "sts_token": "",
    "ram_role_name": "",
    "ram_role_arn": "",
    "ram_session_name": "",
    "private_key": "",
    "key_pair_name": "",
    "expired_seconds": 0,
    "verified": "",
    "region_id": "",
    "output_format": "json",
    "language": "en",
    "site": "",
    "retry_timeout": 0,
    "retry_count": 0
  }, {
    "name": "AK",
    "mode": "AK",
    "access_key_id": "LTA*******FnK",
    "access_key_secret": "bjoWd*********tLSvILI",
    "sts_token": "",
    "ram_role_name": "",
    "ram_role_arn": "",
    "ram_session_name": "",
    "private_key": "",
    "key_pair_name": "",
    "expired_seconds": 0,
    "verified": "",
    "region_id": "ap-northeast-1",
    "output_format": "json",
    "language": "en",
    "site": "",
    "retry_timeout": 0,
    "retry_count": 0
  }],
  "meta_path": ""
}
```

上記の通り、currentはAK(**プロファイルAKを利用**する意味)になっているので、この状態でstsのGetCallerIdentityを実行して確認してみると、RAMユーザーtest_userのAccessKeyが利用されていることが分かります。

```
# aliyun sts GetCallerIdentity
{
	"AccountId": "564******921",
	"RequestId": "E60A3CCE-791D-424F-8B98-F765CAD44F05",
	"PrincipalId": "287343247819428091",
	"IdentityType": "RAMUser",
	"Arn": "acs:ram::564******921:user/test_user",
	"UserId": "287343247819428091"
}
```

## StsToken Method

トークン情報を取得するため、(currentはAKの状態で)ユーザーロール assume-role-testに対して、AssumeRoleを実行して、AccessKeyId、AccessKey、SecretSecurityTokenを取得します。

```
# aliyun sts AssumeRole --RoleArn "acs:ram::564*****6921:role/assume-role-test" --RoleSessionName "StsTokenTest"
{
	"RequestId": "A938308F-A760-41F3-B6DE-3F0080E2E03F",
	"AssumedRoleUser": {
		"AssumedRoleId": "343254****5912:StsTokenTest",
		"Arn": "acs:ram::564******921:role/assume-role-test/StsTokenTest"
	},
	"Credentials": {
		"AccessKeySecret": "AkjyHZyuAHw*******XKVeRgB4R",
		"AccessKeyId": "STS.NHJZgvmFR******CDpB1w",
		"Expiration": "2019-02-17T10:01:13Z",
		"SecurityToken": "CAIS+wF1q6Ft5B2yfSjIr4v/Ed3CgJlz75qlcWLa0jYPfcxon4ealTz2IHxPfnRsB+kesP0ynW5V5/8YlqVIV4R5Qk/Ja******SGBj+osQU/VEU/tKIVUAu3xXiSqQnUkAIOm4yDRSaI16zFYT4H5ST+uVYo1D39pUknoZrPfGmDr26zdn3kX+X26tG1gL"
	}
}
```
日本時間2019年2月17日の18時頃上記のコマンドを実行したので、Expirationは`2019-02-17T10:01:13Z`(トークンの有効期間はデフォルトで1時間)になっています。

取得したAccessKeyId、AccessKey、SecretSecurityTokenで認証メソッド StsToken、プロファイル名 StsToken で aliyun configure を実行します。

```
# aliyun configure --mode StsToken --profile StsToken
Configuring profile 'StsToken' in 'StsToken' authenticate mode...
Access Key Id []: STS.NHJZg*****CDpB1w
Access Key Secret []: AkjyHZyuA******xoUYfXKVeRgB4R
Sts Token []: CAIS+wF1q6Ft5B2yf********+uVYo1D39pUknoZrPfGmDr26zdn3kX+X26tG1gL
Default Region Id []: ap-northeast-1
Default Output Format [json]: json (Only support json))
Default Language [zh|en] en:
```

configure.jsonのprofilesに下記StsTokenというprofileが追記されました。currentもStsTokenになりました。

```
 {
    "name": "StsToken",
    "mode": "StsToken",
    "access_key_id": "STS.NHJZg********CDpB1w",
    "access_key_secret": "AkjyHZyuA*********KVeRgB4R",
    "sts_token": "CAIS+wF1q6Ft5B2yfSjIr4****o1D39pUknoZrPfGmDr26zdn3kX+X26tG1gL",
    "ram_role_name": "",
    "ram_role_arn": "",
    "ram_session_name": "",
    "private_key": "",
    "key_pair_name": "",
    "expired_seconds": 0,
    "verified": "",
    "region_id": "ap-northeast-1",
    "output_format": "json",
    "language": "en",
    "site": "",
    "retry_timeout": 0,
    "retry_count": 0
  }
```

(currentはStsTokenで)stsのGetCallerIdentityを実行してみると、ユーザーロールassumed-roleが利用されていることが分かります。

```
# aliyun sts GetCallerIdentity
{
	"AccountId": "5644*****921",
	"RequestId": "D1BD0B40-E2A3-4323-B12A-D1879A938454",
	"PrincipalId": "343254*****165912:StsTokenTest",
	"IdentityType": "AssumedRoleUser",
	"Arn": "acs:ram::5644*****921:assumed-role/assume-role-test/StsTokenTest",
	"RoleId": "34325*****165912"
}
```

## RamRoleArn Method

ユーザーロール assume-role-test を利用して、認証メソッド RamRoleArn、プロファイル名 RamRoleArn で aliyun configure を実行します。

```
# aliyun configure --mode RamRoleArn --profile RamRoleArn
Configuring profile 'RamRoleArn' in 'RamRoleArn' authenticate mode...
Access Key Id []: LTAIf****FnK
Access Key Secret []: bjoWdMZ****LtLSvILI
Ram Role Arn []: acs:ram::5644*****921:role/assume-role-test
Role Session Name []: RamRoleArn
Default Region Id []: ap-northeast-1
Default Output Format [json]: json (Only support json))
Default Language [zh|en] en:
```

configure.jsonのprofilesに下記RamRoleArnというprofileが追記されました。currentもRamRoleArnになりました。

```
{
    "name": "RamRoleArn",
    "mode": "RamRoleArn",
    "access_key_id": "LTAI****nK",
    "access_key_secret": "bjoWdMZw*****LSvILI",
    "sts_token": "",
    "ram_role_name": "",
    "ram_role_arn": "acs:ram::5644****921:role/assume-role-test",
    "ram_session_name": "RamRoleArn",
    "private_key": "",
    "key_pair_name": "",
    "expired_seconds": 900,
    "verified": "",
    "region_id": "ap-northeast-1",
    "output_format": "json",
    "language": "en",
    "site": "",
    "retry_timeout": 0,
    "retry_count": 0
  }
```

stsのGetCallerIdentityを実行してみると、ユーザーロールassume-role-testが利用されていることが分かります。

```
# aliyun sts GetCallerIdentity
{
	"AccountId": "564*****921",
	"RequestId": "48E514B9-24FA-4DEC-A5B5-3FF9F0F68BC6",
	"PrincipalId": "3432****5912:RamRoleArn",
	"IdentityType": "AssumedRoleUser",
	"Arn": "acs:ram::564*****921:assumed-role/assume-role-test/RamRoleArn",
	"RoleId": "3432******5912"
}
```

## EcsRamRole Method

今回利用するECSインスタンスにサービスロールはまだ未設定のままですので、プロファイルAKの認証情報でECSインスタンス(id: i-6we12cxexwbs11780z7r)にecs-roleをアタッチします。

```
aliyun ecs AttachInstanceRamRole --RegionId "ap-northeast-1" --InstanceIds '["i-6we12cxexwbs11780z7r"]' --RamRoleName "ecs-role" --profile AK
```

認証メソッド EcsRamRole、プロファイル名 EcsRamRole で aliyun configure を実行します。


```
# aliyun configure --mode EcsRamRole --profile EcsRamRole
Configuring profile 'EcsRamRole' in 'EcsRamRole' authenticate mode...
Ecs Ram Role []: ecs-role
Default Region Id []: ap-northeast-1
Default Output Format [json]: json (Only support json))
Default Language [zh|en] en:
```

configure.jsonのprofilesに下記EcsRamRoleというprofileが追記されました。currentもEcsRamRoleになりました。

```
{
    "name": "EcsRamRole",
    "mode": "EcsRamRole",
    "access_key_id": "",
    "access_key_secret": "",
    "sts_token": "",
    "ram_role_name": "ecs-role",
    "ram_role_arn": "",
    "ram_session_name": "",
    "private_key": "",
    "key_pair_name": "",
    "expired_seconds": 0,
    "verified": "",
    "region_id": "ap-northeast-1",
    "output_format": "json",
    "language": "en",
    "site": "",
    "retry_timeout": 0,
    "retry_count": 0
  }
```
stsのGetCallerIdentityを実行してみると、サービスロールecs-roleが利用されていることが分かります。

```
# aliyun sts GetCallerIdentity
{
	"AccountId": "564******921",
	"RequestId": "00F9BF21-B50C-4317-9FB3-483331F98C57",
	"PrincipalId": "3254*****771510:vm-ram-i-6we12cxexwbs11780z7r",
	"IdentityType": "AssumedRoleUser",
	"Arn": "acs:ram::564*******921:assumed-role/ecs-role/vm-ram-i-6we12cxexwbs11780z7r",
	"RoleId": "325*****1510"
}
```

## 最後

以上、aliyun-cliの認証メソッドについて、簡単にご紹介させていただきました。aliyun-cliを初めて利用する際に、AKのみと思っていましたが、よくよく見たら、認証メソッドが4種類があって、ちょっとびっくりしました。それぞれの認証メソッドの使いどころはまた別途ご紹介したいと思っています。