AlibabaCloudのRAMロールってどんなの？

# はじめに
AlibabaCloudのRAMロールに触れます。

# ドキュメントはこちら
[ロール - ユーザーガイド| Alibaba Cloud ドキュメントセンター](https://jp.alibabacloud.com/help/doc-detail/28649.htm?spm=a21mg.p38356.b99.21.1ef052c8ZobBa3)

# ユーザーとの違い
ドキュメントには下記のとおり記載があります。

> RAM ロールと通常の RAM ユーザーの違い
> 
> RAM ロールは権限が付与された実際のユーザーが引き受ける必要があります。ロールを引き受けると、実際のユーザーは、この RAM ロールの一時セキュリティトークンを受け取ります。これにより、この一時セキュリティトークンを使用して、ロールに許可されているリソースにアクセスできます。

ここの段階で、理解できるといいのですが!
なかなか難解です。

# まず、ロールを作成してみましょう

![a9381f72.png](https://qiita-image-store.s3.amazonaws.com/0/241104/2ee29a7b-2233-2d27-d299-74d69cacc5e2.png)

![264b2044.png](https://qiita-image-store.s3.amazonaws.com/0/241104/347aeb21-707a-fc3c-c4ca-53d04e9677de.png)

今回はユーザーロールを指定します。
![01eeb580.png](https://qiita-image-store.s3.amazonaws.com/0/241104/7e8e841c-aab8-5621-e349-2715ffb27082.png)

[cc2e365a.png](https://qiita-image-store.s3.amazonaws.com/0/241104/d9e47beb-2041-6fc1-f926-2dae8ed0cbbc.png)

![5d13d51f.png](https://qiita-image-store.s3.amazonaws.com/0/241104/4eef3aee-c358-e278-5413-0289930e0667.png)

![b2d9f4a3.png](https://qiita-image-store.s3.amazonaws.com/0/241104/2b7918e1-c7be-cd9f-cb03-c353bc005daf.png)

![69c6e2e3.png](https://qiita-image-store.s3.amazonaws.com/0/241104/c53daac9-ad1a-0861-0794-cf14958a1ae3.png)

![36adc7db.png](https://qiita-image-store.s3.amazonaws.com/0/241104/8513870c-e0ab-3b9e-dcd6-f4ab258af2be.png)

![7a2e3ff5.png](https://qiita-image-store.s3.amazonaws.com/0/241104/d223444d-163f-85be-2140-ae17a3736d8b.png)

これで、**AdministratorAccess**の権限が付与された
**pocRole**というユーザーロールが完成しました。

一覧の管理から見ると、基本情報にパーミッションぽいのがあります。

![1b1eb8de.png](https://qiita-image-store.s3.amazonaws.com/0/241104/10be2209-6492-463b-edf1-d1f079f5ea68.png)

![7ceb3c43.png](https://qiita-image-store.s3.amazonaws.com/0/241104/e2f4a638-132e-f786-3a5a-93f445973f67.png)

# ロールを使ってみる

> RAM ロールを使用する API アクセス

ドキュメントにあるこちらを試してます。

# API アクセスのおさらい

クラウドサービスへのアクセス（取得、作成、更新、削除、管理など）いわゆる操作は **API** を使用してます。

CLIやSDKは、このAPIを使ってます。

# インスタンスにRAMロールをアタッチ
[Use the instance RAM role in the console - User Guide| Alibaba Cloud Documentation Center](https://www.alibabacloud.com/help/doc-detail/61175.htm?spm=a2c63.p38356.a3.6.748694a8TC73xT)

インスタンスにRAMロールをアタッチしたいのですが

`3. Attach an instance RAM role`

が、コンソールから見当たりません。 (; _ ;)

ここで、CLIを使ってアタッチします。

[AlibabaCloudのAuto Scaling x SLBをやってみる(ROS版)](https://qiita.com/wa-ta-ru/items/b27f75cf8d82d1f6a3c7)
でインスタンスを起動します。

## インスタンスIDを取得
```shj
[f_prg@aliyun] $ aliyun ecs DescribeInstances|jq '.Instances.Instance[].InstanceId'
"i-6we1wb28gzq9m0mnqw8u"
"i-6we1wb28gzq9m0mnqw8t"
```

## ロール名を取得
```sh
[f_prg@aliyun] $ aliyun ram ListRoles|jq '.Roles.Role[].RoleName'
"AliyunDTSDefaultRole"
"AliyunEHPCDefaultRole"
"AliyunEMRDefaultRole"
"AliyunESSDefaultRole"
"AliyunMTSDefaultRole"
"pocRole"
```

## ECSにロールをアタッチします。

```sh
[f_prg@aliyun] $ aliyun ecs AttachInstanceRamRole --RamRoleName=pocRole --InstanceIds="['i-6we1wb28gzq9m0mnqw8u','i-6we1wb28gzq9m0mnqw8t']"
ERROR: SDK.ServerError
ErrorCode: InvalidRamRole.NotEcsRole
Recommend:
RequestId: 057FA38D-2375-46F3-B4C7-B77FF2FAAD35
Message: The specified ram role is not authorized for ecs, please check your role policy.
```

できませんでした。
pocRoleはただ作っただけの状態です。
ECSに対しての許可がありませんので、付与します。

## 基本情報ポリシーを変更する

![7ceb3c43.png](https://qiita-image-store.s3.amazonaws.com/0/241104/e2f4a638-132e-f786-3a5a-93f445973f67.png)

の基本情報ポリシーを変更します。
作成したときのポリシーは下記の通りです。

```json
{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "RAM": [
          "acs:ram::XXXXXXXXXXXXXXXX:root"
        ]
      }
    }
  ],
  "Version": "1"
}
```

これに

```json
        "Service": [
          "ecs.aliyuncs.com"
        ]
```

を追加して

```json
{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "RAM": [
          "acs:ram::XXXXXXXXXXXXXXXX:root"
        ],
        "Service": [
          "ecs.aliyuncs.com"
        ]
      }
    }
  ],
  "Version": "1"
}
```
に編集します。

## 再びポリシーをアタッチします
```sh
[f_prg@aliyun] $ aliyun ecs AttachInstanceRamRole --RamRoleName=pocRole --InstanceIds="['i-6we1wb28gzq9m0mnqw8u','i-6we1wb28gzq9m0mnqw8t']"
{"TotalCount":2,"RequestId":"C8C8E3D7-A0E2-4179-988B-BBFFB69AC061","AttachInstanceRamRoleResults":{"AttachInstanceRamRoleResult":[{"Message":"success","InstanceId":"i-6we1wb28gzq9m0mnqw8u","Code":"200"},{"Message":"success","InstanceId":"i-6we1wb28gzq9m0mnqw8t","Code":"200"}]},"FailCount":0,"RamRoleName":"pocRole"}
```

## サーバにログインします

## メタデータでロールを確認します
```sh
[root@iz6we1wb28gzq9m0mnqw8uz ~]# curl http://100.100.100.200/latest/meta-data/ram/security-credentials/
pocRole
```

## Alibaba Cloud CLI(Linux)をセットアップします

```sh
[root@iz6we1wb28gzq9m0mnqw8uz ~]# curl -o cli.tgz http://aliyun-cli.oss-cn-hangzhou.aliyuncs.com/aliyun-cli-linux-3.0.2-amd64.tgz?spm=a21mg.p38356.a3.4.6cec77b9VgqXFa&file=aliyun-cli-linux-3.0.2-amd64.tgz
[root@iz6we1wb28gzq9m0mnqw8uz ~]# tar vxzf cli.tgz
[root@iz6we1wb28gzq9m0mnqw8uz ~]# mv aliyun /usr/bin
[root@iz6we1wb28gzq9m0mnqw8uz ~]# which aliyun
/usr/bin/aliyun
```

## Alibaba Cloud CLI のconfigureを設定します。

```sh
[root@iz6we1wb28gzq9m0mnqw8uz ~]# aliyun configure
Configuring profile '' in '' authenticate mode...
Access Key Id []:
Access Key Secret []:
Default Region Id []: ap-northeast-1
Default Output Format [json]: json (Only support json))
Default Language [zh|en] en:
Saving profile[] ...Done.
-----------------------------------------------
!!! Configure Failed please configure again !!!
-----------------------------------------------
AccessKeyId/AccessKeySecret is empty! run `aliyun configure` first
-----------------------------------------------
!!! Configure Failed please configure again !!!
-----------------------------------------------
```

アクセスキー/シークレットキーがないので、失敗します。

## configファイルを編集します

[GitHub - aliyun/aliyun-cli: Universal Command Line Interface for Alibaba Cloud](https://github.com/aliyun/aliyun-cli)

~/.aliyun/config.json
の
**AK**を**EcsRamRole**に変更します。

```sh
[root@iz6we1wb28gzq9m0mnqw8uz ~]# sed -i -e s/"AK"/"EcsRamRole"/g ~/.aliyun/config.json
```

## CLIを実行して見ます

ECSにアタッチしたロール
pocRoleで
ecsのDescribeInstances APIにアクセスできるようになります。

```
[root@iz6we1wb28gzq9m0mnqw8uz ~]# aliyun ecs DescribeInstances
{"PageNumber":1,"TotalCount":2,"PageSize":10,"RequestId":
```

# まとめ
アクセスキー/シークレットキーを埋め込んで
下記の記事のようにイメージを作成しますと
アクセスキーやシークレットキーの変更が発生したときに
修正作業が大変になります。

[AlibabaCloudでカスタムイメージを作成してみた](https://qiita.com/wa-ta-ru/items/3ee472750928577f84c3)

ECSにロールを付与する形だと、フレキシブルな対応ができますので、こちらをオススメします。

# おまけ
jqのフィルタのチェックは
[jq play](https://jqplay.org/)
がオススメです。