Header Ads Widget

Ticker

6/recent/ticker-posts

Sử dụng REST API điều khiển và deploy web trên Kudu Azure bằng Powershell

Keywords: How to use REST API control and deploy web application on Kudu Azure by Powershell
Lại một chủ đề khá thú vị cho anh em chúng ta học hỏi đây, các bạn đọc tiêu đề thì có lẽ thấy làm lạ là tại sao dân IT lại sử dụng API thường thì nghe từ API thì chỉ có các Dev ( Coder ) họ sử dụng thôi chứ, tại sao IT lại phải sử dụng nó và sử dụng nó với mục đích gì và làm gì, thật ra nếu như các bạn đang ở Position là System Admin thì mình nghĩ cũng không cần quan tâm đến API là gì hoặc sử dụng nó để làm gì, nhưng một khi các bạn đã lên các vị trí như DevOps v.v thì nó lại rất quan trọng
Nói vậy thôi chứ ai đang làm System Admin cũng nên đọc cho biết đi nhé, mình sẻ tóm gọn API lại như sau, nó là nơi để mình mốc nối đến các chương trình hoặc web khi mình muốn lấy những thông tin trên web đó hoặc chương trình đó, giả sử để tạo thêm thư mục hay là để show những thông tin mình mong muốn ra, bởi lẽ chúng ta không thể đi thẳng đến đến Database của Web Application đó hoặc chương trình nào đó để lấy trực tiếp như vậy được nó sẻ thiếu đi sự Security (Thật ra thì cũng không ai cho các bạn làm thế với Database của họ cả) vì vậy chúng ta cần phải thông qua API để lấy những giá trị dữ liệu đó, hoặc control chúng lại bằng API, đại loại với Google Drive mình sẻ ví dụ như sau, mình muốn tạo một đoạn script cứ mõi 1 tháng trên Google Drive của mình tự động tạo 1 thư mục, vậy mình sẻ thực hiện nó bằng cách nào ?
Mình sẻ tạo 1 file script bằng Powershell sau đó thực hiện kết nối với API của Google Drive để thực hiện lệnh tạo thư mục, sau đó mình chỉ việc hẹn task cho mõi tháng đoạn script đó chạy 1 lần, nói nôm na thì là thế thôi, giải thích nhiều mình cũng không biết giải thích sao, các bạn có thể truy cập đến đường link Youtube của anh Phạm Huy Hoàng để hiểu rõ hơn về API nhé
Sau khi đã hiểu rõ về sự quan trọng của API rồi thì chúng ta bắt đầu vào phần chính thôi nào, sử dụng API của Kudu Azure để thực hiện các công việc mình muốn, ở bài hướng dẫn này mình sẻ chỉ các bạn sử dụng Command Windows trên Kudu Azure thông qua API và tải file zip từ Kudu về máy local
  • Phần 1: Sử dụng Commandline Windows trên Kudu Azure
Các bạn mở Windows PowerShell ISE bằng quyền admin lên nhé, sau đó mở new file và thực hiện chèn đoạn code sau của mình vào và chạy nó, mình sẻ giải thích từng chút 1 trong đoạn code sau
function RunCommand($dir,$command, $slotName = $null){
        $username = "yourusername"
        $password = "yourpassword"
        $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))
        $kuduApiUrl="https://test-sutrix.scm.s1.umbraco.io/api/command"
        $Body = 
          @{
          "command"=$command;
           "dir"=$dir
           } 
        $bodyContent=@($Body) | ConvertTo-Json
        Write-Host $bodyContent
        Invoke-RestMethod -Uri $kuduApiUrl `
                          -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} `
                          -Method POST -ContentType "application/json" -Body $bodyContent
    }
