Azure Resource Manager The Series : ตอนที่ 3 – โครงสร้างของ Azure Resource Manager Template

0
211

ในการทำงานกับ Azure Resource Manager (ARM) นั้นสิ่งหนึ่งที่สำคัญก็คือ Template  ซึ่งจะใช้เป็นต้นแบบสำหรับการ deploy  ทรัพยากร (Resource) ต่างๆ เข้าไปยัง Resource Manager ของเรา ซึ่งเจ้า Azure Template นั้นจะเป็นแฟ้มข้อมูลในรูปแบบ JSON (JavaScript Object Notation)  ซึ่งในตอนนี้จะได้กล่าวถึงโครงสร้างของ JSON เสียก่อนนะครับ แล้วค่อยกล่าวถึง Resource ต่างๆ ในอีกตอนนึงครับ

สำหรับ Azure Resource Manger Template นั้นจะแบ่งแฟ้มข้อมูลที่เกี่ยวข้องเป็น 2 ประเภทคือ

  • Template File  จะเป็น ไฟล์หลักที่ใช้ในการเก็บรายละเอียดของ Resource ต่างๆ ที่ต้องการจะใช้ Deploy
  • Parameter File เป็นไฟล์ที่ใช้ในการเก็บพารามิเตอร์ต่างๆ ซึ่งจะช่วยให้การ Deploy โดยใช้ Template File เป็นไปได้ง่ายขึ้น คือไม่ต้องไปแก้ Template File บ่อยๆ  ดังนั้นหากต้องการแก้ไขพารามิเตอร์ใดๆ ก็ไปแก้ใน Parameter File ได้โดยสะดวก

ข้อจำกัดของ Template File นั้นมีข้อจำกัดที่ขนาดของไฟล์ที่ 1 MB  และ Parameter File มีขนาดไม่เกิน 64 KB นะครับ

โครงสร้างหลักของ Template File

ในการทำงานของ ARM นั้นจะมีโครงสร้างที่ไม่ซับซ้อนมากนัก ประกอบด้วยองค์ประกอบหลัก (Elements) 6 ส่วนด้วยกัน ดังตัวอย่างที่ 1

ตัวอย่างที่ 1 Element หลักของ Azure Template

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "",
    "parameters": {  },
    "variables": {  },
    "resources": [  ],
    "outputs": {  }
}
  • Schema  (จำเป็นต้องมี) เป็นส่วนที่ใช้ในการระบุถึงเวอร์ชัน และภาษาที่ใช้ในการจัดทำ Template ซึ่งโดยปกติจะใช้เป็น URL ตามตัวอย่างได้เลย
  • ContentVersion (จำเป็นต้องมี)  ใช้ในการระบุเวอร์ชันของ Azure Template เพื่อให้สามารถอ้างอิงเวอร์ชันที่ถูกต้องในการทำงานได้
  • Parameters   ใช้ในการระบุถึงพารามิเตอร์ที่จำเป็นต้องมีการอ้างอิง  ซึ่งจะต้องมีการประกาศพารามิเตอร์ไว้ใน Parameter File ด้วย
  • Variables   เป็นส่วนที่ใช้ในการระบุตัวแปรต่างๆ ที่จำเป็นต้องใช้งานในการ Deployment ของ Template File
  • Resources  (จำเป็นต้องมี)  ใช้ในการระบุรายละเอียของ Resource ต่างๆ ที่ต้องการกำหนดให้มีการ Deploy ใน Resource Group
  • Output (จำเป็นต้องมี)  ใช้ในการระบุถึงผลลัพธ์ที่จะมีการส่งค่ากลับมาภายหลังจากการ Deployment เสร็จสิ้น

ซึ่งเมื่อใส่ข้อมูลต่างๆ ลงไปในแต่ละองค์ประกอบจะได้แฟ้มข้อมูลในรูปแบบ JSON ดังตัวอย่าง

