個人的に Azure で一番わかりにくいのが認証回りです。特に Azure Active Directory を使ってディレクトリが追加されたタイミングで、さらにわけが分からなくなりました。
例えば Azure に対する操作を自動化したい時に Azure にログインするアカウントを使うわけにはいかないので、別に操作権限を絞ったアカウントを用意したいわけです。一応サービスプリンシパルを使うことになってますが、これの作成が非常にわかりにくい。
自動化のためにスクリプトから使いたいだけなのに、何故か URL が 2 つ要求されるんですよね。それぞれ何を指定すればいいのかわからないので、明らかに説明が足りてないです。
PowerShell を使うと 3 行みたいですが、ポータルだとそもそも作れるのかどうか怪しいです。
そんな感じでサービスプリンシパルを作るのが非常に嫌だったのですが、今 Python で新しく作られている途中の Azure CLI 2.0 には 1 行でサービスプリンシパルを作る機能がありました。
インストールは Ubuntu 16.04 な VM に対して pip を使って入れました。
で、肝心のサービスプリンシパルを作る方法は以下の 1 行だけで済みます。PowerShell とは異なり、割り当てるロールも同時に指定できるのでシンプルです。
az ad sp create-for-rbac -n "http://my-app" --role contributor
ドキュメントにロールは Contributor ぐらいがいいよとあったので、とりあえずそのまま指定しています。
URL は単なる識別子なので、別にどんなものを使っても構わないようです。適当に指定しておけば問題ありません。実行すると自動生成されたパスワードなど、ログインに必要な情報が取得できます。
パスワードはこのタイミングでしか取得できない気がするので忘れないようにしましょう。
az login に --service-principal パラメータを追加すると、サービスプリンシパルとしてログインできます。この時に tenantId も忘れずに渡す必要があります。
az login --service-principal -u "http://my-app" -p <password> --tenant <tenant>
ユーザー名が URL になっているのが少し気持ち悪いですが、問題なくログインが行えます。
Active Directory アプリケーションの作成に必要な情報は Azure CLI 側で自動生成してくれるので、最小限の情報だけで簡単にサービスプリンシパルが作成できるようになって嬉しいです。
これで AppVeyor や CircleCI から簡単に Azure のリソースを操作できるので幅が広がりそうです。