LoginSignup
0

More than 3 years have passed since last update.

Azure WebAppsでIP制限をつける

Posted at

概要

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からやりたい!という稀有な人に役立つと良いかなぁ

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0