Linux のAzure Web Appsをデプロイしてみた

 

Linux のWeb Apps のデプロイをAzure PortalとAzure Resource Manager(ARM)テンプレートの2つパターンで実施してみました。

ARMテンプレート利用時には、以下の点に対応してみました。

    • 既存のApp Serviceプランを利用するか、新規に作成するかを選べるようにしてみました。
    • Power Shellを使ってデプロイする場合に、ARMテンプレートのパラメータをCSVから読み込むようにして再利用しやすいようにしています。

※ARMテンプレートをWindowsと共通にしたかったのですが、linuxFxVersionという項目があり無理でした。

ARMテンプレートを使ってデプロイするにあたっては、以下の3つのファイルを作成しています。

    • Web Apps(Linux用) を定義するARMテンプレート(JSONファイル)
    • Web Apps(Linux用) プランのパラメータを指定するCSV
    • ARMテンプレートをデプロイするPower Shell

作成したものは GitHub上にも公開しております。

https://github.com/Tama-negi/Li-akb-branch-office/tree/PowerShell_Azure/WebApps_Linux_Template_20200528

 

App Serviceプラン単体での作成は、前回実施していますのでこちらの記事も併せて参考にして頂ければと。

Azure App Service プランを単体で作ってみた

 

1 .Azure Portal上でLinuxのWeb Appsを新規作成する

Azure Portalを利用して、Linux のApp Service を作成します。

Azure Portal上のすべてのサービスでApp Serviceと入力すると、App Serviceのメニューが表示されれますのでこれを選択します。

+追加をクリックします。

