2020年4月29日水曜日

GoでSubversionからパッケージをgo getして実行する(自マシン内完結型)

社内や個人でSubversionを使ってGoコードを管理しているGopherには朗報!?Go 1.14から、goコマンドはmoduleモードでSubversionリポジトリーをサポートしました。

しかしながら、具体的な手順がなかなか見つかりませんでした。そこで「自マシン内のSubversionサーバーに登録されたGoの外部パッケージを、自マシン内で取得して実行する」ことを色々と目標に試してみました。実際に動作した時は心の中でガッツポーツ!q@w@p

Subversionサーバーの構築

自マシンに「Subversion」と「Apache HTTP Server」をインストールします。

Apache HTTP Serverには、Subversionと連動してHTTP/HTTPS通信でアクセスできる仕組みが用意されています。

今回は、諸事情によりno_ssl版のためHTTP通信でアクセスした場合の内容となっています。openssl版&HTTPS通信であればスマートに進められるはずです。

ちなみに、Subversionからの外部パッケージの取得には、svnコマンドが使用されます。

本筋ではないため、具体的なインストールやセットアップについては割愛します。

Subversionリポジトリーの作成

svnadmin createコマンドで新規リポジトリーを作成します。

リポジトリー内に、branches/、tags/、trunk/、の定番ディレクトリーを作成します。

ここでは以下のパス構成を想定しています。

svn://127.0.0.1/go/trunk/src/

本筋ではないため、具体的な手順は割愛します。

GOPROXYとGOSUMDBの無効化

今回は、諸事情により外部へのインターネット接続が制限されているため、moduleに関する2つの環境変数の値を無効化します。

GOPROXYとGOSUMDBの初期値を確認します。

$ go env GOPROXY
https://proxy.golang.org,direct

$ go env GOSUMDB
sum.golang.org

GOPROXYとGOSUMDBに無効値を設定します。

$ go env -w GOPROXY=direct
$ go env -w GOSUMDB=off

GOPATH上への移動

以降、GOPATH上で作業します。GOPATHは以下のコマンドで確認できます。

$ go env GOPATH

外部パッケージをSubversionに登録

外部パッケージとして、Add()関数を持つcalcパッケージを用意します。

calc/ディレクトリーを作成します。

$ mkdir calc

calc/ディレクトリー内に移動します。

$ cd calc

modの初期化を行います。

$ go mod init

作成されたgo.modファイルのmodule行をURLパスに修正します。

修正前:

module calc

go 1.14

修正後:

module 127.0.0.1/svn/go/trunk/src/calc.svn

go 1.14

calc.goを作成します。

$ vim calc.go

package calc

func Add(x, y int) int {
return x + y
}

calc/ディレクトリーをSubversionにチェックインします。
# 私はsvnコマンドではなく、Eclipseでチェックインしています m(__)m

svn://127.0.0.1/go/trunk/src/
|
+--calc/
   |
   +--calc.go
   +--go.mod

メイン パッケージの作成

test/ディレクトリーを作成します。

$ mkdir test

test/ディレクトリー内に移動します。

$ cd test

modの初期化を行います。

$ go mod init

main.goファイルを作成します。

$ vim main.go

package main

import (
"fmt"

calc "127.0.0.1/svn/go/trunk/src/calc.svn"
)

func main() {
fmt.Println(calc.Add(1, 2))
}

外部パッケージURLのホストが自マシンの場合、IPアドレス(ここでは127.0.0.1)で指定します。localhostで指定すると「import path does not begin with hostname」エラーになります。

通常でしたら、ここでmain.goファイルを実行します。

$ go run main.go

この時、import句の"127.0.0.1/svn/go/trunk/src/calc.svn"にHTTPS通信でアクセスして自動で外部パッケージが取得されます。

https://127.0.0.1/svn/go/trunk/src/calc.svn?go-get=1

しかし、今回はHTTP通信のためエラーとなります。そのため、go getコマンドを実行して手動で外部パッケージを取得します。

通常、go getするURLにはHTTPS通信でアクセスします。

$ go get 127.0.0.1/svn/go/trunk/src/calc.svn

今回はHTTP通信のため、-insecure オプションを付けてgo getします。

$ go get -insecure 127.0.0.1/svn/go/trunk/src/calc.svn

