Implemente o WebSphere Liberty e o Open Liberty no Red Hat OpenShift do Azure
Este artigo mostra como posicionar rapidamente o IBM WebSphere Liberty e o Open Liberty no Red Hat OpenShift do Azure usando o portal do Azure.
Este artigo usa a oferta do Azure Marketplace para Open/WebSphere Liberty para acelerar sua jornada para o Azure Red Hat OpenShift. A oferta provisiona automaticamente vários recursos, incluindo um cluster do Azure Red Hat OpenShift com um OCR (OpenShift Container Registry) integrado, os Operadores do Liberty e, opcionalmente, uma imagem de contêiner, incluindo o Liberty e seu aplicativo. Para ver a oferta, visite o portal do Azure. Se você preferir orientação passo a passo manual para executar o Liberty no Azure Red Hat OpenShift que não utilize a automação habilitada pela oferta, consulte Implantar manualmente um aplicativo Java com o Open Liberty/WebSphere Liberty em um cluster do Azure Red Hat OpenShift.
Este artigo destina-se a ajudá-lo a chegar rapidamente à implantação. Antes de ir para a produção, você deve explorar Tuning Liberty.
Se você estiver interessado em fornecer comentários ou trabalhar em estreita colaboração em seus cenários de migração com a equipe de engenharia que desenvolve soluções WebSphere on Azure, preencha esta breve pesquisa sobre migração do WebSphere e inclua suas informações de contato. A equipe de gerentes de programa, arquitetos e engenheiros entrará prontamente em contato com você para iniciar uma estreita colaboração.
Importante
Embora o ARO seja projetado, operado e suportado em conjunto pela Red Hat e pela Microsoft para fornecer uma experiência de suporte integrada, o software executado sobre o ARO, incluindo o descrito neste artigo, está sujeito aos seus próprios termos de suporte e licença. Para obter detalhes sobre o suporte do ARO, consulte Ciclo de vida do suporte para o Azure Red Hat OpenShift 4. Para obter detalhes sobre o suporte do software descrito neste artigo, consulte as páginas principais desse software, conforme listado no artigo.
Nota
O Azure Red Hat OpenShift requer, pelo menos, 40 núcleos para criar e executar um cluster do OpenShift. A quota de recursos predefinida de uma nova subscrição do Azure não cumpre este requisito. Para solicitar um aumento no limite de recursos, consulte a seção Solicitar um aumento para cotas não ajustáveis em Aumentar cotas vCPU da família VM. Como o tipo de cota para a qual você precisa solicitar um aumento é "não ajustável", você deve registrar um tíquete de suporte. As etapas em Solicitar um aumento para cotas não ajustáveis mostram exatamente como arquivar o ticket com o conteúdo correto.
A subscrição de avaliação gratuita não é elegível para um aumento de quota. Atualize para uma subscrição pré-paga antes de solicitar um aumento de quota. Para obter mais informações, consulte Atualizar sua conta gratuita do Azure ou Conta do Azure for Students Starter.
Pré-requisitos
- Uma subscrição do Azure. Se não tiver uma subscrição do Azure, crie uma conta gratuita do Azure antes de começar.
- Uma máquina local com um sistema operacional Unix-like instalado (por exemplo, Ubuntu, macOS ou Windows Subsystem para Linux).
- CLI do Azure. Se estiver a utilizar o Windows ou macOS, considere executar a CLI do Azure num contentor Docker. Para obter mais informações, consulte Como executar a CLI do Azure em um contêiner do Docker.
- Entre na CLI do Azure usando o comando az login . Para concluir o processo de autenticação, siga os passos apresentados no seu terminal. Para outras opções de entrada, consulte Entrar no Azure com a CLI do Azure.
- Quando solicitado, instale a extensão da CLI do Azure na primeira utilização. Para obter mais informações sobre extensões, consulte Usar e gerenciar extensões com a CLI do Azure.
- Execute o comando az version para localizar a versão e as bibliotecas dependentes instaladas. Para atualizar para a versão mais recente, execute o comando az upgrade. Este artigo requer pelo menos a versão 2.31.0 da CLI do Azure.
- Uma implementação Java Standard Edition (SE), versão 17 ou posterior (por exemplo, Eclipse Open J9).
- Maven versão 3.5.0 ou superior.
- Docker para seu sistema operacional.
- A identidade do Azure que você usa para entrar tem a função de Colaborador e a função de Administrador de Acesso de Usuário ou a função de Proprietário na assinatura atual. Para obter uma visão geral das funções do Azure, consulte O que é o controle de acesso baseado em função do Azure (Azure RBAC)?
Obtenha um segredo de atração da Red Hat
A oferta do Azure Marketplace que você usará neste artigo requer um segredo de pull da Red Hat. Esta seção mostra como obter um segredo de pull da Red Hat para o Azure Red Hat OpenShift. Para saber mais sobre o que é um segredo de pull da Red Hat e por que você precisa dele, consulte a seção Obter um segredo de pull da Red Hat de Criar um cluster do Azure Red Hat OpenShift 4. Para obter o segredo de pull para uso, siga as etapas nesta seção.
Use sua conta Red Hat para fazer login no portal do gerenciador de clusters OpenShift, visitando o Red Hat OpenShift Hybrid Cloud Console. Talvez seja necessário aceitar mais termos e atualizar sua conta, conforme mostrado na captura de tela a seguir. Utilize a mesma palavra-passe de quando criou a conta.
Depois de iniciar sessão, selecione OpenShift e, em seguida , Transferências. Selecione a lista suspensa Todas as categorias e, em seguida, selecione Tokens. Em Extrair segredo, selecione Copiar ou Baixar, conforme mostrado na captura de tela a seguir.
O conteúdo a seguir é um exemplo que foi copiado do portal do console Red Hat, com os códigos de autenticação substituídos por xxxx...xxx
.
{"auths":{"cloud.openshift.com":{"auth":"xxxx...xxx","email":"contoso-user@contoso.com"},"quay.io":{"auth":"xxx...xxx","email":"contoso-user@test.com"},"registry.connect.redhat.com":{"auth":"xxxx...xxx","email":"contoso-user@contoso.com"},"registry.redhat.io":{"auth":"xxxx...xxx","email":"contoso-user@contoso.com"}}}
Salve o segredo em um arquivo para que você possa usá-lo mais tarde.
Criar uma entidade de serviço do Microsoft Entra a partir do portal do Azure
A oferta do Azure Marketplace que você usará neste artigo requer uma entidade de serviço do Microsoft Entra para implantar seu cluster do Azure Red Hat OpenShift. A oferta atribui à entidade de serviço privilégios adequados durante o tempo de implantação, sem necessidade de atribuição de função. Se você tiver uma entidade de serviço pronta para usar, ignore esta seção e passe para a próxima seção, onde você implanta a oferta.
Use as etapas a seguir para implantar uma entidade de serviço e obter sua ID de Aplicativo (cliente) e segredo do portal do Azure. Para obter mais informações, consulte Criar e usar uma entidade de serviço para implantar um cluster do Azure Red Hat OpenShift.
Nota
Você deve ter permissões suficientes para registrar um aplicativo com seu locatário do Microsoft Entra. Se você tiver um problema, verifique as permissões necessárias para garantir que sua conta possa criar a identidade. Para obter mais informações, consulte Registrar um aplicativo Microsoft Entra e criar uma entidade de serviço.
Entre na sua conta do Azure por meio do portal do Azure.
Selecione Microsoft Entra ID.
Selecione Registos de aplicações.
Selecione Novo registo.
Nomeie o aplicativo, por exemplo, "liberty-on-aro-app". Selecione um tipo de conta suportado, que determina quem pode usar o aplicativo. Depois de definir os valores, selecione Registrar, conforme mostrado na captura de tela a seguir. Leva vários segundos para provisionar o aplicativo. Aguarde a conclusão da implantação antes de prosseguir.
Salve o ID do aplicativo (cliente) na página de visão geral, conforme mostrado na captura de tela a seguir. Passe o ponteiro sobre o valor (editado na captura de tela) e selecione o ícone de cópia que aparece. A dica de ferramenta diz Copiar para área de transferência. Tenha cuidado para copiar o valor correto, pois os outros valores nessa seção também têm ícones de cópia. Salve a ID do aplicativo em um arquivo para que você possa usá-lo mais tarde.
Crie um novo segredo de cliente seguindo estas etapas:
- Selecione Certificados & segredos.
- Selecione Segredos do cliente e, em seguida , Novo segredo do cliente.
- Forneça uma descrição do segredo e uma duração. Quando terminar, selecione Adicionar.
- Depois que o segredo do cliente é adicionado, o valor do segredo do cliente é exibido. Copie esse valor porque não é possível recuperá-lo mais tarde.
Agora você tem um aplicativo Microsoft Entra, entidade de serviço e segredo do cliente.
Implementar o IBM WebSphere Liberty ou Open Liberty no Azure Red Hat OpenShift
As etapas nesta seção direcionam você para implementar o IBM WebSphere Liberty ou Open Liberty no Red Hat OpenShift do Azure.
As etapas a seguir mostram como encontrar a oferta e preencher o painel Noções básicas .
Na barra de pesquisa na parte superior do portal do Azure, digite Liberty. Nos resultados de pesquisa sugeridos automaticamente, na seção Marketplace , selecione IBM Liberty on ARO, conforme mostrado na captura de tela a seguir.
Você também pode ir diretamente para a oferta com este link do portal.
Na página da oferta, selecione Criar.
No painel Noções básicas, verifique se o valor mostrado no campo Assinatura é o mesmo que tem as funções listadas na seção de pré-requisitos.
A oferta deve ser implantada em um grupo de recursos vazio. No campo Grupo de recursos, selecione Criar novo e preencha um valor para o grupo de recursos. Como os grupos de recursos devem ser exclusivos dentro de uma assinatura, escolha um nome exclusivo. Uma maneira fácil de ter nomes exclusivos é usar uma combinação de suas iniciais, a data de hoje e algum identificador. Por exemplo, abc1228rg.
Crie uma variável de ambiente em seu shell para o nome do grupo de recursos.
export RESOURCE_GROUP_NAME=<your-resource-group-name>
Em Detalhes da instância, selecione a região para a implantação. Para obter uma lista de regiões do Azure onde o OpenShift opera, consulte Regiões do Red Hat OpenShift 4.x no Azure.
Depois de selecionar a região, selecione Avançar.
As etapas a seguir mostram como preencher o painel ARO mostrado na captura de tela a seguir:
Em Criar um novo cluster, selecione Sim.
Em Fornecer informações para criar um novo cluster, para o segredo de pull da Red Hat, preencha o segredo de pull da Red Hat que você obteve na seção Obter um segredo de pull da Red Hat. Use o mesmo valor para Confirmar segredo.
Preencha a ID do cliente da entidade de serviço com a ID do Aplicativo (cliente) da entidade de serviço que você obteve na seção Criar uma entidade de serviço do Microsoft Entra na seção Portal do Azure.
Preencha o segredo do cliente da entidade de serviço com o segredo do aplicativo da entidade de serviço que você obteve na seção Criar uma entidade de serviço do Microsoft Entra no portal do Azure. Use o mesmo valor para Confirmar segredo.
Depois de preencher os valores, selecione Avançar.
As etapas a seguir mostram como preencher o painel Operador e aplicativo mostrado na captura de tela a seguir e iniciar a implantação.
Em IBM supported?, selecione Sim.
Nota
Este início rápido implementa o WebSphere Liberty Operator suportado pela IBM, mas você pode selecionar Não para implementar o Open Liberty Operator.
Deixe a opção padrão de Não para implantar um aplicativo?.
Nota
Este início rápido implanta manualmente um aplicativo de exemplo mais tarde, mas você pode selecionar Sim para Implantar um aplicativo? , se preferir.
Selecione Rever + criar. Verifique se a mensagem verde Validação aprovada aparece na parte superior. Se a mensagem não aparecer, corrija os problemas de validação e selecione Rever + criar novamente.
Selecione Criar.
Acompanhe o progresso da implantação na página Implantação está em andamento .
Dependendo das condições da rede e de outras atividades na região selecionada, a implantação pode levar até 40 minutos para ser concluída.
Verificar a funcionalidade da implantação
As etapas nesta seção mostram como verificar se a implantação foi concluída com êxito.
Se você navegou para fora da página Implantação está em andamento , as etapas a seguir mostram como voltar a essa página. Se você ainda estiver na página que mostra Sua implantação foi concluída, pule para a etapa 5.
No canto de qualquer página do portal, selecione o menu hambúrguer e, em seguida, selecione Grupos de recursos.
Na caixa com o texto Filtro para qualquer campo, insira os primeiros caracteres do grupo de recursos criado anteriormente. Se você seguiu a convenção recomendada, insira suas iniciais e selecione o grupo de recursos apropriado.
No painel de navegação, na seção Configurações , selecione Implantações. Você verá uma lista ordenada das implantações para esse grupo de recursos, com a mais recente primeiro.
Desloque-se para a entrada mais antiga desta lista. Esta entrada corresponde à implantação iniciada na seção anterior. Selecione a implantação mais antiga, conforme mostrado na captura de tela a seguir.
No painel de navegação, selecione Saídas. Esta lista mostra os valores de saída da implantação, que inclui algumas informações úteis.
Abra o terminal e cole o valor do campo cmdToGetKubeadminCredentials . Você vê a conta de administrador e a credencial para fazer login no portal do console do cluster OpenShift. O conteúdo a seguir é um exemplo de uma conta de administrador.
az aro list-credentials --resource-group abc1228rg --name clusterf9e8b9 { "kubeadminPassword": "xxxxx-xxxxx-xxxxx-xxxxx", "kubeadminUsername": "kubeadmin" }
Cole o valor do campo clusterConsoleUrl em um navegador da Web conectado à Internet e pressione Enter. Preencha o nome de utilizador e a palavra-passe do administrador e inicie sessão.
Verifique se o operador Kubernetes apropriado para Liberty está instalado. No painel de navegação, selecione Operadores e, em seguida , Operadores instalados, conforme mostrado na captura de tela a seguir:
Tome nota se instalou o operador WebSphere Liberty ou o operador Open Liberty. A variante do operador corresponde ao que você selecionou no momento da implantação. Se você selecionou IBM Supported, terá o operador WebSphere Liberty. Caso contrário, você tem o operador Open Liberty. Esta informação é importante saber em etapas posteriores.
Baixe e instale a CLI
oc
do OpenShift seguindo as etapas no tutorial Instale a CLI do OpenShift e retorne a esta documentação.Alterne para o painel Saídas , copie o valor do campo cmdToLoginWithKubeadmin e cole-o no terminal. Execute o comando para entrar no servidor de API do cluster OpenShift. Você deve ver uma saída semelhante ao exemplo a seguir no console:
Login successful. You have access to 71 projects, the list has been suppressed. You can list all projects with 'oc projects' Using project "default".
Criar uma Base de Dados SQL do Azure
As etapas a seguir o orientam na criação de um banco de dados único do Banco de Dados SQL do Azure para uso com seu aplicativo:
Crie um único banco de dados no Banco de Dados SQL do Azure seguindo as etapas em Guia de início rápido: criar um banco de dados único do Banco de Dados SQL do Azure, observando cuidadosamente as diferenças descritas na observação a seguir. Você pode implantar o banco de dados no mesmo grupo de recursos que o cluster OpenShift. Retorne a este artigo depois de criar e configurar o servidor de banco de dados.
Nota
Na etapa Noções básicas, anote os valores para Grupo de recursos, Nome do banco de dados,< Nome> do servidor.database.windows.net, Login de administrador do servidor e Senha. O grupo de recursos do banco de dados é referido como
<db-resource-group>
mais adiante neste artigo.Na etapa Rede, defina Método de conectividade como Ponto de extremidade Público, Permitir que os serviços e recursos do Azure acessem este servidor como Sim e Adicionar endereço IP do cliente atual como Sim.
Crie uma variável de ambiente em seu shell para o nome do grupo de recursos para o banco de dados.
export DB_RESOURCE_GROUP_NAME=<db-resource-group>
Agora que você criou o banco de dados e o cluster do Azure Red Hat OpenShift, pode preparar o cluster do Azure Red Hat OpenShift para hospedar seu aplicativo WebSphere Liberty.
Configurar e implantar o aplicativo de exemplo
Siga as etapas nesta seção para implantar o aplicativo de exemplo no tempo de execução do Liberty. Estas etapas usam o Maven.
Confira o aplicativo
Clone o código de exemplo para este guia usando os comandos a seguir. O exemplo está no GitHub.
git clone https://github.com/Azure-Samples/open-liberty-on-aro.git
cd open-liberty-on-aro
export BASE_DIR=$PWD
git checkout 20240920
cd 3-integration/connect-db/mssql
Se vir uma mensagem sobre estar no estado "HEAD desanexado", é seguro ignorá-la. Isso significa apenas que você fez check-out de uma tag.
Existem algumas amostras no repositório. Usamos 3-integration/connect-db/mssql/. Aqui está a estrutura de arquivos do aplicativo:
mssql
├─ src/main/
│ ├─ aro/
│ │ ├─ db-secret.yaml
│ │ ├─ openlibertyapplication.yaml
│ │ ├─ webspherelibertyapplication.yaml
│ ├─ docker/
│ │ ├─ Dockerfile
│ │ ├─ Dockerfile-ol
│ ├─ liberty/config/
│ │ ├─ server.xml
│ ├─ java/
│ ├─ resources/
│ ├─ webapp/
├─ pom.xml
Os diretórios java, resources e webapp contêm o código-fonte do aplicativo de exemplo. O código declara e usa uma fonte de dados chamada jdbc/JavaEECafeDB
.
No diretório aro, há três arquivos de implantação. db-secret.xml é usado para criar segredos do Kubernetes com credenciais de conexão de banco de dados. O arquivo webspherelibertyapplication.yaml é usado neste início rápido para implementar o WebSphere Liberty Application. Use o arquivo openlibertyapplication.yaml para implementar o Open Liberty Application se você implementou o Open Liberty Operator na seção Deploy IBM WebSphere Liberty ou Open Liberty on Azure Red Hat OpenShift.
No diretório docker, há dois arquivos para criar a imagem do aplicativo com o Open Liberty ou o WebSphere Liberty. Esses arquivos são Dockerfile e Dockerfile-ol, respectivamente. Use o arquivo Dockerfile para construir a imagem do aplicativo com o WebSphere Liberty neste início rápido. Da mesma forma, use o arquivo Dockerfile-ol para criar a imagem do aplicativo com o Open Liberty se você implementou o Open Liberty Operator na seção Implementar o IBM WebSphere Liberty ou o Open Liberty no Red Hat OpenShift do Azure.
No diretório liberty/config, o arquivo server.xml é usado para configurar a conexão do banco de dados para o cluster Open Liberty e WebSphere Liberty.
Compilar o projeto
Agora que você reuniu as propriedades necessárias, você pode criar o aplicativo usando os seguintes comandos. O arquivo POM para o projeto lê muitas variáveis do ambiente. Como parte da compilação do Maven, essas variáveis são usadas para preencher valores nos arquivos YAML localizados em src/main/aro. Você pode fazer algo semelhante para sua aplicação fora do Maven, se preferir.
cd ${BASE_DIR}/3-integration/connect-db/mssql
# The following variables are used for deployment file generation into target.
export DB_SERVER_NAME=<server-name>.database.windows.net
export DB_NAME=<database-name>
export DB_USER=<server-admin-login>@<server-name>
export DB_PASSWORD=<server-admin-password>
mvn clean install
(Opcional) Teste o seu projeto localmente
Agora você pode executar e testar o projeto localmente antes de implantar no Azure usando as etapas a seguir. Por conveniência, usamos o liberty-maven-plugin
. Para saber mais sobre o , consulte Criando um aplicativo Web com o liberty-maven-plugin
Maven. Para seu aplicativo, você pode fazer algo semelhante usando qualquer outro mecanismo, como o IDE local. Você também pode considerar o uso da liberty:devc
opção destinada ao desenvolvimento com contêineres. Você pode ler mais sobre liberty:devc
nos documentos da Liberty.
Inicie o aplicativo usando , conforme
liberty:run
mostrado no exemplo a seguir.liberty:run
também usa as variáveis de ambiente definidas na seção anterior.cd ${BASE_DIR}/3-integration/connect-db/mssql mvn liberty:run
Verifique se o aplicativo funciona conforme o esperado. Você verá uma mensagem semelhante na
[INFO] [AUDIT] CWWKZ0003I: The application javaee-cafe updated in 1.930 seconds.
saída do comando, se for bem-sucedida. Vá parahttp://localhost:9080/
ouhttps://localhost:9443/
no seu navegador e verifique se o aplicativo está acessível e todas as funções estão funcionando.Pressione Ctrl+C para parar.
Em seguida, use as seguintes etapas para colocar em contêiner seu projeto usando o Docker e executá-lo como um contêiner localmente antes de implantar no Azure:
Use os seguintes comandos para criar a imagem:
cd ${BASE_DIR}/3-integration/connect-db/mssql/target docker buildx build --platform linux/amd64 -t javaee-cafe:v1 --pull --file=Dockerfile .
Execute a imagem usando o seguinte comando. Observe que estamos usando as variáveis de ambiente definidas anteriormente.
docker run -it --rm -p 9080:9080 -p 9443:9443 \ -e DB_SERVER_NAME=${DB_SERVER_NAME} \ -e DB_NAME=${DB_NAME} \ -e DB_USER=${DB_USER} \ -e DB_PASSWORD=${DB_PASSWORD} \ javaee-cafe:v1
Assim que o contêiner for iniciado, vá para
http://localhost:9080/
ouhttps://localhost:9443/
no seu navegador para acessar o aplicativo.Pressione Ctrl+C para parar.
Crie imagens e envie para o fluxo de imagens
Quando estiver satisfeito com o estado do aplicativo, crie a imagem remotamente no cluster usando as etapas a seguir.
Use os seguintes comandos para identificar o diretório de origem e o Dockerfile:
cd ${BASE_DIR}/3-integration/connect-db/mssql/target # If you are deploying the application with WebSphere Liberty Operator, the existing Dockerfile is ready for you # If you are deploying the application with Open Liberty Operator, uncomment and execute the following two commands to rename Dockerfile-ol to Dockerfile # mv Dockerfile Dockerfile.backup # mv Dockerfile-ol Dockerfile
Use o seguinte comando para criar um fluxo de imagem:
oc create imagestream javaee-cafe
Use o comando a seguir para criar uma configuração de compilação que especifique a marca de fluxo de imagem da saída da compilação:
oc new-build --name javaee-cafe-config --binary --strategy docker --to javaee-cafe:v1
Use o comando a seguir para iniciar a compilação para carregar conteúdo local, contêinerizar e saída para a tag de fluxo de imagem especificada anteriormente:
oc start-build javaee-cafe-config --from-dir . --follow
Implantar e testar o aplicativo
Use as seguintes etapas para implantar e testar o aplicativo:
Use o seguinte comando para aplicar o segredo do banco de dados:
cd ${BASE_DIR}/3-integration/connect-db/mssql/target oc apply -f db-secret.yaml
Você deve ver a saída
secret/db-secret-mssql created
.Use o seguinte comando para aplicar o arquivo de implantação:
oc apply -f webspherelibertyapplication.yaml
Aguarde até que todos os pods sejam iniciados e executados com êxito usando o seguinte comando:
oc get pods -l app.kubernetes.io/name=javaee-cafe --watch
Você deve ver uma saída semelhante ao exemplo a seguir para indicar que todos os pods estão em execução:
NAME READY STATUS RESTARTS AGE javaee-cafe-67cdc95bc-2j2gr 1/1 Running 0 29s javaee-cafe-67cdc95bc-fgtt8 1/1 Running 0 29s javaee-cafe-67cdc95bc-h47qm 1/1 Running 0 29s
Use as seguintes etapas para verificar os resultados:
Use o seguinte comando para obter o host do recurso Route implantado com o aplicativo:
echo "route host: https://$(oc get route javaee-cafe --template='{{ .spec.host }}')"
Copie o valor de
route host
da saída, abra-o em seu navegador e teste o aplicativo. Se a página da Web não for renderizada corretamente, é porque o aplicativo ainda está começando em segundo plano. Aguarde alguns minutos e tente novamente.Adicione e exclua alguns cafés para verificar a funcionalidade do aplicativo e a conexão com o banco de dados.
Clean up resources (Limpar recursos)
Para evitar cobranças do Azure, você deve limpar recursos desnecessários. Quando o cluster não for mais necessário, use o comando az group delete para remover o grupo de recursos, o cluster do Azure Red Hat OpenShift, o Banco de Dados SQL do Azure e todos os recursos relacionados.
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait
az group delete --name $DB_RESOURCE_GROUP_NAME --yes --no-wait
Próximos passos
Para obter mais informações sobre como implementar a família IBM WebSphere no Azure, consulte O que são soluções para executar a família de produtos WebSphere no Azure?