ตัวอย่างที่ 2 รายละเอียดของแต่ละ Element ใน Azure Resource Manager Template

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "",
    "parameters": {  
        "<parameter-name>" : {
            "type" : "<type-of-parameter-value>",
            "defaultValue": "<default-value-of-parameter>",
            "allowedValues": [ "<array-of-allowed-values>" ],
            "minValue": <minimum-value-for-int>,
            "maxValue": <maximum-value-for-int>,
            "minLength": <minimum-length-for-string-or-array>,
            "maxLength": <maximum-length-for-string-or-array-parameters>,
            "metadata": {
                "description": "<description-of-the parameter>" 
            }
        }
    },
    "variables": {  
        "<variable-name>": "<variable-value>",
        "<variable-name>": { 
            <variable-complex-type-value> 
        }
    },
    "resources": [
      {
          "apiVersion": "<api-version-of-resource>",
          "type": "<resource-provider-namespace/resource-type-name>",
          "name": "<name-of-the-resource>",
          "location": "<location-of-resource>",
          "tags": "<name-value-pairs-for-resource-tagging>",
          "comments": "<your-reference-notes>",
          "dependsOn": [
              "<array-of-related-resource-names>"
          ],
          "properties": "<settings-for-the-resource>",
          "copy": {
              "name": "<name-of-copy-loop>",
              "count": "<number-of-iterations>"
          },
          "resources": [
              "<array-of-child-resources>"
          ]
      }
    ],
    "outputs": {
        "<outputName>" : {
            "type" : "<type-of-output-value>",
            "value": "<output-value-expression>"
        }
    }
}

การกำหนดค่าในส่วนของ Parameters ซึ่งประกอบด้วยส่วนต่างๆ ที่สำคัญดังนี้

  • Parameter-Name  (จำเป็นต้องมี) เป็นชื่อของพารามิเตอร์  ซี่งในแต่ละพารามิเตอร์สามารถมีการกำหนดรายละเอียดต่างๆ ดังต่อไปนี้
    • Type (จำเป็นต้องมี) เป็นชนิดของข้อมูลสำหรับพารามิเตอร์ที่กำหนด ซึ่ง Type อาจจะเป็นชนิดใดชนิดหนึ่งดังนี้ String, SecureString, int, bool, object, secureObject, array
    • defaultValue  กำหนดค่า Default ให้กับพารามิเตอร์ ในกรณีที่ไม่ได้มีการกำหนดค่าเข้ามาจาก Parameter File
    • allowedValue  กำหนดรายการของค่าที่สามารถยอมรับได้ให้กับพารามิเตอร์
    • minValue  กำหนดค่าต่ำสุดให้กับพารามิเตอร์
    • maxValue  กำหนดค่าสูงสุดให้กับพารามิเตอร์
    • minLength กำหนดความยาวต่ำสุดของพารามิเตอร์ (เฉพาะชนิด String, SecureString และ Array)
    • maxLength กำหนดความยาวสูงสุดของพารามิเตอร์ (เฉพาะชนิด String, SecureString และ Array)
    • Description กำหนดคำอธิบายให้กับพารามิเตอร์ เพื่อความสะดวกในการอ่าน และทบทวนภายหลัง

ซึ่งในแต่ละพารามิเตอร์นั้นจะมีการกำหนด Parameter-Name และข้อกำหนดต่างๆ ดังกล่าวไว้ระหว่างเครื่องหมาย {  และ }   และแยกระหว่างพารามิเตอร์ โดยใช้เครื่องหมาย comma (,)

ตัวอย่างต่อไปนี้เป็นตัวอย่างการกำหนดพารามิเตอร์ต่างๆ เช่น SiteName, hostingPlanName ,skuName โดยมีการระบุชนิด และเงื่อนไขต่างๆ ตามที่กล่าวไปแล้วข้างต้น

"parameters": {
    "siteName": {
        "type": "string",
        "defaultValue": "[concat('site', uniqueString(resourceGroup().id))]"
    },
    "hostingPlanName": {
        "type": "string",
        "defaultValue": "[concat(parameters('siteName'),'-plan')]"
    },
    "skuName": {
        "type": "string",
        "defaultValue": "F1",
        "allowedValues": [
          "F1",
          "D1",
          "B1",
          "B2",
          "B3",
          "S1",
          "S2",
          "S3",
          "P1",
          "P2",
          "P3",
          "P4"
        ]
    },
    "skuCapacity": {
        "type": "int",
        "defaultValue": 1,
        "minValue": 1
    }
}