RunCommand "site\wwwroot" "XCOPY C:\home\site\wwwroot\uSync C:\home\site\repository\uSync /E /H /C /I /Y"
RunCommand "site\wwwroot" "XCOPY C:\home\site\wwwroot\Media C:\home\site\repository\Media /E /H /C /I /Y"
Như các bạn đã thấy ở đoạn code trên của mình, mình đã làm 1 cái function để thực hiện kêu gọi user và password để truy cập, sau đó đường link api của command, mình sẻ tham khảo và lấy tại đây, các bạn tham khảo sơ qua tại đó, dir nghĩa là mình sẻ trỏ đến thư mục nào, command là nơi mình truyền command của mình vào, sau đó mình chuyển thể mọi thứ thành file json và yêu cầu api thực hiện command đó ( Đó là các câu lệnh mà API của Kudu cho phép chúng ta, chúng ta chỉ việc dùng PowerShell để chuyển thể lại bằng code script và chạy thôi ), tại đây trong PowerShell thằng Invoke-RestMethod là thằng quang trọng vì nó là nơi để control các API
  • Phần 2: Download và deploy zip file trên Kudu Azure xuống local
Mình sẻ tiếp tục chia nhỏ ra vì có 2 cách để lấy file zip xuống trên Kudu bằng API

Cách 1: Sử dụng Invoke-RestMethod

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12
$username = "yourusername"
$password = "yourpassword"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username, $password)))
$userAgent = "powershell/1.0"
$apiUrl = "https://test-sutrix.scm.s1.umbraco.io/api/zip/site/wwwroot/Media/"
$filePath = "C:\Jenkins\project\kundeco-cyber-crypt\development\build-media-content\Media.zip"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -UserAgent $userAgent -Method GET -OutFile $filePath -ContentType "multipart/form-data"
cd C:\Jenkins\project\kundeco-cyber-crypt\development\build-media-content\
C:\Program\7-Zip\7z.exe x Media.zip -oC:\Jenkins\project\kundeco-cyber-crypt\development\61ebe4c2-cf4e-44de-87e8-19b1af98371b\Media -r -y
Remove-Item -Path $filePath -Force -Recurse
Như các bạn thấy ở đoạn trên, mình sử dụng api/zip để thực hiện nén file trên Kudu và download về local bằng invoke-restmethod bằng cách truyền các tham số và nơi xuất file lẫn nơi mà mình muốn zip tại đây thì mình muốn zip thằng Media lại và Download nó về local nên link API của mình sẻ là như thế.

Cách 2: Sử dụng WebClient

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12
$username = "yourusername"
$password = "yourpassword"
$apiUrl = "https://test-sutrix.scm.s1.umbraco.io/api/zip/site/wwwroot/uSync/"
$filePath = "C:\Jenkins\project\kundeco-cyber-crypt\development\build-media-content\uSync.zip"
$webclient = new-object System.Net.WebClient
$credCache = new-object System.Net.CredentialCache
$creds = new-object System.Net.NetworkCredential($username,$password)
$credCache.Add($apiUrl, "Basic", $creds)
$webclient.Credentials = $credCache
$webpage = $webclient.DownloadFile($apiUrl,$filePath)
cd C:\Jenkins\project\kundeco-cyber-crypt\development\build-media-content\
C:\Program\7-Zip\7z.exe x uSync.zip -oC:\Jenkins\project\kundeco-cyber-crypt\development\61ebe4c2-cf4e-44de-87e8-19b1af98371b\uSync -r -y
Remove-Item -Path $filePath -Force -Recurse
Ở đây nhìn thì có vẻ đơn giản hơn nhiều so với sử dụng Invoke-RestMethod nhưng bù lại nó cũng dài hơn, cũng vẫn sử dụng API/ZIP như mặc định nhưng cách xác thực của mình hoàn toàn khác, mình sử dụng WebClient để xác thực tài khoản cho API và sau đó download về local thực hiện giải nén đến thư mục mình cần, tiếp đến là xóa file zip vừa download về local đi
Trong một số trường hợp khi các bạn chạy 2 lệnh trên mà báo các lỗi sau:
  • Yourfilepsname.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at http://go.microsoft.com/fwlink/?LinkID=135170
Thì các bạn chạy lệnh này để fix nó:
set-executionpolicy remotesigned
  • Invoke-RestMethod : The underlying connection was closed: An unexpected error occurred on a send
Các bạn chạy thêm lệnh sau trước khi thực hiện download zip nhé
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12
Mình đã hướng dẫn sơ qua cho các bạn thực hiện viết script API với Kudu bằng Powershell rồi đấy, chúc các bạn thành công, các bạn có thể tham khảo thêm các lệnh API khác của Kudu tại đây nhé, mọi thắc mắc có thể liên hệ trực tiếp mình.

Post a Comment

0 Comments