概要
Azure WebApps 便利ですね!
でも、作っては捨ててという開発スタイルが全盛の中、できれば停止している間は課金されたくないとなると、毎回WebAppsを作り直しということになります。
さらに、開発途中のものは、特定の箇所からしかアクセスさせたくない、というような要望があるときには、
IP制限をしようと思っても、azコマンドでは現時点(2019年12月3日現在)できない仕様となっています。
現在、新しいアクセス制限機能向けの CLI または PowerShell はありませんが、Resource Manager のアプリ構成で Azure REST API の PUT 操作を使用して値を手動で設定できます。 たとえば、resources.azure.com を使用して ipSecurityRestrictions ブロックを編集して、必要な JSON を追加することができます。
開発環境をつくるのにAzure DevOpsを使っていまして、Azure Pipelineによくお世話になっています。
今回は、Azure PipelineからAzure cliを使ってIPアドレス制限つきのWebAppsを立てる方法をご紹介します。
作業内容
サービスプリンシパルの取得
こちらのような方法に従って、サービスプリンシパルを取得します。
欲しいのは、client_idとclient_secretの2つです。
PipelineのAzure cliにて
認証トークンの取得
echo 'Getting a authentication token.'
token=$(curl -X POST https://login.microsoftonline.com/${TENANT_ID}/oauth2/token \
-F grant_type=client_credentials \
-F resource=https://management.core.windows.net/ \
-F client_id=${CLIENT_ID} \
-F client_secret=${CLIENT_SECRET} | jq -r .access_token)
${TENANT_ID}
には、AzureのテナントIDを、${CLIENT_ID}
, ${CLIENT_SECRET}
には先ほどのサービスプリンシパル作成手順で取得した2つの項目を入れます。
後のgrant_typeやresouceについては、固定値です。
このようにすると、認証トークンがtokenに格納されます。
WebAppsの作成
echo 'Create a webapps'
# webappの作成
az webapp create -g **** \
-p **** \
-n **** \
-i **** \
--subscription ${SUBSCRIPTION}
WebAppの作成を行います。ここは特に説明は不要かと思うので省略します。
firewall設定の追加
Azure PipelineのAzure cliではcurlが標準で使えるので、先に取得したOAuthのトークンを使ってREST APIを呼び出します。
echo 'Add a firewall settings'
curl -X PUT https://management.azure.com/subscriptions/${SUBSCRIPTION}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Web/sites/${WEBAPP_NAME}/config/web?api-version=2018-02-01 \
-H 'Content-Type:application/json' \
-H 'Accept-Encoding:gzip,deflate' \
-H "Authorization: Bearer ${token}" \
-d @- << EOF
{
"properties": {
"ipSecurityRestrictions": [
{
"ipAddress": "xxx.xxx.xxx.xxx/32", "action": "Allow", "tag": "Default", "priority": 100, "name": "HOGE"
},
{
"ipAddress": "yyy.yyy.yyy.yyy/32", "action": "Allow", "tag": "Default", "priority": 300, "name": "BAR"
}
]
}
}
EOF
項目 | 値 | 備考 |
---|---|---|
${SUBSCRIPTION} | AzureのサブスクリプションID | 契約固有のID |
${RESOURCE_GROUP} | WebAppsを作成したリソースグループ名 | 先に作成したWebAppsとあわせる |
${WEBAPP_NAME} | WebAppsの名前 | 先に作成したWebAppsとあわせる |
${token} | 認証トークン | 「認証トークンの取得」の項目で取得した値 |
この表のようにエンドポイント、ヘッダー情報を埋めましたら、あとはjson本文に指定したいIPアドレス情報を記載します。
このjsonについては、画面で設定できる項目と同じなので、すぐにイメージできるかと思います。
おわりに
いつか、こんな面倒くさいやり方をせずともazコマンドでできる日がくるかと思います。
いますぐfirewallの設定をAzure Pipelineからやりたい!という稀有な人に役立つと良いかなぁ