一般的な使い方で指定するのは、以下の内容になるかと思います。実際に利用するリソースに合わせて設定します。

    • リソースグループ
    • 名前
    • 公開(Dockerコンテナを利用するか(今回はコードを選択))
    • ランタイムスタック(使用する開発言語(これを選ぶとオペレーティングシステムも自動選択されます)
    • オペレーティングシステム
    • 地域(ロケーション)
    • AppServiceプラン名
    • Application Insightsの利用可否(利用できる組み合わせには制限があり、LinuxとPHPの構成では利用不可です。)
    • タグ

リソースグループ、Web Apps名、公開(コンテナの利用等)、ランタイムスタック、地域(ロケーション)やApp Serviceプラン名を選択し、次へクリックします。オペレーティングシステムはWeb Apps利用時に選択されるランタイムスタックにより自動的に選択されます。

次に監視の設定を実施します。利用できる組み合わせには制限があり、LinuxとPHPの構成では利用不可な為、”いいえ”のままにします。

次にタグの設定を実施します。必要に応じて適時付与します。

設定したら、確認および作成をクリックします。確認画面が表示されますので、作成をクリックします。

完了するとLinuxのWeb Apps が作成されます。

 

2 .LinuxのWeb AppsのAzure Resource Manager(ARM)テンプレート

マイクロソフト様が公開されているサイトを参考にし、Web AppsのARMテンプレートを作成してみました。

https://github.com/Azure/azure-quickstart-templates/tree/master/101-webapp-basic-linux

以下の点を修正しています。

    • Conditionを利用して、既存のApp Serviceプランを利用するかどうかを選ぶようにしてみました。パラメータにnewOrExistingを追加しています。newを指定した場合は新規にApp Serviceプランが作成され、existingを指定すると既存のものを利用します。
    • App Serviceプラン部分は前回記事で作成のものを利用しています。

結果、Web AppsのARMテンプレートはこういう形になりました。Linux用のARMテンプレートなので、Kind(linux)やreserved(true)を固定値で設定する事も可能です。

{

  “$schema”: “https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#”,
  “contentVersion”: “1.0.0.0”,
  “parameters”: {
    “webAppName”: {
        “type”: “string”,
        “defaultValue” : “AzureLinuxApp”,
        “metadata”: {},
        “minLength”: 2
    },
    “appServicePlanName”:{
        “type”: “string”,
        “defaultValue” :”[concat(‘AppServicePlan-‘, parameters(‘webAppName’))]”,
        “metadata”: {}
    },
    “sku”: {
        “defaultValue”: “Basic”,
        “type”: “string”,
        “allowedValues”: [
            “Basic”,
            “Standard”,
            “PremiumV2”
        ]
    },
    “skucode”: {
        “defaultValue”: “B1”,
        “type”: “string”,
        “allowedValues”: [
            “B1″,”B2″,”B3”,
            “S1″,”S2″,”S3”,
            “P1v2″,”P2v2″,”P3v2”
        ]
    },
    “reserved”: {
            “defaultValue”: “true”,
            “type”: “bool”,
            “metadata”: {}
    },
    “kind”: {
            “type”: “string”,
            “allowedValues”: [
                “linux”,
                “app”
                ]
     },
    “linuxFxVersion” : {
        “type”: “string”,
        “defaultValue” : “PHP|7.3”,
        “metadata”: {}
    },
    “location”: {
      “type”: “string”,
      “defaultValue”: “[resourceGroup().location]”,
      “metadata”: {
      }
    },
    “newOrExisting”: {
        “type”: “string”,
        “allowedValues”: [
            “new”,
            “existing”
            ]
    }
  },
  “variables”: {},
   “resources”: [
        {
    “condition”: “[equals(parameters(‘newOrExisting’), ‘new’)]”,
    “apiVersion”: “2018-11-01”,
            “type”: “Microsoft.Web/serverfarms”,
            “name”: “[parameters(‘AppServicePlanName’)]”,
            “location”: “[parameters(‘location’)]”,
            “kind”: “[parameters(‘kind’)]”,
            “tags”: {},
            “properties”: {
                “name”: “[parameters(‘AppServicePlanName’)]”,
                “reserved”: “[parameters(‘reserved’)]”
            },
            “sku”: {
                “Tier”: “[parameters(‘sku’)]”,
                “Name”: “[parameters(‘skuCode’)]”
            }
        },
        {
      “type”: “Microsoft.Web/sites”,
      “apiVersion”: “2018-11-01”,
      “name”: “[parameters(‘webAppName’)]”,
      “location”: “[parameters(‘location’)]”,
      “kind”: “linux,app”,
      “dependsOn”: [
        “[resourceId(‘Microsoft.Web/serverfarms’, parameters(‘appServicePlanName’))]”
      ],
      “properties”: {
        “serverFarmId”: “[resourceId(‘Microsoft.Web/serverfarms’, parameters(‘appServicePlanName’))]”,
        “siteConfig”: {
            “linuxFxVersion”: “[parameters(‘linuxFxVersion’)]”
          }
      }
    }
  ]
}

 

3.LinuxのWeb Appsのパラメータ設定CSV作成する

Web Apps を作成する為にCSVから読み込むパラメータは以下の通りになります。リソースグループ名はデプロイ先のリソースグループ名になります。

    • リソースグループ(ResourceGroupName)
    • Web Apps名(webAppName)
    • App Serviceプラン名(AppServicePlanName)
    • オペレーティングシステム(reserved,Kind)
    • 地域(location)
    • App Serviceプランの価格レベル(sku,skucode)
    • ランタイムスタック(RuntimeStackVersion)
    • 新規作成か既存利用か(newOrExisting)

上記を踏まえてCSVをサンプルで作成以下のようになります。(RuntimeStackVersionで改行を入れてますので実施に利用時は抜いてください。)

#新規作成の場合
ResourceGroupName,location,webAppName,AppServicePlanName,sku,skucode,reserved,kind,
RuntimeStackVersion,newOrExisting

RG1,japaneast,wbapps-01,app-service-plan-001,Basic,B1,true,linux,PHP|7.3,new
 
#既存作成の場合(事前に作成した、app-service-plan-001を利用する場合)
ResourceGroupName,location,webAppName,AppServicePlanName,sku,skucode,reserved,kind,
RuntimeStackVersion,newOrExisting

RG1,japaneast,wbapps-01,app-service-plan-001,Basic,B1,true,linux,PHP|7.3,existing

4.LinuxのWeb AppsをARMテンプレート+Power Shellでデプロイする

ARMテンプレートのパス、CSVのパスを指定してARMテンプレートをデプロイするPower Shellを実行します。

ARMテンプレートをデプロイするPower Shellは下記のようになりました。

#Web Apps Template For Linux Deploy
#基本設定
#webAppName Web Apps名
#AppServicePlanName AppServicePlan名
#location リージョン名
#sku プラン名(Basic,Standard,PremiumV2)、
#skucode インスタンス名(B1等)
#kind (linux)
#linuxFxVersion(RuntimeStackVersion)(ランタイムスタック)
#newOrExisting(新規作成 Or 既存利用)

$TemplateFilePath = “ARMテンプレートのパス”
$ImportCSVPath = “CSVファイルのパス”

# Inclued Configure Entries
$csv = Import-Csv -path $ImportCSVPath 

# Template Deploy
foreach( $c in $csv ){

# Bool Value
[Bool]$boolValue = [System.Convert]::ToBoolean($c.reserved)

New-AzResourceGroupDeployment `
  -ResourceGroupName $c.ResourceGroupName `
  -TemplateFile $TemplateFilePath `
  -webAppName $c.webAppName `
  -AppServicePlanName $c.AppServicePlanName `
  -location $c.location `
  -sku $c.sku `
  -skucode $c.skucode `
  -reserved $boolValue `
  -kind $c.kind `
  -linuxFxVersion $c.RuntimeStackVersion `
  -newOrExisting $c.newOrExisting `
}

デプロイが成功すると、Power Shellの実行ログにProvisioningState : Succeededと表示され、実際にPortal上で確認すると設定通り出来ている事が確認できます。

 

Azure App Service プランを単体で作ってみた

 

App Service プランを単体での作成をやってみました。Azure Portalで作成した後、ARMテンプレートでもやってみました。

App Service プラン自体は、App Service作成時にも作れますが、今回は勉強を兼ねて事前に作成してみました。

App Service プランは、App Service利用する為のリソース利用料になります。

https://azure.microsoft.com/ja-jp/pricing/details/app-service/plans/

App Serviceを作成時にリソースとして指定されるもので、機能やリソースによって価格が決まります。

https://azure.microsoft.com/ja-jp/pricing/details/app-service/windows/

 

ARMテンプレートを使ってデプロイするにあたっては、以下の3つのファイルを作成しています。ARMテンプレートを使った場合は、複数のコンテナーを一括でデプロイできるようにパラメータをCSVから読み込むようにしています。

    • App Service プランを定義するARMテンプレート(JSONファイル)
    • App Service プランのパラメータを指定するCSV
    • ARMテンプレートをデプロイするPower Shell

作成したものは GitHub上にも公開しております。

https://github.com/Tama-negi/Li-akb-branch-office/tree/PowerShell_Azure/AppServicePlan_Template_20200524

1 .Azure Portal上でApp Service プランを新規作成する

Azure Portalを利用して、App Service プランを作成します。

Azure Portal上のすべてのサービスでApp Service Planと入力すると、App Service プランのメニューが表示されれますのでこれを選択します。

App Service プランに移動しますので、+追加をクリックします。

一般的な使い方で指定するのは、以下の内容になるかと思います。実際に利用するリソースに合わせて設定します。

    • リソースグループ
    • 名前
    • オペレーティングシステム
    • 地域(ロケーション)
    • 価格レベル
    • タグ

まず、リソースグループ、名前、オペレーティングシステム、価格レベルを選択し、次へクリックします。オペレーティングシステムはApp Service利用時に選択するフレームワークにより選択します。.Net環境を利用するのであればWindows、PHPならばLinuxという感じです。現時点ではコンテナの場合はLinuxの方が選べるロケーションが多いようです。

次にタグの設定を必要に応じて実施します。

設定したら、確認および作成をクリックします。確認画面が表示されますので、作成をクリックします。App Service プランが作成されます。

.App Service プランのAzure Resource Manager(ARM)テンプレート

マイクロソフト様が公開されているサイトを参考にし、App ServiceプランのARMテンプレートを作成してみました。

https://docs.microsoft.com/ja-jp/azure/templates/microsoft.web/serverfarms

以下の点を修正しています。

    • skuやskucodeのデフォルト値はBasic前提にしてます。Isolatedも使わなかったので抜いてます。利用環境に合わせて適時修正下さい。
    • reservedとkindはパラメータで指定するようにしています。

結果、App ServiceプランのARMテンプレートはこういう形になりました。

{
    “$schema”: “http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#”,
    “contentVersion”: “1.0.0.0”,
    “parameters”: {
        “AppServicePlanName”: {
            “type”: “string”
        },
        “location”: {
            “defaultValue”: “[resourceGroup().location]”,
            “type”: “string”
        },
        “sku”: {
            “defaultValue”: “Basic”,
            “type”: “string”,
            “allowedValues”: [
                “Basic”,
                “Standard”,
                “PremiumV2”
                ]
        },
        “skucode”: {
            “defaultValue”: “B1”,
            “type”: “string”,
            “allowedValues”: [
                “B1″,”B2″,”B3”,
                “S1″,”S2″,”S3”,
                “P1v2″,”P2v2″,”P3v2”
                ]
        },
        “reserved”: {
            “defaultValue”: “true”,
            “type”: “bool”,
            “metadata”: {}
        },
        “kind”: {
            “type”: “string”,
            “allowedValues”: [
                “linux”,
                “app”
                ]
        }
     },
    “variables”: {},
    “resources”: [
        {
            “apiVersion”: “2018-11-01”,
            “type”: “Microsoft.Web/serverfarms”,
            “name”: “[parameters(‘AppServicePlanName’)]”,
            “location”: “[parameters(‘location’)]”,
            “kind”: “[parameters(‘kind’)]”,
            “tags”: {},
            “properties”: {
                “name”: “[parameters(‘AppServicePlanName’)]”,
                “reserved”: “[parameters(‘reserved’)]”
            },
            “sku”: {
                “Tier”: “[parameters(‘sku’)]”,
                “Name”: “[parameters(‘skuCode’)]”
            }
        }
    ]
}

 

3.App Serviceプランのパラメータ設定CSV作成する

App Serviceプランを作成する為にCSVから読み込むパラメータは以下の通りになります。リソースグループ名はデプロイ先のリソースグループ名になります。

    • リソースグループ(ResourceGroupName)
    • 名前(AppServicePlanName)
    • オペレーティングシステム(reserved,Kind)
    • 地域(location)
    • 価格レベル(sku,skucode)
    • タグ(今回は未指定)

オペレーティングシステムの組み合わせは下記の通りになります。Windowsの場合は指定がappになります。また同じリソースグループにWindowsとLinuxのデプロイはエラーになります。(現時点でのAzureでの仕様になります。)

    • Linuxの場合は、reservedをtrue、kindをlinuxに指定します。
    • Windowsの場合は、reservedをfalse、kindをappに指定します。

上記を踏まえてCSVをサンプルで作成以下のようになります。

RG1にLinux(B1)、RG2にWindows(S1)でデプロイする想定にしています。

ResourceGroupName,location,AppServicePlanName,sku,skucode,reserved,kind,
RG1,japaneast,app-service-plan-001,Basic,B1,true,linux,
RG2,japaneast,app-service-plan-002,Standard,S1,false,app,

4.App ServiceプランをARMテンプレート+Power Shellでデプロイする

ARMテンプレートのパス、CSVのパスを指定してデプロイを実施します。

reservedについては、bool形式である為StriingからBoolに変換ししています。

#AppServicePlan Template Deploy

#基本設定
#Name AppServicePlan名
#location リージョン名
#sku プラン名(Basic,Standard,PremiumV2)、
#skucode インスタンス名(B1等)
#kind (linux or Win)(Winの場合はappと指定する)

$TemplateFilePath = “ARMテンプレートのパス”
$ImportCSVPath = “CSVファイルのパス”

# Inclued Configure Entries
$csv = Import-Csv -path $ImportCSVPath 

# Template Deploy
foreach( $c in $csv ){

# Bool Value
[Bool]$boolValue = [System.Convert]::ToBoolean($c.reserved)

New-AzResourceGroupDeployment `
  -ResourceGroupName $c.ResourceGroupName `
  -TemplateFile $TemplateFilePath `
  -location $c.location `
  -AppServicePlanName $c.AppServicePlanName `
  -sku $c.sku `
  -skucode $c.skucode `
  -reserved $boolValue `
  -kind $c.kind
}
 

デプロイが成功すると、Power Shellの実行ログにProvisioningState : Succeededと表示され、実際にPortal上で確認すると設定通り出来ている事が確認できます。