[Cloud Storage API(V2)] JavaでバケットのIAMポリシーを更新する

Cloud Storage API V2(Java)を使用して、
Cloud StorageのバケットのIAMポリシーを更新する方法
についてご紹介します。

**IAM**
Identity and Access Managementの略で
リソースへのアクセス制御を管理する機能のことです。
リソースに対し、どのユーザーがどうアクセスするか等の
ルールのことをIAMポリシーと呼びます。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Cloud Storage API(V2)] JavaでCloud Storageを使う](https://qiita.com/doran/items/2a5f7ef8070fd5b8c94d)
を参照ください。
:::

|No|||目次|
|---|---|---|---|
|1|||[IAMポリシーを更新](#1-iamポリシーを更新)|
||1||[スコープ](#11-スコープ)|
||2||[実行](#12-実行)|
||3||[レスポンスの内容](#13-レスポンスの内容)|

## 1. IAMポリシーを更新
指定したバケットのIAMポリシーを更新します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
StorageScopes.CLOUD_PLATFORM
StorageScopes.DEVSTORAGE_FULL_CONTROL
```
[⧉[Cloud Storage API(V2)] JavaでCloud Storageを使う(2.2 Storageインスタンスを取得)](https://qiita.com/doran/items/2a5f7ef8070fd5b8c94d#22-storageインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行
getIamPolicy()でIAMポリシーを取得した後、その取得したPolicyに対して
更新内容を設定してください。

IMAポリシー取得の詳細は、
[⧉[Cloud Storage API(V2)] JavaでバケットのIAMポリシーを取得する](https://qiita.com/doran/items/edbdfa530f75241d2419)
を参照ください。

```java
public static void main(String[] args) throws Exception{
    String bucketId = "バケットID";
    
    Storage storage = getStorage();
    Storage.Buckets buckets = storage.buckets();
    
    Storage.Buckets.GetIamPolicy iamPolicy = buckets.getIamPolicy(bucketId);  
    Policy content = iamPolicy.execute();
    //更新内容を設定
    
    Storage.Buckets.SetIamPolicy policy = buckets.setIamPolicy(bucketId,content);
    
    Policy res = policy.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
PUT:　https:\//storage.googleapis.com/storage/v1/b/{バケットID}/iam
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

#### 1.2.3. リクエストボディ
Policyのsetメソッドにより、リクエストボディを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setBindings|List\<[Policy.Bindings](#policybindingsset)\>|一連のアクセス許可を伴うロールと、そのロールを持つプリンシパルとの関連付け|  
|setEtag|String|ポリシーのHTTPエンティティタグ|

#### Policy.Bindings(Set)
|メソッド|引数|説明|
|---|---|---|
|setCondition|[Expr](#exprset)|このバインディングに関連付けられた条件オブジェクト|

#### Expr(Set)
|メソッド|引数|説明|
|---|---|---|
|setDescription|String|条件の説明|

### 1.3. レスポンスの内容
#### Policy
|メソッド|戻り値|説明|
|---|---|---|
|getVersion|Integer|IAMポリシーのバージョン| 
|getKind|String|リソースの種類<br>固定文字列："storage#policy"|
|getResourceId|String|このポリシーが属するリソースID|
|getBindings|List\<[Policy.Bindings](#policybindings)\>|一連のアクセス許可を伴うロールと、そのロールを持つプリンシパルとの関連付け|
|getEtag|String|ポリシーのHTTPエンティティタグ|

#### Policy.Bindings
|メソッド|戻り値|説明|
|---|---|---|
|getRole|String|[Storageロール](#storageロール)|
|getMembers|List\<String\>|[基本ロール](#基本ロール)とプロジェクトIDを組み合わせた文字列<br><br>次の文字列を配列で返す<br>"projectOwner:{プロジェクトID}"<br>"projectEditor:{プロジェクトID}"<br>"projectViewer:{プロジェクトID}"
|getCondition|[Expr](#expr)|このバインディングに関連付けられた条件オブジェクト|

#### Expr
|メソッド|戻り値|説明|
|---|---|---|
|getTitle|String|条件のタイトル|
|getDescription|String|条件の説明|
|getExpression|String|Common Expression Language (CEL) のサブセットを使用した属性ベースの論理式|

#### 基本ロール
|ロール|概要|
|---|---|
|Viewer|既存のリソースやデータの表示(ただし変更ではない)など、状態に影響を与えない読み取り専用の権限|
|Editor|すべての閲覧者権限に加えて、既存のリソースの変更など、状態を変更するアクションに対する権限|
|Owner|すべての編集者の権限に加えて、次のようなアクションの権限|

#### Storageロール
|ロール|定義値|概要|
|---|---|---|
|Storage オブジェクト作成者|roles/storage.objectCreator|ユーザーによるオブジェクトの作成を許可|
|Storage オブジェクト閲覧者|roles/storage.objectViewer|オブジェクトとそのメタデータ（ACL を除く）を閲覧するためのアクセス権|
|Storage オブジェクト ユーザー|roles/storage.objectUser|オブジェクトとマネージド フォルダ、およびそれらのメタデータを作成、表示、一覧表示、更新、削除するためのアクセス権|
|ストレージ オブジェクト管理者|roles/storage.objectAdmin|オブジェクトの一覧表示、作成、表示、削除、オブジェクトの ACL の設定など、オブジェクトのすべてを管理できる権限|
|ストレージ フォルダ管理者|roles/storage.folderAdmin|オブジェクトとマネージド フォルダに対する完全な制御権限|
|Storage HMAC キー管理者|roles/storage.hmacKeyAdmin|プロジェクト内の HMAC キーのすべてを管理する権限|
|Storage 管理者|roles/storage.admin|オブジェクト ACL や IAM ポリシーの取得と設定など、バケット、マネージド フォルダ、オブジェクトに対する完全な制御権限|
|Storage Insights 管理者|roles/storageinsights.admin|Storage Insights のインベントリ レポートと構成に対する完全な制御権限|
|Storage Insights 閲覧者|roles/storageinsights.viewer|Storage Insights のインベントリ レポートと構成に対する読み取り専用アクセス権|
|Storage Insights コレクタ サービス|roles/storage.insightsCollectorService|インベントリ レポートのオブジェクト メタデータに対する読み取りアクセス権|

<br>
<br>
おしまい。。