Disposable Cloud Environment (DCE) を試してみた

## はじめに

DX 技術本部の yu-yama です。

[Disposable Cloud Environment \(DCE\)](https://dce.readthedocs.io/en/latest/home.html) という AWS アカウントを**決めた期間**または**決めた予算**まで「リース」できるツールを少し触ってみたのでまとめます。

## TL;DR

インストールして動かしてみたが、期間指定しても予算指定しても超過した場合にリース終了とならなかった...

## DCE のコンセプト

[Disposable Cloud Environment \(DCE\)](https://dce.readthedocs.io/en/latest/home.html)  は、AWS アカウントまるごとユーザーにリースできるツールになります。

管理者は AWS アカウントに対していつまでリースするかの期間といくらまで使用できるかの予算を設定し、ユーザーに使ってもらうことが出来ます。

使用者が決められた予算額を超えて使用した場合、または決められた期間に達した場合、リース終了となり、AWSアカウントはリセット(全てのリソースが削除)され、他の使用者にリースできる状態となります。

費用と期間をコントロールできるので、個人学習や集合研修など意識せず高額なリソースを立ち上げる可能性がある場合でも安心してAWSアカウントを使用してもらうことが出来ます。 [^1]

![dce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/1c32454f-e8ec-068e-e3ad-cb2b494140d0.png)

## 事前準備

### 1. 管理側の AWSアカウント(マスターアカウント)

### 2. リースする AWSアカウント(子アカウント)
DCE は AWS アカウントの発行までは行ってくれません。事前にリースする AWS アカウントを用意します

  - **AWS マネジメントコンソールのサインインページの URL のエイリアスを作成しておくこと**
    - 作成しておかないとアカウント追加時にエラーで失敗します
            
    ![2021-06-29-16-55-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/8d5788bd-eed0-4f30-96a9-5e8a540f74ca.png)

    ![2021-06-29-16-55-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/cb45937e-e304-efd3-7163-eb606b79513b.png)

    ![2021-06-29-16-56-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/6795f0ef-97ab-f281-4459-089f4d67111b.png)

  - 親アカウントを信頼されたエンティティとして AdministratorAccess ポリシーをアタッチした IAM ロールを作成します

    ![2021-06-29-22-30-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/baed52a5-9f74-9e91-83c1-c984405a8647.png)

## 使用したDCEのバージョン

マスターアカウントに立てた ec2 に `linux amd64 v0.5.0` をインストールして検証

[Release v0\.5\.0  Optum/dce\-cli](https://github.com/Optum/dce-cli/releases/tag/v0.5.0)

※ dce version とすると `0.4.0` と返ってきますが `0.5.0` です ( [Issue](https://github.com/Optum/dce-cli/issues/86)) 

## DCE インストール

DCE をインストールします

-   DL

```bash
$ wget https://github.com/Optum/dce-cli/releases/download/v0.5.0/dce_linux_amd64.zip
```

-   実行可能ファイルを解凍

```bash
$ sudo unzip dce_linux_amd64.zip -d /usr/local/bin
```

-   インストール確認

```bash
$ dce version
```

 ![2021-06-29-16-20-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/0cd13ff1-c5ab-2237-be96-0f44df870c92.png)
`0.4.0` と表示されていますが `0.5.0` です

- **AdministratorAccess** を持つ IAM クリデンシャルを設定

```bash
$ aws configure
```

-   **DCE デプロイ時内部で git を呼ぶので git をインストール**
 
```bash
$ sudo yum install git -y
```

インストールしておかないと DCE 初期化時にエラーで失敗します

-   DCE 初期化

```bash
$ dce init
```

全部空白で `Enter`

-   DCE をデプロイして各リソースを作成

```bash
$ dce system deploy
```

  -   本当にリソースを作成して良いかダイアログが出るので yes
        ![2021-06-29-16-28-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/633012c7-d2c8-dca5-2888-ba40a69b8808.png)

  -   バージニア北部リージョンにリソースの作成が開始します

  -   終了後、各 AWS リソース(API Gateway、DynamoDB、Cognito etc)が作成されています
      例えば API Gateway(dce コマンド実行時内部的に呼び出して子アカウントの管理を行う)
      ![2021-06-29-16-31-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/e3749bea-c720-8f39-3a4c-03633ddfc73c.png)

      作成された DCE 設定ファイル(config.yaml)を確認し、API の host 名を控えます

```bash
$ view /home/ec2-user/.dce/config.yaml
```

![2021-06-30-11-41-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/bc65aa29-bf50-1aa9-4674-5221dfe50c49.png)

例では `wldbn3ku5m.execute-api.us-east-1.amazonaws.com`


## 子アカウントをDCEアカウントプールに追加

-   子アカウント追加

```bash
$ dce accounts add --account-id {子アカウント ID} --admin-role-arn {親アカウントが引き受ける Admin ロール ARN}
```

![2021-06-29-22-34-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/782aaab9-25ff-1c0a-b164-3a077a1ab0dc.png)

例では 
    子アカウントID `664329572141`
    親アカウントが引き受ける Admin ロール ARN `arn:aws:iam::664329572141:role/DCEMasterAccess`

-   追加した子アカウントのステータスが Ready になるまで少し待ちます...

      最初は NotReady
      ![2021-06-29-22-37-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/409a1b9f-3d97-48c3-8411-477875a30469.png)

      この時アカウント配下のリソースのリセットが行われているのですが、進捗は CodeBuild から参照できます
      ![2021-06-29-22-41-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/3153e1ee-209f-3d1c-07f0-0e728de10092.png)

      CodeBuild でステータスが成功となっていれば、DCE CLI でも完了(Ready)しています
      ![2021-06-29-22-42-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/f2572112-28a1-1925-1ae6-304abbf25469.png)

子アカウントが追加されました

## 子アカウントを使用するユーザーをCognitoに作成

DCE システムをデプロイした際に作成されている Cognito ユーザープールにユーザーを作成します

![2021-06-30-11-56-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/f9bce544-1ec6-12c4-749f-f891fc15a9ce.png)

-   ユーザーの作成
    ![2021-06-30-11-57-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/f833da47-37bd-e5af-2a4f-25e00addc7e3.png)

-   `quickstartuser` として作成してみます
    ![2021-06-30-11-57-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/200147f8-5729-5353-8bc5-1dd5e9cb3d5f.png)

## 子アカウントのリースを作成

-   予算1USD、期限7日[^2]でリースしてみます

```bash   
$ dce leases create --budget-amount {予算} --budget-currency {通貨} --email {予算通知先メールアドレス} --principal-id {Cognitoに作成したユーザー名}
```

![2021-06-29-22-50-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/7acbad24-1359-c24f-d784-e052fe0c269d.png)
    `1624974312 → 2021-06-29 22:45:12`
    `1625579110 → 2021-07-06 22:45:10`

## クライアントからリースされた子アカウントの AWS マネジメントコンソールにアクセス

-   [Release v0\.5\.0 Optum/dce\-cli](https://github.com/Optum/dce-cli/releases/tag/v0.5.0)から OS にあったクライアントをダウンロードします。(今回は Windowsで)

-   ダウンロードした zip を解凍します
    ![2021-06-29-23-02-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/55ced107-04dd-9a97-8e47-8938c4910469.png)

-   拡張子が付いていないので.exe を付加します
    ![2021-06-29-23-03-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/4acc9cef-1fec-d95f-fcee-665f26630395.png)

-   クライアントに DCE をインストール

```winbatch:コマンドプロンプト
dce.exe init
```

  マスターアカウントのAPIのホスト名を聞かれるので、DCE 設定ファイルで確認したホスト名を入力

![2021-06-30-11-43-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/92703176-4516-d1a9-4f8a-4009a41d0f91.png)

-   DCEログイン画面を表示する

    コマンドプロンプトで DCE ユーザーとして認証します 

    ```winbatch:コマンドプロンプト
    dce.exe auth
    ```

    ![2021-06-30-14-09-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/35f84362-99cd-2f86-1c7f-1fc2a96bfa2b.png)
    ブラウザが開き、ログイン画面が表示されます

    ![2021-06-30-14-10-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/51cca5bc-0b50-8f8e-bb0e-3d79c2a40638.png)

-   Cognito に作成したユーザー情報を入力

    ![2021-06-30-14-10-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/ee76be8f-8e51-b7b2-db85-87c79eb8dca8.png)

-   サインインに成功すると、Credentials が表示されます
    ![2021-06-30-14-11-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/46875034-fdd9-2315-1f6d-1b5e24c72c18.png)

-   Credentials をコピーして、コマンドプロンプトの Enter API Token に貼り付けます
    ![2021-06-30-14-12-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/acf1bacd-4bc5-c79f-26bd-d1dbdc310c0c.png)

-   認証情報を確認し、id(リースID)を確認します

```winbatch:コマンドプロンプト
dce.exe leases list
```

![2021-06-30-14-42-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/a3a8a8ed-f47e-5cec-0e87-96674b2aa305.png)

-   子アカウントのAWSマネジメントコンソールにアクセスします

```winbatch:コマンドプロンプト
dce.exe leases login --open-browser {リースID}
```

![2021-06-30-14-44-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/ad9e9c85-dc6b-3c0c-40d7-c826aecdc0c6.png)

-   ブラウザが開き、AWS マネジメントコンソールにアクセスできます
    ![2021-06-30-14-46-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/4e129d1e-e5c9-2c55-7830-1239aa7bbc21.png)

## しかし

**肝心の期間指定も予算指定も超過しているにも関わらずリースされっぱなしで返却されることはなかったのでした...**



## 子アカウントのリースを終了

お片付けの手順です

- 子アカウントのリースを終了させます

```bash
$ dce leases end -a {子アカウントID} -p {Cognitoに作成したユーザー名}
```

![2021-07-01_12h06_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/d7f4fb7f-01d5-c409-d395-5b619162f975.png)

- CodeBuildが走り、子アカウントのリセットが実施されます
![2021-07-01_12h08_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/25cc0814-ae82-5540-ad4c-e1521f9d9c97.png)

- 終了したことを確認
![2021-07-01_12h15_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/5b00bbea-0f83-441a-8609-ec2bfac42b90.png)

- 子アカウントのステータスを確認

    ![2021-07-01_12h21_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/598a6319-52f7-08ac-0222-4d6ae7b8c4b5.png)

    Readyとなり、リース可能な状態になっていることが確認できます

## 子アカウントをDCEアカウントプールから削除

- 子アカウントをDCEアカウントプールから削除

```bash
$ dce accounts remove {子アカウントID}
```

![2021-07-01_12h26_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/d3daa855-de63-2d55-a8c4-c06c6d8f88b7.png)

- 確認

```bash
$ dce accounts list
```

![2021-07-01_14h31_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/8a99f3d0-c841-f4a7-c627-087c5488a3af.png)

## DCEアンインストール

- DCE が作成したリソースを削除します

```bash
$ cd ~/.dce/.cache/module/
$ ../terraform/<version>/terraform destroy -auto-approve -no-color
```

![2021-07-01_14h45_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/dbed5bb7-477f-1cf0-0b30-4f312c7b6297.png)

以上でお掃除完了です

# 最後に

正しく機能が動作すれば使えるツールだと思うのですが、いずれの機能も確認することはできませんでした。
ネット上の情報も少なく調査はタイムアウトとなりました。
原因もし分かる方いらっしゃいましたらコメントにて指摘いただけますと大変うれしいです。


# 参考リンク

https://dce.readthedocs.io/en/latest/home.html

https://github.com/Optum/dce-cli

---

<iframe width="560" height="315" src="https://www.youtube.com/embed/1OM-23G7b-U" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



[^1]: ちゃんと動けば...
[^2]: パラメータを付けない場合、デフォルトで7日間となります