การกำหนดค่าตัวแปร (Variables) ซึ่งมีรายละเอียดคือ

  • Variable-Name  (จำเป็นต้องมี) เป็นชื่อของตัวแปรแต่ละตัว
    • Variable-value เป็นค่าของตัวแปรตัวนั้นๆ  ตัวอย่างต่อไปนี้เป็นการกำหนดค่าตัวแปร connectionString ให้มีค่าต่างๆ ตามที่กำหนดไว้ในพารามิเตอร์ โดยมีการใช้ฟังก์ชัน concat เพื่อใช้ในการนำ String มาเชื่อมต่อกัน

"variables": {
    "connectionString": "[concat('Name=', parameters('username'), ';Password=', parameters('password'))]"
}

การกำหนดรายละเอียดต่างๆ ให้กับ Resource ที่ต้องการจะสร้างขึ้นใน Resource Group ซึ่งมีรายละเอียดคือ

  • Resources  เป็นหัวข้อหลักในการกำหนดทรัพยากรต่างๆ  
    • apiVersion (จำเป็นต้องมี) ระบุเวอร์ชันของ api สำหรับใช้งานทรัพยากรนั้นๆ
    • type (จำเป็นต้องมี) ระบุชนิดของทรัพยากรที่ต้องการ โดยต้องมีการระบุในรูปแบบ <resource-provider-namespace/resource-type-name>
    • name (จำเป็นต้องมี) กำหนดชื่อของทรัพยากร
    • location กำหนดสถานที่ในการ deploy ทรัพยากรนั้นว่าจะให้มีการ deploy ใน location ใดของ Micrsoft Azure
    • tags  กำหนด tag ให้กับทรัพยากรในรูปแบบ name:value
    • comments กำหนดหมายเหตุไว้ให้กับทรัพยากร
    • dependsOn กำหนดลำดับการขึ้นต่อกัน
    • properties  กำหนดคุณสมบัติเพิ่มเติมสำหรับทรัพยากรนี้
    • copy  กำหนดจำนวนของทรัพยากรที่ต้องการ
    • resources กำหนดทรัพยากรอื่นๆ ที่เป็นลูก (child) จากทรัพยากรนี้

ตัวอย่างต่อไปนี้เป็นตัวอย่างการสร้างทรัพยากรขึ้นโดย resourceA  และ resourceC เป็นทรัพยากรที่เป็นอิสระจากทรัพยากรอื่นๆ

ส่วน ทรัพยากร B จะประกอบด้วยทรัพยการ firstChildResourceB และ secondChildResourceB เป็นทรัพยากรย่อยจาก resourceB

"resources": [
  {
      "name": "resourceA",
  },
  {
      "name": "resourceB",
      "resources": [
        {
            "name": "firstChildResourceB",
        },
        {   
            "name": "secondChildResourceB",
        }
      ]
  },
  {
      "name": "resourceC",
  }
]

การกำหนดรายละเอียดต่างๆ ในส่วนของ Output ซึ่งมีรายละเอียดคือ

  • <Output-Name>  เป็นการกำหนดชื่อของ Output 
    • type (จำเป็นต้องมี)  กำหนดชนิดข้อมูลของ Ouput
    • value (จำเป็นต้องมี) กำหนดค่าของข้อมูล Output ที่ต้องการส่งกลับเมื่อการ deployment เสร็จ

ตัวอย่างต่อไปนี้เป็นการกำหนดให้ Azure Resource Manager Template ทำการส่ง Output ที่เป็นชนิด String ซึ่งมีค่าเป็น URL มีค่าตามที่กำหนดไว้

"outputs": {
    "siteUri" : {
        "type" : "string",
        "value": "[concat('http://',reference(resourceId('Microsoft.Web/sites', parameters('siteName'))).hostNames[0])]"
    }
}

เอาละครับถึงตรงนี้ก็น่าจะพอเข้าใจถึงโครงสร้างของ Azure Resource Manager Temple กันแล้วนะครับ เดี๋ยวตอนหน้าจะพาไปดูวิธีการที่จะ Deploy Resource ไปยัง Resource Group แบบง่ายๆ กันนะครับ สำหรับตอนนี้ สวัสดีปีใหม่ไทย 15 เมษายน 2560 ครับ

 

ข้อมูลเพิ่มเติม