การตั้งเวลา Start/Stop ตัว Power BI Embedded Capacity โดยใช้ REST API ผ่าน Azure Logic App (special topic)

Narisorn Limpaswadpaisarn
EchoO365
Published in
5 min readApr 29, 2020

Content difficulty — Technical

ตัว Power BI Embedded เป็น services พิเศษที่ทำให้ developer สามารถฝัง content ตัว Power BI Report หรือ Dashboard ไปที่ website หรือ custom web application ได้ซึ่ง user สามารถเข้าไปดูได้โดยที่ไม่มี Power BI Pro License ได้ ซึ่ง การฝัง report และ Dashboard วิธีนี้มีความ secure มากกว่า การ Publish to web เนื่องด้วยมีการ authentication กับ Azure Active Directory (AAD) ผ่าน broker เพราะฉะนั้น Developer ก็ผูกกับระบบ account ใน App ของตัวเองเพื่อให้ user เข้ามาดูได้

Broker อาจจะเป็น Power Bi Pro User (Master Account) หรือ Service Principal

Power BI Embedded นั้นยังมีความสามารถในการ integrate กับ JavaScript เพื่อให้ user interact กับ Power BI report ได้เพิ่มเติมจากการ interact กับแค่ การ filter กราฟใน Power BI report เช่น developer อาจจะสร้างปุ่ม หรือ Drop-down ต่างๆ ใน Application เพื่อเปลี่ยน custom layout หรือ ปรับเป็น dynamic layout เลยก็ได้

เปลี่ยน custom layout
ทำ Dynamic Layout
Integrate กับ ปุ่มต่างๆ

ซึ่งการ Embedded ลง Web Application นั้นทำได้โดยการซื้อ capacity ซึ่งมีจำหน่ายมีทั้งที่เป็น model ของ Platform as a Service (PaaS) ผ่าน Microsoft Azure ในชื่อ Power BI Embedded และ Software as a Service (SaaS) ในชื่อ Power BI Premium ที่ใช้ร่วมกับ Office 365

ข้อแตกต่างอีกอย่างนึงคือ Power BI Embedded เป็น PaaS ที่สามารถเปิดปิดได้ ทำให้ save ค่าใช้จ่าย แต่ในมุม Power BI Premium เองแม้ว่าจะปิดไม่ได้แต่ก็มี feature ที่มากกว่า แต่ถ้าต้องการที่ว่าจะแค่ Embedded ลง Web Application นั้นก็เพียงพอแล้วสำหรับ Developer

Capacity นั้นจะเอามา Assign ลง Workspace

มี spec อยู่หลายขนาด ตาม backend core

Performance, การ refresh และ Dataset limit ของ Workspace ส่วนใหญ่ก็จะดีกว่า Workspace ธรรมดาที่ใช้ แค่ Power BI Pro ในการ Publish

ในเมื่อเราเปิดปิดได้ เลยต้องหาวิธีเพื่อ automate ให้ทำตามเวลาเช่น เปิด 8:00 ปิด 19:00 ซึ่งในกรณีนี้วิธีหนึ่งเลยคือ การใช้ Azure Logic App ซึ่งเป็นระบบ workflow automation ที่มีการทำงานคล้ายๆ Power Automate (Microsoft Flow) และเข้ามาแทนที่ตัว BizTalk Server ซึ่งเราจะใช้ในการ REST call ไปที่ Power BI Embedded

Power BI Embedded REST API

ตัว REST API ที่ทำหน้าที่เปิดปิด capacity นั้นจะต้องหาค่า parameter มาใส่ใน Logic Apps จะมีด้วยกันอยู่ 3 ค่าคือ

  • Resource Group Name
  • Power BI Capacity Name
  • Subscription ID

ซึ่งทั้งหมดจะได้จาก service ของ Power BI Embedded อยู่แล้วเวลาเราสร้างเสร็จ

Resource Group Name, Capacity Name และ Subscription ID

ซึ่งถ้าดู API reference นั้นก็จะ require ค่า 3 อันนี้ ทั้งการเปิดและปิด

POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.PowerBIDedicated/capacities/{dedicatedCapacityName}/resume?api-version=2017-10-01

POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.PowerBIDedicated/capacities/{dedicatedCapacityName}/suspend?api-version=2017-10-01

สร้าง Logic App

สามารถสร้างได้ผ่าน Azure Portal โดยใส่ค่าหลักๆคือในส่วนของ ชื่อ, Resource Group และ Region ซึ่งคนละอันกับของ Power BI Embedded ก็ได้

