Azure runbook을 PowerShell 또는 C# 코드로 실행하는 방법
지난번 소개한 Azure runbook을,
Azure - Runbook 기능 소개
; https://www.sysnet.pe.kr/2/0/11511
외부에서 실행할 수 있는 가장 편한 방법은 위의 글에서도 언급한 Webhook을 설정하는 것입니다. 물론, 기타 프로그래밍 방법으로도 호출이 가능합니다.
Starting a runbook in Azure Automation
; https://docs.microsoft.com/en-us/azure/automation/automation-starting-a-runbook
가령 PowerShell에서 로그인 문맥만 있다면 지난 글에서 만들어 둔 runbook을 다음과 같이 호출할 수도 있습니다.
PS > Login-AzureRMAccount
Account : testuser@mydomain.net
SubscriptionName : Windows Azure
SubscriptionId : 461e7265-0395-49b1-94b3-4c891430a893
TenantId : 5A7266AE-1C5D-4386-9D0D-2131CC3B2A2C
Environment : AzureCloud
PS > Start-AzureRmAutomationRunbook -AutomationAccountName "runbookRunner" -Name "run_powershell_sample" -ResourceGroupName "test_res"
ResourceGroupName : test_res
AutomationAccountName : runbookRunner
JobId : 6840ca8f-204a-422b-a4b0-ab5b331d612d
CreationTime : 2018-05-04 오전 11:08:27 +09:00
Status : New
StatusDetails : None
StartTime :
EndTime :
Exception :
LastModifiedTime : 2018-05-04 오전 11:08:27 +09:00
LastStatusModifiedTime : 2018-05-04 오전 11:08:27 +09:00
JobParameters : {}
RunbookName : run_powershell_sample
HybridWorker :
StartedBy :
그럼 C# 클라이언트로는 어떻게 호출할 수 있을까요? 지난 글에서 C# 코드로 Azure 서비스에 접근하는 것을 다뤘는데요.
C# - API를 사용해 Azure에 접근하는 방법
; https://www.sysnet.pe.kr/2/0/11480
위의 소스 코드에서 IAzure 인터페이스로는 Automation 관련 객체를 나열할 수 없습니다. 이것이 가능하려면 별도로 Microsoft.Azure.Management.Automation 어셈블리를 NuGet으로부터 추가해야 합니다.
Azure Automation libraries for .NET
; https://docs.microsoft.com/en-us/dotnet/api/overview/azure/automation?view=azure-dotnet
Install-Package Microsoft.Azure.Management.Automation
그런데, Automation 관련 API를 사용하기 위한 인증 방식이 "
C# - API를 사용해 Azure에 접근하는 방법" 글에서 설명한 것과 다소 다른 방식입니다.
string txt = File.ReadAllText(credFile); // C# - API를 사용해 Azure에 접근하는 방법" 글에서 소개한 JSON 형식의 인증 파일
AzureCredential credential = JsonConvert.DeserializeObject(txt);
string accessToken = await GetAccessToken(credential);
Microsoft.Azure.SubscriptionCloudCredentials credentials
= new TokenCloudCredentials(credential.subscriptionId, accessToken);
AutomationManagementClient client = new AutomationManagementClient(credentials);
/*
public class AzureCredential
{
public string clientId;
public string clientSecret;
public string subscriptionId;
public string tenantId;
public string activeDirectoryEndpointUrl;
public string resourceManagerEndpointUrl;
public string activeDirectoryGraphResourceId;
public string sqlManagementEndpointUrl;
public string galleryEndpointUrl;
public string managementEndpointUrl;
}
*/
보는 바와 같이 인증 파일의 정보로부터 Azure 관리 서버에 요청을 보내 Access Token을 받아와 SubscriptionCloudCredentials를 구성하는 방식입니다. 위의 인증 방식을 "
Azure - Runbook 기능 소개" 글에서 만든 소스 코드와 결합해 "runbookRunner" 계정의 "run_powershell_sample" 예제 runbook을 호출하는 전체 코드는 다음과 같이 만들 수 있습니다.
using Microsoft.Azure;
using Microsoft.Azure.Management.Automation;
using Microsoft.Azure.Management.Automation.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static async Task Main(string[] args)
{
string credFile = @"D:\Settings\azure_sub1_prop_json.txt";
string resGroupName = "test_res";
string runbookAccountName = "runbookRunner";
string txt = File.ReadAllText(credFile);
AzureCredential credential = JsonConvert.DeserializeObject<AzureCredential>(txt);
string accessToken = await GetAccessToken(credential);
Microsoft.Azure.SubscriptionCloudCredentials credentials
= new TokenCloudCredentials(credential.subscriptionId, accessToken);
AutomationManagementClient client = new AutomationManagementClient(credentials);
// Automation Accounts 나열
foreach (var account in client.AutomationAccounts.List(resGroupName).AutomationAccounts)
{
Console.WriteLine(account.Name);
// Automation Account에 속한 모든 Runbook 나열
foreach (var runbook in client.Runbooks.List(resGroupName, account.Name).Runbooks)
{
Console.WriteLine("\t" + runbook.Name);
}
}
JobCreateParameters jcParam = new JobCreateParameters
{
Properties = new JobCreateProperties
{
Runbook = new RunbookAssociationProperty
{
Name = "run_powershell_sample"
},
Parameters = null // optional parameters here
}
};
// 특정 runbook을 호출하는 코드
Job job = client.Jobs.Create(resGroupName, runbookAccountName, jcParam).Job;
Console.WriteLine(job.Id);
}
private static async Task<string> GetAccessToken(AzureCredential credential)
{
HttpClient hc = new HttpClient();
string url = "https://login.microsoftonline.com/358f4aef-d1c5-4103-8f67-255bcb9d7670/oauth2/token";
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("resource", credential.resourceManagerEndpointUrl);
dict.Add("client_id", credential.clientId);
dict.Add("client_secret", credential.clientSecret);
dict.Add("grant_type", "client_credentials");
FormUrlEncodedContent content = new FormUrlEncodedContent(dict);
HttpResponseMessage hrm = await hc.PostAsync(url, content);
string result = await hrm.Content.ReadAsStringAsync();
AzureAccessToken token = JsonConvert.DeserializeObject<AzureAccessToken>(result);
return token.access_token;
}
}
}
참고로, runbook에서 인자를 받는 것도 가능합니다. 이를 위해 runbook 스크립트에 다음과 같이 인자가 필요하다는 구문을 추가하면 됩니다.
param (
[Parameter(Mandatory=$true)][object]$user
)
Write-Output $user.Name
이 코드를 PowerShell로는 다음과 같이 호출할 수 있고,
$json = '{ "Name": "Joe" }' | ConvertFrom-Json
$arg = @{ 'user' = $json }
$RBParams = @{ AutomationAccountName = 'runbookRunner'; ResourceGroupName = 'test_res'; Name = 'run_powershell_sample2'; Parameters = $arg }
Start-AzureRmAutomationRunbook @RBParams
C#으로는 이렇게 호출할 수 있습니다.
string user = "{ \"Name\": \"Joe\" }";
Dictionary<string, string> dict = new Dictionary<string, string>() { { "user", user } };
JobCreateParameters jcParam = new JobCreateParameters
{
Properties = new JobCreateProperties
{
Runbook = new RunbookAssociationProperty
{
Name = "run_powershell_sample2"
},
Parameters = dict,
}
};
Job job = client.Jobs.Create(resGroupName, runbookAccountName, jcParam).Job;
(
첨부 파일은 이 글의 예제 코드를 포함합니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]