Azure Spring Cloudでブルーグリーンデプロイメントする

https://qiita.com/official-events/22637c675c61a797a24f

<hr>

ブルーグリーンデプロイメントの話は勉強会で何回も聴いたことがあるのですが、実際に自分で手を動かして試したことはありませんでした。設定が大変そうだよなぁ、と思っていたのですが、Azure Spring Cloudでめちゃくちゃ簡単にできてびっくりしました。

手順はほぼこちらのドキュメントどおりです。

https://docs.microsoft.com/ja-jp/azure/spring-cloud/how-to-staging-environment

まずはAzure Spring Cloudインスタンスを作成します。画面でポチポチと作りました。間違えてBasicレベルを選択してしまったのですが、ブルーグリーンデプロイメントを試すにはStandardレベルが必要なのでご注意ください。（後から変えることは可能です）

![スクリーンショット 2021-04-25 22.03.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/d0895cab-84b0-7b5f-1e2a-c846e1246ea9.png)

インスタンスの準備はこれだけです。

続いてデプロイするアプリケーションを作成します。環境はDocker上のDebianで作りました。Azure CLIのAzure Spring Cloud 拡張機能が必要なため、以下の3行目で追加しています。


```dockerfile
FROM maven:3.8.1-openjdk-11

RUN curl -sL https://aka.ms/InstallAzureCLIDeb | bash
RUN az extension add --name spring-cloud
```

VSCodeの拡張機能[「Spring Initializr Java Support」](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-spring-initializr)でspring-boot-starter-webだけ追加したプロジェクトを作ります。

helloを表示するだけの簡単なアプリケーションです。

```java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;

@SpringBootApplication
@RestController
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

	@GetMapping("/hello")
	public String hello() {
		return "hello";
	}
}
```

ビルドします。

```
mvn clean packge -DskipTests
```

Azureにログインします。

```
az login
```

インスタンス上にdemoというアプリ（の雛形？）を作ります。

```
az spring-cloud app create -n demo -g springcloudrg -s kikutarospringcloud --assign-endpoint
```

デプロイします。

```
az spring-cloud app deploy -n demo -g springcloudrg -s kikutarospringcloud --jar-path target\demo-0.0.1-SNAPSHOT.jar
```

アプリのURLが表示されているので、末尾に /hello をつけてアクセスします。

![スクリーンショット 2021-04-26 19.40.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/24b7abd7-9b59-f947-cdd7-261cc1570111.png)

helloが表示されました。

![スクリーンショット 2021-04-26 13.02.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/be592604-2fd2-f1cf-a8be-e9d8181c860f.png)

続いて、更新したアプリケーション（グリーン）を作成してデプロイします。コードは「hello」を「hello new release!」に変えただけです。

```java
@GetMapping("/hello")
public String hello() {
    return "hello new release!";
}
```

ビルドします。

```
mvn clean packge -DskipTests
```

グリーンデプロイ（と呼ぶらしい）します。

```
az spring-cloud app deployment create -n green --app demo -g springcloudrg -s kikutarospringcloud --jar-path target\demo-0.0.1-SNAPSHOT.jar
```

私は最初以下のエラーになりました。

```
Basic sku only allows 1 deployment under one app.
```

これは最初に書いた通り、プランがBasicでブルーグリーンデプロイメントに対応していないためです。画面からStandardプランにアップグレードして、再度デプロイしたら成功しました。

![スクリーンショット 2021-04-26 12.58.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/eba8bfaa-69dd-cbe0-655d-06d39624ea7a.png)


デプロイメニューを見ると、defaultとgreenの2つが並んでいます。

![スクリーンショット 2021-04-26 12.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/10c693a8-1ebe-077c-a9c7-0b578f134e19.png)

あとはgreenの方のメニューから「運用環境として設定」を選べば、こちらに切り替わります。

![スクリーンショット 2021-04-26 13.01.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/e1fd1e3e-7c06-21ed-c56d-26662a00d23d.png)

切り替えて再度アクセスすると、ちゃんと「new release!」がついた新しいアプリケーションに切り替わっています。

![スクリーンショット 2021-04-26 13.01.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/d72949e7-448d-7274-5df8-05a359222136.png)

こんなに簡単にブルーグリーンデプロイメントができるんだ...！と地味に感動しました。（すごい今更ですが...）

Spring Cloudの話はかなり前に[JJUG](https://www.java-users.jp/)の勉強会で聴いていましたが、当時はなんとなく敷居が高そうだなぁ...と思って触っていませんでした。

今回、Azure Spring Cloudを触ってみましたが、すごく簡単でした。Spring Cloudについて改めて勉強したいなーと思いました。