ต่อมาเราจะต้องสร้างวิธีการ Authentication ให้ Logic App เพื่อไป API call กับ Power BI Embedded โดยการสร้าง Managed Identity ในตัวอย่างจะเป็นแบบ System assigned

ทำการ Turn On System Assigned Managed Identity
เข้าไป add role ที่เป็น contributor role ให้ System Assigned Managed Identity
เลือก Connector แล้วคลิก Next
add ชื่อ Managed Identity ตามชื่อ Logic Apps

Logic App Designer

การสร้าง Logic App นั้นมี component อยู่ 2 ค่าคือ Trigger และ Action ซึ่ง Trigger คือ เงื่อนไขในการ run workflow นี้ และ Action คือ ชุดคำสั่งต่างๆ ที่จะทำงานต่อเมื่อมี Trigger

ไปที่ Logic App Designer แล้ว add trigger ชื่อ Recurrence เพื่อสร้าง schedule ว่าให้ flow ทั้งหมด run ตอนไหนบ้างซึ่งเราจะ set ให้ run เป็นรายวัน 1 interval ใน Time Zone บ้านเรา UTC +07:00 แล้ว Add start time เป็น hour ใส่ 8,19 คือ ทุก 8:00 และ 19:00 ของแต่ละวัน ส่วน minute ไว้เผื่ออยากจะใส่เป็น 8:30 กับ 19:30

อีก 2 action ใช้ connector ชื่อ Current time เพื่อตอน run ให้เก็บเวลา ณ ขณะนั้นไว้ (เป็น timestamp UTC) และ Convert time zone เพื่อ convert timestamp เป็นเวลา UTC +07:00 โดยใส่ Based time เป็น ค่าจากของ Current Time (Dynamic Content) ส่วน date/time format ใส่เลือกที่เป็น custom format คือ H:mm เพื่อให้ ล้อตาม format ของเวลาใน Trigger ตัว Recurrence

Trigger และ actions

สร้าง Action อีก 3 ตัวชื่อ Initialize variables เพื่อเก็บตัวแปรไว้ทำ Dynamic content ซึ่ง value ก็เป็นค่าที่เราหามาตั้งแต่ต้น (ประเภทเป็น string)

ชื่อ variable ก็แล้วแต่เราตั้งได้เลย

Initialize variable

ต่อมาให้เรา add action ตัว control ชื่อ Switch เพื่อเลือกว่า เมื่อ ถึงเวลา 9 โมง ทำ Action A และ 19:00 ทำ Action B ซึ่ง Action A เราจะ API call เพื่อเปิด capacity และ Action B คือการปิด Capacity ซึ่งเวลาจะล้อตาม trigger ตัว Recurrence โดยให้มันตรวจเวลาจาก Dynamic content ที่เราสร้างจาก action ตอน Convert timezone

ตามเวลาเปิดปิด

ซึ่งการเปิดปิดจะใช้ connector ชื่อว่า HTTP โดยตาม API Reference จะต้องการค่า Resource Group, Capacity Name และ Subscription ID เราก็ผ่านค่า variable ที่เรา set ไว้เพื่อที่เป็น Dynamic content แทนการพิมพ์ตรงๆ ซึ่ง method จะเป็น POST และ URL ตาม API นี้ โดยเฉพาะการ Authentication ให้เลือกเป็น Managed Identity ประเภท System Assigned (ที่เรา set ไว้ตอนแรก) เมื่อเสร็จทุกอย่างก็คลิก Save

Dynamic content จาก Initialize variable step

อาจจะเพิ่มเติม Action ต่อจากทั้งสอง switch ได้เช่น ส่ง email มายืนยันเราอีกทีว่า job ทำงานสำเร็จ

ส่ง email เพื่อยืนยัน

Testing

สามารถทดลอง Modify ตัว เวลาใน switch ให้ตามเวลา ณ ขณะนั้นดู แล้ว กด Play

Testing
Green Check box หมดถือว่าผ่าน
ระบบก็ turn on เองโดยไม่ต้องคลิก
สามารถตรวมสอบ log การ run ได้
ถ้าไม่อยากจะให้ run ตาม schedule ก็สามารถ turn off ได้
ถ้าเราเป็น Admin ของ Power BI Embedded Capacity และ Admin ของ Workspace ก็ เลือก capacity รอไว้พอปิดก็จะตัด พอเปิดตัว Workspace นี้ก็จะต่อ capacity เดิมที่เคยเลือก

--

--

Narisorn Limpaswadpaisarn
EchoO365

Office 365 and Modern Workplaces: Please follow my publication https://medium.com/echoo365 for Microsoft 365 & Power Platform Blog (In Thai)