Wdrażanie usług Cloud Services (wsparcie dodatkowe) przy użyciu zestawu Azure SDK
W tym artykule pokazano, jak za pomocą zestawu Azure SDK wdrożyć wystąpienie usług Cloud Services (rozszerzona pomoc techniczna), które ma wiele ról (rolę internetową i rolę procesu roboczego) oraz rozszerzenie pulpitu zdalnego. Cloud Services (wsparcie dodatkowe) to model wdrażania usług Azure Cloud Services oparty na usłudze Azure Resource Manager.
Zanim rozpoczniesz
Zapoznaj się z wymaganiami wstępnymi dotyczącymi wdrażania dla usług Cloud Services (rozszerzona pomoc techniczna) i utwórz skojarzone zasoby.
Wdrażanie usług Cloud Services (wsparcie dodatkowe)
Zainstaluj pakiet NuGet zestawu Azure Compute SDK i zainicjuj klienta przy użyciu standardowego mechanizmu uwierzytelniania.
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;
Utwórz nową grupę zasobów, instalując pakiet NuGet usługi Azure Resource Manager.
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);
Utwórz konto magazynu i kontener, w którym będziesz przechowywać pakiet usługi (.cspkg) i pliki konfiguracji usługi (cscfg). Zainstaluj pakiet NuGet usługi Azure Storage. Ten krok jest opcjonalny, jeśli używasz istniejącego konta magazynu. Nazwa konta magazynu musi być unikatowa.
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;
Przekaż plik pakietu usługi (cspkg) do konta magazynu. Adres URL pakietu może być identyfikatorem URI sygnatury dostępu współdzielonego (SAS) z dowolnego konta magazynu.
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;
Przekaż plik konfiguracji usługi (cscfg) do konta magazynu. Określ konfigurację usługi jako ciąg XML lub format adresu 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;
Utwórz sieć wirtualną i podsieć. Zainstaluj pakiet NuGet usługi Azure Network. Ten krok jest opcjonalny, jeśli używasz istniejącej sieci i podsieci.
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);
Utwórz publiczny adres IP i ustaw właściwość etykiety DNS publicznego adresu IP. Usługi Cloud Services (rozszerzona obsługa) obsługują tylko publiczne adresy IP jednostki SKU w warstwie Podstawowa . Publiczne adresy IP jednostki SKU w warstwie Standardowa nie działają z usługami Cloud Services. Jeśli używasz statycznego adresu IP, musisz odwołać się do niego jako zastrzeżony adres IP w pliku konfiguracji usługi (cscfg)
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);
Utwórz obiekt profilu sieciowego i skojarz publiczny adres IP z frontonem modułu równoważenia obciążenia. Platforma Azure automatycznie tworzy zasób modułu równoważenia obciążenia jednostki SKU "klasyczny" w tej samej subskrypcji co zasób usługi w chmurze. Zasób modułu równoważenia obciążenia jest zasobem tylko do odczytu w usłudze ARM. Wszystkie aktualizacje zasobu są obsługiwane tylko za pośrednictwem plików wdrażania usługi w chmurze (cscfg i .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 } } } } };
Tworzenie magazynu kluczy. Ten magazyn kluczy będzie używany do przechowywania certyfikatów skojarzonych z rolami usług Cloud Services (rozszerzona pomoc techniczna). Magazyn kluczy musi znajdować się w tym samym regionie i subskrypcji co wystąpienie usługi Cloud Services (rozszerzona pomoc techniczna) i mieć unikatową nazwę. Aby uzyskać więcej informacji, zobacz Używanie certyfikatów z usługami Azure Cloud Services (rozszerzona pomoc techniczna).
New-AzKeyVault -Name "ContosKeyVault” -ResourceGroupName “ContosoOrg” -Location “East US”
Zaktualizuj zasady dostępu magazynu kluczy i przyznaj uprawnienia certyfikatu do konta użytkownika.
Set-AzKeyVaultAccessPolicy -VaultName 'ContosKeyVault' -ResourceGroupName 'ContosoOrg' -UserPrincipalName 'user@domain.com' -PermissionsToCertificates create,get,list,delete
Alternatywnie ustaw zasady dostępu za pomocą identyfikatora obiektu (który można uzyskać, uruchamiając polecenie
Get-AzADUser
).Set-AzKeyVaultAccessPolicy -VaultName 'ContosKeyVault' -ResourceGroupName 'ContosOrg' - ObjectId 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' -PermissionsToCertificates create,get,list,delete
W tym przykładzie dodamy certyfikat z podpisem własnym do magazynu kluczy. Odcisk palca certyfikatu należy dodać w pliku konfiguracji usługi (cscfg) do wdrożenia w rolach usług Cloud Services (rozszerzona obsługa).
$Policy = New-AzKeyVaultCertificatePolicy -SecretContentType "application/x-pkcs12" - SubjectName "CN=contoso.com" -IssuerName "Self" -ValidityInMonths 6 -ReuseKeyOnRenewal Add-AzKeyVaultCertificate -VaultName "ContosKeyVault" -Name "ContosCert" - CertificatePolicy $Policy
Utwórz obiekt profilu systemu operacyjnego. Profil systemu operacyjnego określa certyfikaty skojarzone z rolami usług Cloud Services (rozszerzona obsługa). W tym miejscu jest to ten sam certyfikat, który został utworzony w poprzednim kroku.
CloudServiceOsProfile cloudServiceOsProfile = new CloudServiceOsProfile { Secrets = new List<CloudServiceVaultSecretGroup> { New CloudServiceVaultSecretGroup { SourceVault = <sourceVault>, VaultCertificates = <vaultCertificates> } } };
Utwórz obiekt profilu roli. Profil roli definiuje właściwości specyficzne dla roli dla jednostki SKU, takie jak nazwa, pojemność i warstwa.
W tym przykładzie definiujemy dwie role: ContosoFrontend i ContosoBackend. Informacje o profilu roli powinny być zgodne z konfiguracją roli zdefiniowaną w pliku konfiguracji usługi (cscfg) i pliku definicji usługi (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' } ); } }
(Opcjonalnie) Utwórz obiekt profilu rozszerzenia, który chcesz dodać do wystąpienia usług Cloud Services (rozszerzonej pomocy technicznej). W tym przykładzie dodamy rozszerzenie 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 };
Utwórz wdrożenie wystąpienia usług Cloud Services (wsparcie dodatkowe).
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);
Następne kroki
- Zapoznaj się z często zadawanymi pytaniami dotyczącymi usług Cloud Services (rozszerzona pomoc techniczna).
- Wdrażanie usług Cloud Services (wsparcie dodatkowe) przy użyciu witryny Azure Portal, programu PowerShell, szablonu lub programu Visual Studio.
- Odwiedź repozytorium Przykłady dla usług Cloud Services (rozszerzona pomoc techniczna)