認証メソッドRamRoleArnでクロスアカウントの操作をやってみる


前回は[【aliyun-cliの各認証メソッドについて】](https://qiita.com/jobbin/items/44ea8019839f499006ec) ご紹介させていただきました。
認証メソッドが RamRoleArn の場合、AccessKeyやSecretKey以外、RoleのARNとSession名も設定したので、裏ではクレデンシャル情報で一度そのRoleに対して<font color="red">AssuemRole</font>してから、別のコマンドを実行しています。

>AssumeRole
実際のユーザーは、AssumeRole 操作を実行することにより、ロールのセキュリティトークンを取得できます。AssumeRole API を呼び出すことにより、ロールのセキュリティトークンを取得し、このトークンを使用してクラウドサービス API にアクセスできます。

裏でAssumeRoleで実行していれば、対象のロールは別のアカウントのユーザーロールでも利用できるはずです。そうなると、下記の図のように、認証メソッドRamRoleArnでコンフィグを設定すれば、簡単にクロスアカウントの操作ができるようになります。
![スクリーンショット 2019-02-21 16.47.24.png](https://qiita-image-store.s3.amazonaws.com/0/117156/0191ba70-ab17-9461-1a5f-8051046f4334.png)

今回は別アカウントのユーザーロールを利用して、認証メソッドRamRoleArnでクロスアカウントの操作を試してみます。



## 前提条件 

① [【aliyun-cliの各認証メソッドについて】](https://qiita.com/jobbin/items/44ea8019839f499006ec)での環境を利用します
 　※ 利用されているAlibaba Cloudアカウント(アカウントID: `564********921`)を アカウントA とします
② アカウントB(アカウントID: `545******6520`) にアカウントAを信頼する下記のユーザーロールを利用します。
　- ロール名: cross-accoumt-role-test
　- ロールARN: `acs:ram::545******6520:role/cross-accoumt-role-test`


## クロスアカウントの操作をやってみる

実行環境にSSHログインしてから、
アカウントAのtest_userのAccessKey、SecretKey、
アカウントBのロール cross-accoumt-role-test を利用して、
認証メソッドRamRoleArn、プロファイル名 cross_account_test 
でコンフィグを設定します。

```
# aliyun configure --mode RamRoleArn --profile cross_account_test
Configuring profile 'cross_account_test' in 'RamRoleArn' authenticate mode...
Access Key Id []: LTAIfD***YDFnK
Access Key Secret []: bjoWdMZw****NnVLtLSvILI
Ram Role Arn []: acs:ram::545******6520:role/cross-accoumt-role-test
Role Session Name []: cross-account
Default Region Id []: ap-northeast-1
Default Output Format [json]: json (Only support json))
Default Language [zh|en] en:
```

今設定されているプロファイルの情報を確認します。前回で設定した情報も残っていますが、気にしないでください。
プロファイル cross_account_test には ※ が付いていて、コマンド実行時にプロファイル指定がなければ、※ が付いているプロファイルがデフォルトで利用されるようになっています。

```
# aliyun configure list
Profile              | Credential          | Valid   | Region           | Language
---------            | ------------------  | ------- | ---------------- | --------
default              | AK:***              | Invalid |                  | en
AK                   | AK:***FnK           | Valid   | ap-northeast-1   | en
StsToken             | StsToken:***B1w     | Valid   | ap-northeast-1   | en
RamRoleArn           | RamRoleArn:***FnK   | Valid   | ap-northeast-1   | en
EcsRamRole           | EcsRamRole:ecs-role | Valid   | ap-northeast-1   | en
cross_account_test * | RamRoleArn:***FnK   | Valid   | ap-northeast-1   | en
```

stsのGetCallerIdentityを実行して、確認してみます。
アカウントA(アカウントID: `564********921`)から アカウントB (アカウントID: `545******6520`) へAssumedRoleしてから、ロール cross-accoumt-role-test でstsのGetCallerIdentityを実行したことが分かります。
※アカウントA / B のActionTrail にも AssumeRoleの操作記録が残っています。

```
$ aliyun sts GetCallerIdentity

{
	"AccountId": "545******6520",
	"RequestId": "8588C15D-EE5E-40CD-A68C-4F71092B6876",
	"PrincipalId": "334673****9518:cross-account",
	"IdentityType": "AssumedRoleUser",
	"Arn": "acs:ram::5450****6520:assumed-role/cross-accoumt-role-test/cross-account",
	"RoleId": "33467*****699518"
}
```

## 考察

今回はAccount AのRAMユーザーのAccessKeyとSecretKeyで、Account Bのユーザーロール経由でコマンドを実行してみました。

異なるアカウントのユーザーロールを認証メソッドRamRoleArn で設定すれば、下記のように、`aliyun configure list`コマンドを活用しながら、`--profile ***` で簡単に複数アカウント間の操作を切り替えられます。アカウントが多くなると、パッと見てどのプロファイルがどのアカウントなのかがすぐわかるように、プロファイル命名のセンスが問われるかもしれません。

```
# aliyun configure list
Profile              | Credential          | Valid   | Region           | Language
---------            | ------------------  | ------- | ---------------- | --------
default              | AK:***              | Invalid |                  | en
AK                   | AK:***FnK           | Valid   | ap-northeast-1   | en
StsToken             | StsToken:***B1w     | Valid   | ap-northeast-1   | en
RamRoleArn           | RamRoleArn:***FnK   | Valid   | ap-northeast-1   | en
EcsRamRole           | EcsRamRole:ecs-role | Valid   | ap-northeast-1   | en
cross_account_test * | RamRoleArn:***FnK   | Valid   | ap-northeast-1   | en
```

## 最後

本日は 認証メソッドRamRoleArn でクロスアカウントの操作を試してみました。普段、たぶん中々利用しないかもしれませんが、複数のアカウント間のリソースの管理とかの場合は、是非一度検討してみてください。