Azure SDK를 사용하여 Cloud Services(추가 지원) 배포
이 문서에서는 Azure SDK를 사용하여 여러 역할(WebRole 및 WorkerRole)이 있는 Azure Cloud Services(추가 지원) 배포를 만드는 방법을 보여 줍니다. 또한 RDP(원격 데스크톱 프로토콜) 확장을 사용하는 방법도 다룹니다. Cloud Services(추가 지원)는 Azure Resource Manager를 기반으로 하는 Azure Cloud Services의 배포 모델입니다.
필수 조건
Cloud Services(추가 지원)에 대한 배포 필수 구성 요소를 검토하고 필요한 리소스를 만듭니다.
Cloud Services(추가 지원) 배포
SDK를 사용하여 Cloud Services(추가 지원)를 배포하려면 다음을 수행합니다.
Azure Compute SDK NuGet 패키지를 설치하고 표준 인증 방법을 사용하여 클라이언트를 초기화합니다.
public class CustomLoginCredentials : ServiceClientCredentials { private string AuthenticationToken { get; set; } public override void InitializeServiceClient<T>(ServiceClient<T> client) { var authenticationContext = new AuthenticationContext("https://login.windows.net/{tenantID}"); var credential = new ClientCredential(clientId: "{clientID}", clientSecret: "{clientSecret}"); var result = authenticationContext.AcquireTokenAsync(resource: "https://management.core.windows.net/", clientCredential: credential); if (result == null) throw new InvalidOperationException("Failed to obtain the JWT token"); AuthenticationToken = result.Result.AccessToken; } public override async Task ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (request == null) throw new ArgumentNullException("request"); if (AuthenticationToken == null) throw new InvalidOperationException("Token Provider Cannot Be Null"); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", AuthenticationToken); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //request.Version = new Version(apiVersion); await base.ProcessHttpRequestAsync(request, cancellationToken); } } var creds = new CustomLoginCredentials(); m_subId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID"); ResourceManagementClient m_ResourcesClient = new ResourceManagementClient(creds); NetworkManagementClient m_NrpClient = new NetworkManagementClient(creds); ComputeManagementClient m_CrpClient = new ComputeManagementClient(creds); StorageManagementClient m_SrpClient = new StorageManagementClient(creds); m_ResourcesClient.SubscriptionId = m_subId; m_NrpClient.SubscriptionId = m_subId; m_CrpClient.SubscriptionId = m_subId; m_SrpClient.SubscriptionId = m_subId;
Azure Resource Manager NuGet 패키지를 설치하여 새 리소스 그룹을 만듭니다.
var resourceGroups = m_ResourcesClient.ResourceGroups; var m_location = “East US”; var resourceGroupName = "ContosoRG";//provide existing resource group name, if created already var resourceGroup = new ResourceGroup(m_location); resourceGroup = await resourceGroups.CreateOrUpdateAsync(resourceGroupName, resourceGroup);
배포를 위한 패키지(.cspkg 또는 .zip) 파일과 구성(.cscfg) 파일을 저장할 스토리지 계정과 컨테이너를 만듭니다. Azure Storage NuGet 패키지를 설치합니다. 기존 스토리지 계정을 사용하는 경우 이 단계는 선택 사항입니다. 스토리지 계정 이름은 고유해야 합니다.
string storageAccountName = “ContosoSAS” var stoInput = new StorageAccountCreateParameters { Location = m_location, Kind = Microsoft.Azure.Management.Storage.Models.Kind.StorageV2, Sku = new Microsoft.Azure.Management.Storage.Models.Sku(SkuName.StandardRAGRS), }; StorageAccount storageAccountOutput = m_SrpClient.StorageAccounts.Create(rgName, storageAccountName, stoInput); bool created = false; while (!created) { Thread.Sleep(600); var stos = m_SrpClient.StorageAccounts.ListByResourceGroup(rgName); created = stos.Any( t => StringComparer.OrdinalIgnoreCase.Equals(t.Name, storageAccountName)); } StorageAccount storageAccountOutput = m_SrpClient.StorageAccounts.GetProperties(rgName, storageAccountName);. var accountKeyResult = m_SrpClient.StorageAccounts.ListKeysWithHttpMessagesAsync(rgName, storageAccountName).Result; CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials(storageAccountName, accountKeyResult.Body.Keys.FirstOrDefault(). Value), useHttps: true); var blobClient = storageAccount.CreateCloudBlobClient(); CloudBlobContainer container = blobClient.GetContainerReference("sascontainer"); container.CreateIfNotExistsAsync().Wait(); sharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy(); sasConstraints.SharedAccessStartTime = DateTime.UtcNow.AddDays(-1); sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddDays(2); sasConstraints.Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Write;
패키지 파일(.cspkg 또는 .zip)을 스토리지 계정에 업로드합니다. 패키지 URL은 모든 스토리지 계정의 SAS(공유 액세스 서명) URI가 될 수 있습니다.
CloudBlockBlob cspkgblockBlob = container.GetBlockBlobReference(“ContosoApp.cspkg”); cspkgblockBlob.UploadFromFileAsync(“./ContosoApp/ContosoApp.cspkg”). Wait(); //Generate the shared access signature on the blob, setting the constraints directly on the signature. string cspkgsasContainerToken = cspkgblockBlob.GetSharedAccessSignature(sasConstraints); //Return the URI string for the container, including the SAS token. string cspkgSASUrl = cspkgblockBlob.Uri + cspkgsasContainerToken;
구성 파일(.cscfg)을 스토리지 계정에 업로드합니다. 서비스 구성을 문자열 XML이나 URL 형식으로 지정합니다.
CloudBlockBlob cscfgblockBlob = container.GetBlockBlobReference(“ContosoApp.cscfg”); cscfgblockBlob.UploadFromFileAsync(“./ContosoApp/ContosoApp.cscfg”). Wait(); //Generate the shared access signature on the blob, setting the constraints directly on the signature. string sasCscfgContainerToken = cscfgblockBlob.GetSharedAccessSignature(sasConstraints); //Return the URI string for the container, including the SAS token. string cscfgSASUrl = cscfgblockBlob.Uri + sasCscfgContainerToken;
가상 네트워크 및 서브넷을 만듭니다. Azure Network NuGet 패키지를 설치합니다. 기존 네트워크 및 서브넷을 사용하는 경우 이 단계는 선택 사항입니다.
VirtualNetwork vnet = new VirtualNetwork(name: vnetName) { AddressSpace = new AddressSpace { AddressPrefixes = new List<string> { "10.0.0.0/16" } }, Subnets = new List<Subnet> { new Subnet(name: subnetName) { AddressPrefix = "10.0.0.0/24" } }, Location = m_location }; m_NrpClient.VirtualNetworks.CreateOrUpdate(resourceGroupName, “ContosoVNet”, vnet);
공용 IP 주소를 만들고 공용 IP 주소의 DNS 레이블 속성을 설정합니다. Cloud Services(추가 지원)는 기본 SKU 공용 IP 주소만 지원합니다. 표준 SKU 공용 IP 주소는 Cloud Services(추가 지원)에서 작동하지 않습니다.
고정 IP 주소를 사용하는 경우 구성(.cscfg) 파일에서 예약된 IP 주소로 참조해야 합니다.
PublicIPAddress publicIPAddressParams = new PublicIPAddress(name: “ContosIp”) { Location = m_location, PublicIPAllocationMethod = IPAllocationMethod.Dynamic, DnsSettings = new PublicIPAddressDnsSettings() { DomainNameLabel = “contosoappdns” } }; PublicIPAddress publicIpAddress = m_NrpClient.PublicIPAddresses.CreateOrUpdate(resourceGroupName, publicIPAddressName, publicIPAddressParams);
네트워크 프로필 개체를 만들고 공용 IP 주소를 부하 분산 장치의 프런트 엔드와 연결합니다. Azure 플랫폼은 배포와 동일한 구독에 클래식 SKU 부하 분산 장치 리소스를 자동으로 만듭니다. 부하 분산 장치 리소스는 Azure Resource Manager에서 읽기 전용입니다. Cloud Services(추가 지원) 구성(.cscfg) 파일과 정의(.csdef) 파일을 통해서만 리소스를 업데이트할 수 있습니다.
LoadBalancerFrontendIPConfiguration feipConfiguration = new LoadBalancerFrontendIPConfiguration() { Name = “ContosoFe”, Properties = new LoadBalancerFrontendIPConfigurationProperties() { PublicIPAddress = new CM.SubResource() { Id = $"/subscriptions/{m_subId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/publicIPAddresses/{publicIPAddressName}", } } }; CloudServiceNetworkProfile cloudServiceNetworkProfile = new CloudServiceNetworkProfile() { LoadBalancerConfigurations = new List<LoadBalancerConfiguration>() { new LoadBalancerConfiguration() { Name = 'ContosoLB', Properties = new LoadBalancerConfigurationProperties() { FrontendIPConfigurations = new List<LoadBalancerFrontendIPConfiguration>() { feipConfig } } } } };
키 자격 증명 모음을 생성합니다. 이 키 자격 증명 모음은 Cloud Services(추가 지원) 역할과 관련된 인증서를 저장합니다. 키 자격 증명 모음은 Cloud Services(추가 지원) 리소스와 동일한 지역 및 구독에 있어야 하며 고유한 이름을 가져야 합니다. 자세한 내용은 Cloud Services에 인증서 사용(추가 지원)을 참조하세요.
New-AzKeyVault -Name "ContosKeyVault” -ResourceGroupName “ContosoOrg” -Location “East US”
키 자격 증명 모음의 액세스 정책을 업데이트하고, 인증서 권한을 사용자 계정에 부여합니다.
Set-AzKeyVaultAccessPolicy -VaultName 'ContosKeyVault' -ResourceGroupName 'ContosoOrg' -UserPrincipalName 'user@domain.com' -PermissionsToCertificates create,get,list,delete
또는
Get-AzADUser
를 실행하여 가져올 수 있는 개체 ID를 통해 액세스 정책을 설정합니다.Set-AzKeyVaultAccessPolicy -VaultName 'ContosKeyVault' -ResourceGroupName 'ContosOrg' -ObjectId 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' -PermissionsToCertificates create,get,list,delete
다음 예에서는 키 자격 증명 모음에 자체 서명된 인증서를 추가합니다. Cloud Services(추가 지원) 역할에 대한 구성(.cscfg) 파일에 인증서 지문을 추가해야 합니다.
$Policy = New-AzKeyVaultCertificatePolicy -SecretContentType "application/x-pkcs12" - SubjectName "CN=contoso.com" -IssuerName "Self" -ValidityInMonths 6 -ReuseKeyOnRenewal Add-AzKeyVaultCertificate -VaultName "ContosKeyVault" -Name "ContosCert" -CertificatePolicy $Policy
OS 프로필 개체를 만듭니다. OS 프로필은 Cloud Services(추가 지원) 역할과 연결된 인증서를 지정합니다. 이전 단계에서 만든 것과 동일한 인증서를 사용합니다.
CloudServiceOsProfile cloudServiceOsProfile = new CloudServiceOsProfile { Secrets = new List<CloudServiceVaultSecretGroup> { New CloudServiceVaultSecretGroup { SourceVault = <sourceVault>, VaultCertificates = <vaultCertificates> } } };
역할 프로필 개체를 만듭니다. 역할 프로필은 이름, 용량 및 계층과 같은 SKU의 역할별 속성을 정의합니다.
이 예에서는 ContosoFrontend와 ContosoBackend라는 두 가지 역할을 정의합니다. 역할 프로필 정보는 구성(.cscfg) 파일과 정의(.csdef) 파일에 정의된 역할과 일치해야 합니다.
CloudServiceRoleProfile cloudServiceRoleProfile = new CloudServiceRoleProfile() { Roles = new List<CloudServiceRoleProfileProperties>(); // foreach role in cloudService roles.Add(new CloudServiceRoleProfileProperties() { Name = 'ContosoFrontend', Sku = new CloudServiceRoleSku { Name = 'Standard_D1_v2', Capacity = 2, Tier = 'Standard' } ); roles.Add(new CloudServiceRoleProfileProperties() { Name = 'ContosoBackend', Sku = new CloudServiceRoleSku { Name = 'Standard_D1_v2', Capacity = 2, Tier = 'Standard' } ); } }
(선택 사항) Cloud Services(추가 지원) 배포에 추가할 확장 프로필 개체를 만듭니다. 이 예에서는 RDP(원격 데스크톱 프로토콜) 확장을 추가합니다.
string rdpExtensionPublicConfig = "<PublicConfig>" + "<UserName>adminRdpTest</UserName>" + "<Expiration>2021-10-27T23:59:59</Expiration>" + "</PublicConfig>"; string rdpExtensionPrivateConfig = "<PrivateConfig>" + "<Password>VsmrdpTest!</Password>" + "</PrivateConfig>"; Extension rdpExtension = new Extension { Name = name, Properties = new CloudServiceExtensionProperties { Publisher = "Microsoft.Windows.Azure.Extensions", Type = "RDP", TypeHandlerVersion = "1.2.1", AutoUpgradeMinorVersion = true, Settings = rdpExtensionPublicConfig, ProtectedSettings = rdpExtensionPrivateConfig, RolesAppliedTo = [“*”], } }; CloudServiceExtensionProfile cloudServiceExtensionProfile = new CloudServiceExtensionProfile { Extensions = rdpExtension };
Cloud Services(추가 지원) 배포를 만듭니다.
CloudService cloudService = new CloudService { Properties = new CloudServiceProperties { RoleProfile = cloudServiceRoleProfile Configuration = < Add Cscfg xml content here>, // ConfigurationUrl = <Add your configuration URL here>, PackageUrl = <Add cspkg SAS url here>, ExtensionProfile = cloudServiceExtensionProfile, OsProfile= cloudServiceOsProfile, NetworkProfile = cloudServiceNetworkProfile, UpgradeMode = 'Auto' }, Location = m_location }; CloudService createOrUpdateResponse = m_CrpClient.CloudServices.CreateOrUpdate(“ContosOrg”, “ContosoCS”, cloudService);
관련 콘텐츠
- Cloud Services(추가 지원)에 대한 자주 묻는 질문을 검토합니다.
- Azure Portal, Azure PowerShell, ARM 템플릿 또는 Visual Studio를 사용하여 Cloud Services(추가 지원)를 배포합니다.
- Cloud Services(추가 지원) 샘플 리포지토리를 방문합니다.