GoのWebアプリをAzure App Serviceにデプロイする

# はじめに

2022年11月、実験版ながら再びLinuxでのAzure App ServiceでGoがサポートされました。

- [Go available on App Service - Azure App Service](https://azure.github.io/AppService/2022/10/12/Go-on-AppService.html)

初代(?)は2017年12月にサポート対象外となりました。

- [AzureでWebアプリを稼働させる「App Service」とGo - Qiita](https://qiita.com/qt-luigi/items/1cbcdc9efb2f5b4ec6f8)

今回は、Goのコードがデプロイされて、組み込みイメージを使ってLinuxコンテナーでコンパイル＆実行されます。

デプロイ手順が「[app-service-linux-docs/use_go_with_appservice.md at master · Azure/app-service-linux-docs · GitHub](https://github.com/Azure/app-service-linux-docs/blob/master/HowTo/use_go_with_appservice.md)」で公開されています。こちらに従ってGoのWebアプリをAzure App Serviceにデプロイしてみましょう！

本記事は、macOS Monterey 12.6.1 + Go 1.19.3 にて試しています。

## 事前準備

- Azure アカウント
- Azure CLI
- Go 1.18 および 1.19

## サンプル アプリケーション

ディレクトリーを作成して、その中にカレントを移動させます。
ここではディレクトリー名を `hello` にしています。

```zsh
% mkdir hello
% cd hello 
```

`go mod init` コマンドにて、Goのコードを書くための準備をします。
パッケージの依存関係を管理する go.mod ファイルが作成されます。
最初の go.mod には、使用するGoのバージョンのみが追記されています。

```zsh
% go mod init hello
go: creating new go.mod: module hello
% ls
go.mod
% cat go.mod 
module hello

go 1.19
```

ファイル名を `main.go` として、Goのコードを書きます。
ここでは `vim` を使ってコーディングしています。

```zsh
% vim main.go
```

```Go
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", HelloServer)
	http.ListenAndServe(":8080", nil)
}

func HelloServer(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])
}
```

コードを書き終えたら、`main.go` ファイルを保存します。

`go fmt` コマンドにて、コードのフォーマットを整えます。

```zsh
% go fmt main.go 
main.go
```

`go run` コマンドにて、コードを実行します。

```zsh
% go run main.go
```

Webブラウザーにて、URL `http://localhost:8080/world/` にアクセスすると、「Hello, world!」が表示されます。

URLの最後の単語 `world` を別の単語に書き換えると、書き換えた内容が表示されます。（例：`gopher` に書き換えると「Hello, gopher!」になります。）

動作確認ができたら [Ctrl] + [C] キーで停止します。

## AzureでWebアプリを作成

`az login` コマンドを実行すると、Webブラウザーが起動しますので、Azureアカウントでログインします。

```zsh
% az login
A web browser has been opened at https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize. Please continue the login in the web browser. If no web browser is available or if the web browser fails to open, use device code flow with `az login --use-device-code`.
[
  {
    "cloudName": "AzureCloud",
    ...
    "user": {
      ...
      "type": "user"
    }
  }
]

```

`az webapp up` コマンドにて、ソースコード `main.go` をApp Serviceにデプロイします。

```zsh
az webapp up --runtime GO:1.18 --sku B1 --os Linux --logs
```

- `--runtime`：コードを実行させるGoのバージョンを指定します。
設定できる値は `az webapp list-runtimes` コマンドにて、確認できます。

```zsh
% az webapp list-runtimes --os linux --output table
Result
------------------
...
GO:1.19
GO:1.18
```

- `--sku`：App Service のサービスプランを指定します。
設定できる値は「[価格 – Linux 用 App Service | Microsoft Azure](https://azure.microsoft.com/ja-jp/pricing/details/app-service/linux/)」で確認できます。

- `--logs`：Webアプリ起動後、デプロイを指示したターミナル上にログを出力します。
ログ出力は[Ctrl] + [C] キーで停止します。

```zsh
The webapp '<app-name>' doesn't exist
Creating Resource group '<group-name>' ...
Resource group creation complete
Creating AppServicePlan '<app-service-plan-name>' ...
Creating webapp '<app-name>' ...
Configuring default logging for the app, if not already enabled
Creating zip with contents of dir /home/tulika/myGoApp ...
Getting scm site credentials for zip deployment
Starting zip deployment. This operation can take a while to complete ...
Deployment endpoint responded with status code 202
You can launch the app at http://<app-name>.azurewebsites.net
...
```

## アプリをブラウズする

Webブラウザーにて、デプロイ先のApp ServiceのURL `http://<app-name>.azurewebsites.net/world/` にアクセスすると「Hello, world!」が表示されます。

おめでとうGoざいます、GoのWebアプリがApp Serviceにデプロイされて動作していることを確認できました！

## リソースの後片付け

`az group delete` コマンドにて、リソースグループ名を指定して削除します。

```zsh
% az group delete --resource-group <resource-group-name>
```

## さいごに

コンテナー経由ながらネイティブ サポートの感覚で、再びGoでApp Serviceを使えるようになったのは、しかも最新バージョンのGoが使えるのは、嬉しい限りです！

外部パッケージの使用、.goファイルの構成、`main.go` 以外のファイル名など、これから色々と試して行きたいところです。成果が得られましたら、また記事を投稿します。

今度こそ(?)一般提供版になれるよう、皆さんもいっぱい使ってやってつかぁさい！q@w@p