Implantar Serviços de Nuvem (suporte estendido) usando o SDK do Azure
Este artigo mostra como usar o SDK do Azure para implantar uma instância de Serviços de Nuvem (suporte estendido) que tenha várias funções (função Web e função de trabalho) e a extensão de área de trabalho remota. Os Serviços de Nuvem (suporte estendido) são um modelo de implantação dos Serviços de Nuvem do Azure baseado no Gerenciador de Recursos do Azure.
Antes de começar
Analise os pré-requisitos de implantação para Serviços de Nuvem (suporte estendido) e crie recursos associados.
Implantar serviços de nuvem (suporte estendido)
Instale o pacote NuGet do Azure Compute SDK e inicialize o cliente usando um mecanismo de autenticação padrão.
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;
Crie um novo grupo de recursos instalando o pacote NuGet do 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);
Crie uma conta de armazenamento e um contêiner onde você armazenará o pacote de serviço (.cspkg) e os arquivos de configuração de serviço (.cscfg). Instale o pacote NuGet do Armazenamento do Azure. Esta etapa é opcional se você estiver usando uma conta de armazenamento existente. O nome da conta de armazenamento deve ser exclusivo.
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;
Carregue o arquivo do pacote de serviço (.cspkg) para a conta de armazenamento. A URL do pacote pode ser um URI de assinatura de acesso compartilhado (SAS) de qualquer conta de armazenamento.
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;
Carregue seu arquivo de configuração de serviço (.cscfg) para a conta de armazenamento. Especifique a configuração do serviço como formato XML ou URL de cadeia de caracteres.
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;
Crie uma rede virtual e uma sub-rede. Instale o pacote NuGet da Rede do Azure. Esta etapa é opcional se você estiver usando uma rede e uma sub-rede existentes.
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);
Crie um endereço IP público e defina a propriedade DNS label do endereço IP público. Os Serviços de Nuvem (suporte estendido) suportam apenas endereços IP públicos SKU básicos . Os IPs públicos de SKU padrão não funcionam com os Serviços de Nuvem. Se você estiver usando um IP estático, precisará fazer referência a ele como um arquivo de IP reservado na configuração do serviço (.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);
Crie um Objeto de Perfil de Rede e associe o endereço IP público ao frontend do balanceador de carga. A plataforma Azure cria automaticamente um recurso de balanceador de carga SKU 'Clássico' na mesma assinatura que o recurso de serviço de nuvem. O recurso do balanceador de carga é um recurso somente leitura em ARM. Quaisquer atualizações do recurso são suportadas apenas por meio dos arquivos de implantação do serviço de nuvem (.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 } } } } };
Criar um cofre de chaves. Esse cofre de chaves será usado para armazenar certificados associados às funções de Serviços de Nuvem (suporte estendido). O cofre de chaves deve estar localizado na mesma região e assinatura que a instância dos Serviços de Nuvem (suporte estendido) e ter um nome exclusivo. Para obter mais informações, consulte Usar certificados com os Serviços de Nuvem do Azure (suporte estendido).
New-AzKeyVault -Name "ContosKeyVault” -ResourceGroupName “ContosoOrg” -Location “East US”
Atualize a política de acesso do cofre de chaves e conceda permissões de certificado à sua conta de usuário.
Set-AzKeyVaultAccessPolicy -VaultName 'ContosKeyVault' -ResourceGroupName 'ContosoOrg' -UserPrincipalName 'user@domain.com' -PermissionsToCertificates create,get,list,delete
Como alternativa, defina a política de acesso via ID do objeto (que você pode obter executando
Get-AzADUser
).Set-AzKeyVaultAccessPolicy -VaultName 'ContosKeyVault' -ResourceGroupName 'ContosOrg' - ObjectId 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' -PermissionsToCertificates create,get,list,delete
Neste exemplo, adicionaremos um certificado autoassinado a um cofre de chaves. A impressão digital do certificado precisa ser adicionada no arquivo de configuração de serviço (.cscfg) para implantação em funções de Serviços de Nuvem (suporte estendido).
$Policy = New-AzKeyVaultCertificatePolicy -SecretContentType "application/x-pkcs12" - SubjectName "CN=contoso.com" -IssuerName "Self" -ValidityInMonths 6 -ReuseKeyOnRenewal Add-AzKeyVaultCertificate -VaultName "ContosKeyVault" -Name "ContosCert" - CertificatePolicy $Policy
Crie um objeto de perfil do sistema operacional. O perfil do SO especifica os certificados associados às funções dos Serviços de Nuvem (suporte estendido). Aqui, é o mesmo certificado que criamos na etapa anterior.
CloudServiceOsProfile cloudServiceOsProfile = new CloudServiceOsProfile { Secrets = new List<CloudServiceVaultSecretGroup> { New CloudServiceVaultSecretGroup { SourceVault = <sourceVault>, VaultCertificates = <vaultCertificates> } } };
Crie um objeto de perfil de função. Um perfil de função define propriedades específicas da função para uma SKU, como nome, capacidade e camada.
Neste exemplo, definimos duas funções: ContosoFrontend e ContosoBackend. As informações de perfil de função devem corresponder à configuração de função definida no arquivo de configuração de serviço (.cscfg) e no arquivo de definição de serviço (.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' } ); } }
(Opcional) Crie um objeto de perfil de extensão que você deseja adicionar à sua instância de Serviços de Nuvem (suporte estendido). Neste exemplo, adicionamos uma extensão 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 };
Crie a implantação da instância de Serviços de Nuvem (suporte estendido).
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);
Próximos passos
- Analise as perguntas frequentes sobre Serviços de Nuvem (suporte estendido).
- Implante os Serviços de Nuvem (suporte estendido) usando o portal do Azure, o PowerShell, um modelo ou o Visual Studio.
- Visite o repositório de amostras para serviços em nuvem (suporte estendido)