main.goファイルを実行すると、外部パッケージ「calc」のAdd(1, 2)が実行されて、結果の3が標準出力されます!

$ go run main.go
3

メイン パッケージのモジュール情報

go.sumファイルが作成されます。

$ vim -R go.sum

127.0.0.1/svn/go/trunk/src/calc.svn v0.0.0-YYYYMMDD... h1:...=
127.0.0.1/svn/go/trunk/src/calc.svn v0.0.0-YYYYMMDD.../go.mod h1:...=

go.modファイルに外部パッケージが追加されます。

$ vim -R go.mod

module test

go 1.14

require 127.0.0.1/svn/go/trunk/src/calc.svn v0.0.0-YYYYMMDD... // indirect

気づいた点など

go getではデフォルトでHTTPS通信が行われています。
→Subversionと連動させるApache HTTP Serverはopenssl版を使いましょう。

Subversionの外部パッケージURLの最後には「.svn」が必要です。
→GihHub経由に慣れていると、なかなか気付けない。

import句にて、Subversion経由の外部パッケージには別名を付けて使用します。
→本ページでは"127.0.0.1/svn/go/trunk/src/calc.svn"にcalcと別名付けています。

関連するGoのソースコード
→使われているsvnコマンドの引数とかがわかります。

2020年4月26日日曜日

Azure SDK for Goを使う上での開発者向けツール

「Azure SDK for Go documentation」サイトの「Tools for developers using the Azure SDK for Go」ページを読み進めました。

本セクションでは、Azure SDK for Goを使用する上でGoコードを効率的に記述したりAzureサービスとシームレスに連携したりする開発者向けツールが紹介されています。

ここでは、対象ページの内容をベースとして、私なりの解説を加えてみます。

Azure CLI

AzureにはAPIを操作する方法として、WebブラウザーでログインしてのGUI操作、Azure SDKを使ってのコード操作の他に、Azure CLIによるコマンドライン操作が用意されています。


Azure CLIは az コマンドで操作を行い、Windowsは実行バイナリーで、macOSとLinuxはPython 3スクリプトでインストールされます。またDockerやAzure Cloud shellでも実行可能です。

CLIのメリットは、コマンドライン上で他のコマンドと組み合わせて一連の処理をスクリプト化して実行できる柔軟性の良さが挙げられます。

個人的には、Goのマルチプラットフォーム向けに処理速度の良さも含めた実行バイナリーを提供できるメリットを生かして「Azure CLIこそGoで!」と思うのですが、如何でしょうか?(Google社のパブリッククラウド「Google Cloud Platform」のCLIツールであるgcloudコマンドにも同様に思うところ)

Visual Studio Code

Visual Studio Code(以下、vscode)は、Microsoft社が提供しているオープンソースのコードエディターで、エクステンション(いわゆるプラグイン)をインストールすることで機能拡張でき、オートコンプリート、実装テンプレート、リファクタリング、デバッグなどの機能が追加されます。


Goコードを効率的にコーディングするためのエクステンションとして「ms-vscode.Go」がMicrosoft社員にて開発&サポートされており、デバッガーとして「delve」が対応しています。


2015年11月のvscodeのベータ版の公開時にms-vscode.Goも紹介され、当時はGopherとして「Microsoft社がGoへの取り組みもしっかり行なっている!」と感動しました。


本セクションでは、Azure サービスと連携するためのエクステンションがまとめられた「Azure Extension Pack」も紹介されていますが、


リンク先のエクステンション提供サイト「Marketplace」では非公開(unpublished)になっているため、今後は個々のAzureサービス用のエクステンションをインストールして使用することになります。

Azure DevOps プロジェクトでのCI/CD

Azure上にデプロイしているGoアプリケーションを継続的インティグレーション/継続的デリバリー(CI/CD:Continuous Integration/Continuous Delivery)するには、Azure DevOps Project パイプラインを使用します。これにより、gitリポジトリー上のGoアプリケーションのソースコードを直接Azureにデプロイしてテストすることができます。


depによる依存関係管理

Azure SDK for Goは、パッケージ(ライブラリー)の依存関係管理にdepを使用しています。


depはGoでパッケージ依存管理を行うためのプロジェクトとしてスタートしました。現在のGo本体には、これらの成果を反映した「Go Modules」が実装されています。Go Moludesの採用によりdepの開発も収束しており、今後はAzure SDK for GoもGo Modules化が進むと思われます。

