WorkSpacesのメンテナンス画面を作る

WorkSpacesをVDIとして利用する際にAWSのUIだとOSイメージの反映（WorkSpacesのリビルド）が1つづつしかできず台数が増えれば増えるほど大変になります。もちろんAPIやCLIを使えば効率化できますが、画面で運用できればより担当者の選択肢が広がると思います。

## 最終的にやりたいこと
AWS SDK Javaを使ってWorkSpacesの簡易管理機能を作る
ECS（もしくはEC2）にデプロイして画面からWorkSpacesを管理したい

## 今回やりたいこと
WorkSpacesのSDKを初めて利用するので全体像含めて把握する。
一覧を取得して画面に表示する

## スプリングブート＋タイムリーフで構築する
**ビルド**

```gradle:build.gradle
plugins {
	id 'org.springframework.boot' version '2.5.0-SNAPSHOT'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
	maven { url 'https://repo.spring.io/milestone' }
	maven { url 'https://repo.spring.io/snapshot' }
}

dependencies {
	implementation platform('com.amazonaws:aws-java-sdk-bom:1.11.951')
	implementation 'com.amazonaws:aws-java-sdk-workspaces'
	compile('org.springframework.boot:spring-boot-starter-thymeleaf')
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}
```

**Java**
最終的にはロールで管理しますが、今回はアクセスキー＋シークレットで認証する

```java:DemoController.java
package com.example.demo.api;

import java.util.List;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.workspaces.AmazonWorkspaces;
import com.amazonaws.services.workspaces.AmazonWorkspacesClientBuilder;
import com.amazonaws.services.workspaces.model.Workspace;
import org.springframework.stereotype.Controller;

@Controller
public class DemoController {
  @RequestMapping("/hello")
  public ModelAndView hello(ModelAndView model) {
    BasicAWSCredentials awsCreds = new BasicAWSCredentials("アクセスキー", "シークレット");
    AmazonWorkspaces aws = AmazonWorkspacesClientBuilder.standard()
      .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
      .withRegion("ap-northeast-1")
      .build();
    List<Workspace> list = aws.describeWorkspaces().getWorkspaces();
    model.addObject("data", list);
    model.setViewName("hello");
    return model;
  }
}
```

**テンプレート**

```html:hello.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
    <table>
        <tr th:each="Workspace : ${data}" th:object="${Workspace}">
            <td th:text="*{workspaceId}"></td>
            <td th:text="*{directoryId}"></td>
            <td th:text="*{userName}"></td>
            <td th:text="*{ipAddress}"></td>
            <td th:text="*{state}"></td>
        </tr>
    </table>
</body>
</html>
```

こちらで利用しているWorkSpacesを一覧表示できました。複数ディレクトリ混在してしまっているので運用できる形で整備していきたいです。
また、今回AWSのWorkSpacesのSDK資料を読みつつ進めようと思っていましたが、途中からはほとんど読んでません。例えばWorkSpacesの一覧を表示する際ほかのサービスで良くありそうな　describeWorkspaces　を見てみるとList<WorkSpace>をリターンするgetWorkspaces()というメソッドを見つけることができました。自分はJavaのプログラム能力は低いと思いますが、その程度の自分でも理解できる命名規則や構成に一定のポリシーがあり、サービスを横断してルール化してあるのはすごく開発しやすくて感動しました。