- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2020-09-10T03:10:57+00:00","","")
#author("2020-09-10T05:44:19+00:00","","")
#mynavi(Azureメモ)
#setlinebreak(on);
#html(){{
<style>
.images img { border: 1px solid #333; }
</style>
}}
* 概要 [#p7a156d6]
#html(<div class="pl10">)
[[Gitea&DroneでCI/CD環境構築]] や [[Gitea&Drone&リバースプロキシ]] で構築した環境を Azure の仮想マシン上に作成し、
処理ソースを git push すれば Azure リソースを自動でデプロイする仕組みを構築する。
尚、Gitea、Drone の構築に関しては [[Gitea&DroneでCI/CD環境構築]] や [[Gitea&Drone&リバースプロキシ]] で実施した内容と変わらない為、
当記事では Azureリソースの デプロイや再起動に係る事項のみを記載する事とする。(下図のオレンジ枠のテキスト)
#html(){{
<div style="padding: 5px 10px; background: #fee; border-left: 4px solid #900;">
[補足]<br />
<a href="https://azure.microsoft.com/ja-jp/services/devops/pipelines/">Azure Pipelines</a> が利用できる場合は、多分そっちを利用した方が賢い。
</div>
}}
#html(<div class="images">)
&ref(azure_drone_image.png,nolink);
#html(</div>)
#html(</div>)
* 目次 [#kc283bd7]
#contents
- 関連
-- [[Azureメモ]]
-- [[Azure CLI の操作]]
-- [[Gitea&DroneでCI/CD環境構築]]
-- [[Gitea&Drone&リバースプロキシ]]
- 参考
-- [[Docker コンテナーでの Azure CLI の実行>https://docs.microsoft.com/ja-jp/cli/azure/run-azure-cli-docker?view=azure-cli-latest]]
* Drone Runner から Azureリソースを扱うには [#a07ce4d9]
#html(<div class="pl10">)
Azure CLI がセットアップ済みの docker イメージが公式で提供されているので、これを利用する。
(参考: [[Docker コンテナーでの Azure CLI の実行>https://docs.microsoft.com/ja-jp/cli/azure/run-azure-cli-docker?view=azure-cli-latest]] )
.drone.yml
#mycode2(){{
kind: pipeline
type: docker
name: default
steps:
- name: build
image: ....
commands:
- "....."
when:
branch:
- master
- name: deploy
# Azure CLI が利用できる dockerイメージ
image: mcr.microsoft.com/azure-cli
# az コマンドの発行
commands:
- "az ....."
- "az ....."
when:
branch:
- master
}}
#html(</div>)
* どうやってaz login するのか [#yfa78c87]
#html(<div class="pl10">)
az コマンドから Azureリソースを扱うには、事前に az login が必要になるが、このようなケース(自動運転)ではどのようなログイン方法が最適なのか。
以下のドキュメントをみる限り、サービス プリンシパルを使ってサインインするのが良さそう。
https://docs.microsoft.com/ja-jp/cli/azure/authenticate-azure-cli?view=azure-cli-latest#sign-in-with-a-service-principal
以下、抜粋
#html(){{
<div style="padding: 10px; background: #eee; border-left: 4px solid #333;">
サービス プリンシパルは、特定のユーザーに関連付けられていないアカウントであり、定義済みのロールによってアクセス許可を割り当てることができます。 <br />
サービス プリンシパルを使用した認証は、セキュリティで保護されたスクリプトやプログラムを記述するのに最適な方法で、アクセス許可の制限と、ローカルに保存された静的な資格情報の両方を適用できます。
</div>
}}
サービス プリンシパルの利用方法については、別記事 [[Azureサービスプリンシパルの使用]] に記載している為、ここでは省略する。
サービス プリンシパルの作成 及び 利用方法については、別記事 [[Azureサービスプリンシパルの使用]] に記載している為、ここでは省略する。
#html(</div>)
* 証明書を Drone runner に渡す方法 [#gd7163ca]
#html(<div class="pl10">)
サービスプリンシパルを使用して az login をする際のコマンドは以下のようになる。
証明書ベースのサービスプリンシパルを使用して az login をする際のコマンドは以下のようになる。
#myterm2(){{
az login --service-principal -u http://サービスプリンシパル名 -p ./my_cert.pem --tenant テナント
}}
Runner で drone-runner-docker を利用している場合、証明書(上記のmy_cert.pem) を渡すにはひと手間必要となる。
※サービスプリンシパル名やテナントは環境変数として渡すとして。
実際の .drone.yml は以下のようになる。( 参考: https://docker-runner.docs.drone.io/configuration/volumes/host/ )
https://docker-runner.docs.drone.io/configuration/volumes/host/
.drone.yml
#mycode2(){{
kind: pipeline
type: docker
name: default
steps:
- name: build
image: alpine
commands:
- "echo build!"
when:
branch:
- master
- name: deploy
image: mcr.microsoft.com/azure-cli
# 設定した volumes を runner 側の任意のpathにマウントする
volumes:
- name: pemfile
path: /tmp/my_cert.pem
commands:
- "echo deploy!"
- "az login --service-principal -u http://サービスプリンシパル名 -p /tmp/my_cert.pem --tenant テナントID >/dev/null"
- "az vm list-ip-addresses -o table"
when:
branch:
- master
# ホスト側にある証明書を runner 側で利用する為、 volumes の設定を行う
volumes:
- name: pemfile
host:
path: /path/to/my_cert.pem
}}
** 注意 [#c24d7db3]
#html(<div class="pl10">)
volumes を使用するにはDrone側で対象のリポジトリを信頼済みとしておく必要があり、この操作は管理者でしか行う事ができない。
#html(<div class="images">)
&ref(drone_repo_trusted.png,nolink);
#html(</div>)
#html(</div>)
** 補足 [#s8cf8363]
#html(<div class="pl10">)
サービスプリンシパル名やテナントIDは環境変数を参照する方が良いと思う。
以下docker-compose での利用例。
.env
#mycode2(){{
:
AZ_DEPLOY_TENANT=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
AZ_DEPLOY_SP=http://xxxxxxxxxxxx
AZ_SP_CERT=/tmp/my_cert.pem
}}
docker-compose.yml
#mycode2(){{
:
drone-runner:
image: drone/drone-runner-docker:latest
hostname: drone-runner
container_name: drone-runner
:
volumes:
- ./.env:/etc/drone.env:ro
:
environment:
:
DRONE_RUNNER_ENV_FILE: "/etc/drone.env"
}}
.drone.yml
#mycode2(){{
commands:
- "echo deploy!"
- "az login --service-principal -u ${AZ_DEPLOY_SP} -p ${AZ_SP_CERT} --tenant ${AZ_DEPLOY_TENANT} >/dev/null"
}}
#html(</div>)
#html(</div>)
* 補足 [#b61a5e5d]
#html(<div class="pl10">)
概要のイメージで示した 各Azure リソースのデプロイを行う為の .drone.yml の例を記載しておく。
#html(){{
<div id="tabs1">
<ul>
<li><a href="#tabs1-1">関数アプリ(Go)のデプロイ</a></li>
<li><a href="#tabs1-2">App Service のデプロイ</a></li>
</ul>
}}
// START tabs1-1
#html(<div id="tabs1-1">)
カスタムハンドラーを使用したGoの関数アプリをデプロイする例
#mycode2(){{
kind: pipeline
type: docker
name: default
steps:
- name: build
image: golang
commands:
- "GOOS=windows GOARCH=amd64 go build -o my_go_server"
when:
branch:
- master
- name: deploy
image: mcr.microsoft.com/azure-cli
volumes:
- name: pemfile
path: /tmp/my_cert.pem
commands:
- "echo deploy function app"
- "zip -r /tmp/functions.zip *"
- "az login --service-principal -u ${AZ_DEPLOY_SP} -p ${AZ_SP_CERT} --tenant ${AZ_DEPLOY_TENANT} >/dev/null"
- "az functionapp deployment source config-zip -g リソースグループ名 -n 関数アプリ名 --src /tmp/functions.zip"
when:
branch:
- master
volumes:
- name: pemfile
host:
path: /path/to/my_cert.pem
}}
#html(</div>)
// END tabs1-1
// START tabs1-2
#html(<div id="tabs1-2">)
コンテナ版のApp Service をデプロイする例
#mycode2(){{
kind: pipeline
type: docker
name: default
steps:
- name: "build and deploy"
image: mcr.microsoft.com/azure-cli
volumes:
- name: pemfile
path: /tmp/my_cert.pem
commands:
- "echo deploy app service"
- "az login --service-principal -u ${AZ_DEPLOY_SP} -p ${AZ_SP_CERT} --tenant ${AZ_DEPLOY_TENANT} >/dev/null"
- "az acr build --registry ACRレジストリ名 --image イメージ名 ."
- "az webapp restart --g リソースグループ名 -n アプリ名"
when:
branch:
- master
volumes:
- name: pemfile
host:
path: /path/to/my_cert.pem
}}
#html(</div>)
// END tabs1-2
#html(</div>)
// END tabs1
#html(<script>$(function() { $("#tabs1").tabs(); });</script>)
#html(</div>)