2020年3月29日日曜日

「autorest」および「go-autorest」とは?

「Azure SDK for Go documentation」サイトの「Install the Azure SDK for Go」ページを読み進めています。

「Include the Azure SDK for Go in your project」セクションにて、GoでAzure サービスを使うには Azure/azure-sdk-for-go とは別に Azure/go-autorest もインポートする必要があるとの記述がありましたので、autorestについて少し調べてみました。

ちなみに Azure/go-autorest は Azure/azure-sdk-for-go をgo getした時に一緒にダウンロードされます。

  • go get -u -d github.com/Azure/azure-sdk-for-go/...

AzureのREST API

AzureにはREST APIが用意されており、各プログラミング言語はAzure SDKで用意されているHTTPクライアントを通じてこのAPIにアクセスし、Azureとの連携を図ります。

AzureのREST API 仕様はOpen API 仕様 形式で書かれており、また、公開されています。


Azure SDKで用意されているHTTPクライアントは、この仕様書をautorestに読み込ませて自動作成されています。

Azure/autorest

autorestは、Microsoft社が開発している汎用(Azure専用ではない)オープンソースのツールで、Open API 仕様 形式を読み込んでRESTful Webサービスにアクセスするクライアント ライブラリーを生成します。

OpenAPI 3.0をサポートしており、PowerShall、C#、Python、Java、TypeScript、Ruby、そしてGoのHTTPクライアント ライブラリーを生成できます。

Azure/go-autorest

go-autorestは、autorestで作成されたAzure SDK for Goのクライアント ライブラリーに対して、ゴルーチンを使ってHTTPリクエストを並列処理できる機能を追加するパッケージで、

  • Azure Active Directory 認証 ライブラリー (autorest/adal)
  • 日付型を正確にパースするパッケージ (autorest/date)
  • 型アサーション(autorest/to)
  • モック (autorest/mock)
  • バリデーション (autorest/validation)
  • ロガー (logger)

なども含まれています。

例:autorest/adal(Active Directory Authentication Library)

クライアント サービスでは、毎回ログイン画面からログインするのはわずらわしいため、リソースを操作するためのアプケーション IDである「サービス プリンシパル」を作成してアクセスします。


autorest/adal はサービス プリンシパルのトークンを扱うためのパッケージです。


今回で「Azure SDK for Go のインストール / Install the Azure SDK for Go」ページを読み終えたことになります。

P.S. これまで通りja-jpでアクセスしたのですが日本語ドキュメントが表示されなくなっていました... > Microsoftさん

2020年3月20日金曜日

「Azure SDK for Go」とは別の独自サービスパッケージ

「Azure SDK for Go のドキュメント」サイトの「Azure SDK for Go のインストール」ページを読み進みています。

「Azure SDK for Go を入手する」セクションにて、いくつかのAzure サービス用のパッケージは Azure/azure-sdk-for-go とは別に用意されているとの記述があり、それらは主にストレージ サービスとメッセージング サービスのパッケージです。

ストレージ サービス

File Storage(パッケージ:Azure/azure-storage-file-go)

  • Azure上に構築されたSMB プロトコルのファイル共有システム。
  • 汎用 OS(Linux, macOS, Windows、など)でのファイル共有で使用。

Blob Storage(パッケージ:Azure/azure-storage-blob-go)

  • ファイルをBLOBで扱うストレージ。
  • 大量データの蓄積や操作(アーカイブ、ランダム アクセス、データ解析、など)

Queue storage(パッケージ:Azure/azure-storage-queue-go)

  • RESTでのテキストメッセージをキューイングする。
  • Service Busと比べてキューイング(格納)に重きが置かれている。

Table storage(パッケージ:なし)

  • 分散Key-Valueストア。

メッセージング サービス

Service Bus(パッケージ:Azure/azure-service-bus-go)

  • TCP プロトコルのメッセージをキューイングしたりPub/Subで処理する。
  • Queue Storageと比べてメッセージングに重きが置かれている。

Event Hubs(パッケージ:Azure/azure-event-hubs-go)

  • HTTPS/AMQP/Kafka プロトコルの大量のイベントを受け取って、Kafka プロトコルに対応したサービスに振り分ける。
  • ビッグ データ向け。

