IBM CloudのCLIでアクセス・グループの権限を設定する

## はじめに
これまでIBM CloudのGUIでリソース・グループやアクセス・グループを作りユーザーに権限を割り当てていました。これらの作業自動化の検討の一環として、CLIで同じ作業を試してみました。

## テストシナリオ
以下の構成をテストシナリオとします。

* Test01-resourceという名前のリソース・グループを作成します。
* Test01-accessという名前のアクセス・グループを作成します。
* Test01-accessに以下のアクセス権限を割り当てます。これらにより、アクセス・グループに追加されたユーザー自身がCode EngineサービスのインスタンスをTest01-resource内に作成し管理可能となります。
    * Test01-resourceを範囲としてCode EngineサービスのAdministratorとManagerロールを割り当てます。
    * Test01-resourceへのViewerロールを割り当てます。
* Test01-accessへユーザーを追加します。これにより、アクセス・グループの権限をユーザーに割り当てられます。

必要な管理者権限を持つユーザーが[ibmcloud login](https://cloud.ibm.com/docs/cli?topic=cli-ibmcloud_cli#ibmcloud_login)コマンドでログインし操作対象のアカウントが選択されているという前提で、以下の作業を実施します。

## リソース・グループ作成
リソース・グループ作成コマンド[ibmcloud resource group-create](https://cloud.ibm.com/docs/cli?topic=cli-ibmcloud_commands_resource#ibmcloud_resource_group_create)を実行します。
```shell:実行例
% ibmcloud resource group-create Test01-resource
Creating resource group Test01-resource under account (アカウントID) as (実行者のユーザーID)...
OK
Resource group Test01-resource was created.
Resource Group ID: a43d6b01544c465faf1cba85249e65f3
%
```
## アクセス・グループ作成
アクセス・グループ作成コマンド[ibmcloud iam access-group-create](https://cloud.ibm.com/docs/cli?topic=cli-ibmcloud_commands_iam#ibmcloud_iam_access_group_create)コマンドを実行します。
```shell:実行例
% ibmcloud iam access-group-create Test01-access -d 'テスト用アクセス・グループ'
Creating access group Test01-access under account (アカウント名) as (実行者のユーザーID)...
OK

Name:          Test01-access
ID:            AccessGroupId-a9c19a85-6948-490d-83fb-520eb1d0650b
Description:   テスト用アクセス・グループ
%
```
## アクセス・グループへのアクセス権限の割り当て
アクセス・グループ・ポリシーを作成する[ibmcloud iam access-group-policy-create](https://cloud.ibm.com/docs/cli?topic=cli-ibmcloud_commands_iam#ibmcloud_iam_access_group_policy_create)コマンドを実行します。
### Code Engine サービスのAdministratorとManagerロールを含むポリシー作成
```shell:実行例
% ibmcloud iam access-group-policy-create Test01-access --roles Administrator,Manager --service-name codeengine --resource-group-name Test01-resource
Creating policy for access group Test01-access under account (アカウントID) as (実行者のユーザーID)...
OK
Policy 93cc3155-c7c8-4093-a589-38833e114a85 for access group Test01-access was successfully created
             
Policy ID:   93cc3155-c7c8-4093-a589-38833e114a85
Version:     1-987fd257b86ded495554216305c64496
Roles:       Administrator, Manager
Resources:                         
             Resource Group ID     a43d6b01544c465faf1cba85249e65f3
             Resource Group Name   Test01-resource
             Service Name          codeengine
             Memo                  Policy applies to the resource(s) within the resource group
%
```
### リソース・グループへのViewerロールを含むポリシーの作成
`--resource`の値は、リソース・グループ作成時に返ってきた`Resource Group ID`の値です。
```shell:実行例
% ibmcloud iam access-group-policy-create Test01-access --roles Viewer --resource-type resource-group --resource a43d6b01544c465faf1cba85249e65f3
Creating policy for access group Test01-access under account (アカウントID) as (実行者のユーザーID)...
OK
Policy afcd0a66-df45-42e6-b97f-0d28e0a359a3 for access group Test01-access was successfully created
             
Policy ID:   afcd0a66-df45-42e6-b97f-0d28e0a359a3
Version:     1-4b3dc04d8c9933c7cb9374258df52825
Roles:       Viewer
Resources:                         
             Resource Group ID     a43d6b01544c465faf1cba85249e65f3
             Resource Group Name   Test01-resource
             Memo                  Policy applies to the resource group
%
```
### コマンドのパラメーターについて
このセクションは、`ibmcloud iam access-group-policy-create`コマンドに与えるパラメーターについて詳細を説明しています。Code Engine サービスへAdministratorとManagerロールを含むポリシー作成する際に、パラメーターの値がどこから取得できるのか調べてみました。
#### --service-nameの値
1. [ibmcloud catalog search](https://cloud.ibm.com/docs/cli?topic=cli-manage-catalogs-plugin#search-catalog)コマンドでIBM CloudのカタログからCode Engineを検索し、カタログ内のIDを調べます。
2. [ibmcloud catalog entry](https://cloud.ibm.com/docs/cli?topic=cli-ibmcloud_catalog#ibmcloud_catalog_entry)コマンドでサービスの詳細からName フィールドの値を取り出します。
```shell:ibmcloud catalog search コマンド実行例
% ibmcloud catalog search 'Code Engine'
Getting offerings...
OK
Name                                  ID                                     Kind
Code Engine                           2ad2fdd0-bba5-11ea-8966-5d6402fed1c7   service
Email Delivery, powered by Sendgrid   d1e3f0d2-0f49-ddfd-0eb9-2897b9d3a45d   iaas
OSS Record: Code Engine(codeengine)   oss.codeengine                         oss
Annotator for Clinical Data           f3a6bad0-297a-11e9-8bc5-bf215cf01ef0   service
%
```
```shell:ibmcloud catalog entry コマンド実行例
% ibmcloud catalog entry 2ad2fdd0-bba5-11ea-8966-5d6402fed1c7
Getting catalog entry...
OK
ID                                     Name         Kind      Group   Provider   Tags
2ad2fdd0-bba5-11ea-8966-5d6402fed1c7   codeengine   service   false   IBM        apidocs_enabled,cbr_enabled,codeengine,containers,fs_ready,ibm_created,ibm_release,rc_compatible,functions,serverless,cde,engne,engene,egnine,financialsector,telecommunications,lifesciences,retail,transportation,support_ibm
%
```
#### --rolesの値
サービスにより割り当て可能なロールが異なっています。[ibmcloud iam roles](https://cloud.ibm.com/docs/cli?topic=cli-ibmcloud_commands_iam#ibmcloud_iam_roles)コマンドで、サービスに定義済みのロールを取得できます。
```shell:実行例
% ibmcloud iam roles --service codeengine
Getting access policy roles of codeengine under account (アカウントのID) as (実行者のユーザーID)...
Display Name                        Name   CRN                                                                               Description
Manager                                    crn:v1:bluemix:public:iam::::serviceRole:Manager                                  As a manager, you have permissions beyond the writer role to complete privileged actions as defined by the service. In addition, you can create and edit service-specific resources.
Reader                                     crn:v1:bluemix:public:iam::::serviceRole:Reader                                   As a reader, you can perform read-only actions within a service such as viewing service-specific resources.
Writer                                     crn:v1:bluemix:public:iam::::serviceRole:Writer                                   As a writer, you have permissions beyond the reader role, including creating and editing service-specific resources.
Compute Environment Administrator          crn:v1:bluemix:public:codeengine::::serviceRole:ComputeEnvironmentAdministrator   Can manage Code Engine Compute Environments.
Service Configuration Reader               crn:v1:bluemix:public:iam::::role:ConfigReader                                    The ability to read services configuration for Governance management.
Viewer                                     crn:v1:bluemix:public:iam::::role:Viewer                                          As a viewer, you can view service instances, but you can't modify them.
Administrator                              crn:v1:bluemix:public:iam::::role:Administrator                                   As an administrator, you can perform all platform actions based on the resource this role is being assigned, including assigning access policies to other users.
Operator                                   crn:v1:bluemix:public:iam::::role:Operator                                        As an operator, you can perform platform actions required to configure and operate service instances, such as viewing a service's dashboard.
Editor                                     crn:v1:bluemix:public:iam::::role:Editor                                          As an editor, you can perform all platform actions except for managing the account and assigning access policies.
Key Manager                                crn:v1:bluemix:public:resource-controller::::role:KeyManager                      As an key manager, the service can perform platform actions required to manage resource keys, such as creating a new resource key for a resource instance.
%
```

### アクセス・グループへのユーザーの追加
アカウント内の既存ユーザーを追加する場合は、[ibmcloud iam access-group-user-add](https://cloud.ibm.com/docs/cli?topic=cli-ibmcloud_commands_iam#ibmcloud_iam_access_group_user_add)コマンドを実行します。
```shell:実行例
% ibmcloud iam access-group-user-add Test01-access (追加するユーザーID)
Adding (追加するユーザーID) to access group Test01-access as (追加するユーザーID)...
OK
(追加するユーザーID) added successfully
%
```
アカウントへのユーザー追加が必要な場合は、[ibmcloud account user-invite](https://cloud.ibm.com/docs/cli?topic=cli-ibmcloud_commands_account#ibmcloud_account_user_invite)コマンドを実行します。

最後にGUIで確認すると、以下の通りになりました。
![accessGroup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922552/4b9eab39-015f-9832-2ac6-1157b0c1df52.png)

## まとめ
この記事ではCLIによるリソース・グループとアクセス・グループの作成、アクセス・グループ・ポリシーの作成とアクセス・グループへのユーザーの追加をテストしました。手順やパラメータはTerraformを使用した操作にも応用できるため、今後テストし自動化手段への適用を検討できると考えられます。