はじめに
2022年11月、実験版ながら再びLinuxでのAzure App ServiceでGoがサポートされました。
初代(?)は2017年12月にサポート対象外となりました。
今回は、Goのコードがデプロイされて、組み込みイメージを使ってLinuxコンテナーでコンパイル&実行されます。
デプロイ手順が「app-service-linux-docs/use_go_with_appservice.md at master · Azure/app-service-linux-docs · GitHub」で公開されています。こちらに従ってGoのWebアプリをAzure App Serviceにデプロイしてみましょう!
本記事は、macOS Monterey 12.6.1 + Go 1.19.3 にて試しています。
事前準備
- Azure アカウント
- Azure CLI
- Go 1.18 および 1.19
サンプル アプリケーション
ディレクトリーを作成して、その中にカレントを移動させます。
ここではディレクトリー名を hello
にしています。
% mkdir hello
% cd hello
go mod init
コマンドにて、Goのコードを書くための準備をします。
パッケージの依存関係を管理する go.mod ファイルが作成されます。
最初の go.mod には、使用するGoのバージョンのみが追記されています。
% 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
を使ってコーディングしています。
% vim main.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
コマンドにて、コードのフォーマットを整えます。
% go fmt main.go
main.go
go run
コマンドにて、コードを実行します。
% 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アカウントでログインします。
% 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にデプロイします。
az webapp up --runtime GO:1.18 --sku B1 --os Linux --logs
-
--runtime
:コードを実行させるGoのバージョンを指定します。
設定できる値はaz webapp list-runtimes
コマンドにて、確認できます。
% az webapp list-runtimes --os linux --output table
Result
------------------
...
GO:1.19
GO:1.18
-
--sku
:App Service のサービスプランを指定します。
設定できる値は「価格 – Linux 用 App Service | Microsoft Azure」で確認できます。 -
--logs
:Webアプリ起動後、デプロイを指示したターミナル上にログを出力します。
ログ出力は[Ctrl] + [C] キーで停止します。
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
コマンドにて、リソースグループ名を指定して削除します。
% az group delete --resource-group <resource-group-name>
さいごに
コンテナー経由ながらネイティブ サポートの感覚で、再びGoでApp Serviceを使えるようになったのは、しかも最新バージョンのGoが使えるのは、嬉しい限りです!
外部パッケージの使用、.goファイルの構成、main.go
以外のファイル名など、これから色々と試して行きたいところです。成果が得られましたら、また記事を投稿します。
今度こそ(?)一般提供版になれるよう、皆さんもいっぱい使ってやってつかぁさい!q@w@p