Event Grid(パッケージ:なし)

  • 対応したAzure サービスからのイベントを受け取って、対応したAzure サービスに振り分ける。

サービスのパッケージが分家する動きは、Azure SDK for Goがベータ版だった時からあり、最初はストレージでした。

2020年3月15日日曜日

「Azure Stack」とは?

「Azure SDK for Go のドキュメント」サイトの「Azure SDK for Go のインストール」ページの「Azure SDK for Go を入手する」セクションにて、Azure SDK for GoはGo 1.8以上をサポートしているが、Azure Stack環境だとGo 1.9以上が必要だと書かれてあります。

「Azure Stack」は初めて見聞きするサービス名なので少し調べました。

Azure Stackは、グローバル Azureを利用できない企業などがオンプレミス環境で利用できる様にしたAzureの拡張機能です。

自社内にMicrosoft 認定 ハードウェア パートナーから提供されたAzure Stackをセットアップした物理 サーバーを構えることで、オンプレミスで利用したりグローバル Azureと連携させたりできます。

Azure Stackには3つの製品ファミリーがあります。

Azure Stack Hub

  • 仮想マシン、Webアプリ&関数、コンテナーなどを実行するサーバー製品。
  • 運用はオンプレミスで、グローバル Azureとの連携も可能。

Azure Stack Edge

  • 主にAI/ML向けでFPGAが組み込まれた1Uラックマウント型サーバー製品。
  • 処理したデータはネットワーク経由でグローバル Azureに転送。

Azure Stack HCI

  • Azure HCIを採用したサーバー製品。
  • サービスは仮想マシンとして実行してグローバル Azureと連携する。

個人的には、自社でサーバー用 Azureがインストールされた物理 サーバーを購入して運用するソリューション サービスだと解釈しました。

【用語の補足】

  • グローバル Azure:パブリック クラウド版 Azureのこと
  • オンプレミス (on-premise):自社内にハードウェアやソフトウェアを構築して情報システムを運用する形態。
  • HCI (Hyper Converged Infrastructure):CPU処理、ストレージ、ネットワークを仮想化して統合した基盤

2020年3月12日木曜日

「Azure SDK for Go」とは?

Azure SDK for Goは、マイクロソフト社のパブリッククラウド「Azure」をGoでコーディングして扱うためのSDK(ソフトウェア開発キット)です。

Apache License 2.0ライセンスのオープンソースソフトウェアであり、GitHub上で管理および開発されています。


最初のコミットは2014年8月11日で、2016年、2017年とベータ期間を経て、2018年2月12日のv14.0.0で正式リリースとなりました。


おおよそ毎月末にメジャーバージョンのアップデートが行われます。

現在では、日本語ドキュメントも公開され、サポートされるAzureサービスも増えています。


当時、他のプログラミング言語のSDKやドキュメントが出揃っていた中、Goだけがなかなか正式リリースされずヤキモキしたり、ベータ期間中にストレージ系のパッケージが本家から出たり戻ったりしていたのを眺めていたも良い思い出です。

まずは「Azure/azure-sdk-for-go」の README.md や「Go 開発者向けの Azure」のドキュメントを読み進め、どんなものなのか?何ができるのか?を見て行きます。

2020年3月8日日曜日

私の「AzureとGo」に関する発表資料

Azure SDK for Goウォッチャー(?)として、過去3回「AzureとGo」に関する発表資料を作成しました。

タイトル:Microsoft × Go
イベント:2016年2月20日(土) [岡山] Okayama ComCamp 2016 powered by MVPs
概要説明:マイクロソフト社の組織や製品とGoの関係について、通常セッションで発表させて頂いた「発表済」作品です。



タイトル:Microsoft Azure for Go
イベント:2017年3月25日(土) [東京] Go Conference 2017 Spring
概要説明:AzureでのGoの使われ処について通常セッションで申し込みましたが、残念ながら落選した「未発表」作品です。



タイトル:Just Azure Using Go (7 items)
イベント:2017年9月9日(土) [東京] JAZUG 7周年総会
概要説明:AzureとGoの関係についてLTセッションで申し込んでいましたが、病欠で不参加となった「未発表」作品です。



1勝2負で負け越し中。マイクロソフトさん、イベントでGoの発表をさせてください!q@w@p