Implantar Serviços de Nuvem (suporte estendido) usando o SDK do Azure
Este artigo mostra como usar o SDK do Azure para criar uma implantação dos Serviços de Nuvem do Azure (suporte estendido) que tenha várias funções (WebRole e WorkerRole). Ele também aborda como usar a extensão RDP (Remote Desktop Protocol). 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.
Pré-requisitos
Analise os pré-requisitos de implantação para Serviços de Nuvem (suporte estendido) e crie os recursos necessários.
Implantar serviços de nuvem (suporte estendido)
Para implantar Serviços de Nuvem (suporte estendido) usando o SDK:
Instale o pacote NuGet do SDK de Computação do Azure e inicialize o cliente usando um método 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ê armazena o arquivo de pacote (.cspkg ou .zip) e o arquivo de configuração (.cscfg) para a implantação. 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 (.cspkg ou .zip) 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 o arquivo de configuraçã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 um endereço IP público de SKU Básico . Os endereços IP públicos SKU padrão não funcionam com os Serviços de Nuvem (suporte estendido).
Se você usar um endereço IP estático, deverá fazer referência a ele como um endereço IP reservado no arquivo de configuraçã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 front-end do balanceador de carga. A plataforma Azure cria automaticamente um recurso de balanceador de carga SKU clássico na mesma assinatura que a implantação. O recurso do balanceador de carga é somente leitura no Gerenciador de Recursos do Azure. Você pode atualizar o recurso somente por meio do arquivo de configuração (.cscfg) e do arquivo de definição (.csdef) dos Serviços de Nuvem (suporte estendido).
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 armazena certificados associados às funções de Serviços de Nuvem (suporte estendido). O cofre de chaves deve estar na mesma região e assinatura que o recurso Serviços de Nuvem (suporte estendido) e ter um nome exclusivo. Para obter mais informações, consulte Usar certificados com serviços de nuvem (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
O exemplo a seguir adiciona um certificado autoassinado a um cofre de chaves. A impressão digital do certificado deve ser adicionada no arquivo de configuração (.cscfg) para 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). Você usa o mesmo certificado que criou 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.
Este exemplo define duas funções: ContosoFrontend e ContosoBackend. As informações de perfil de função devem corresponder à função definida no arquivo de configuração (.cscfg) e no arquivo de definiçã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 para adicionar à sua implantação de Serviços de Nuvem (suporte estendido). Este exemplo adiciona uma extensão RDP (Remote Desktop Protocol):
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 dos 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);
Conteúdos relacionados
- 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 Azure PowerShell, um modelo ARM ou o Visual Studio.
- Visite o repositório de exemplos de Serviços de Nuvem (suporte estendido).