Introducción al desarrollo en la nube mediante Java en Azure
En este artículo se explica cómo configurar un entorno de desarrollo para el desarrollo de Azure en Java. Después, creará algunos recursos de Azure y los conectará para realizar algunas tareas básicas, como cargar un archivo o implementar una aplicación web. Cuando haya terminado, estará listo para empezar a usar los servicios de Azure en sus propias aplicaciones Java.
Prerrequisitos
- Una cuenta de Azure. Si no tiene una, obtener una evaluación gratuita.
- de Azure Cloud Shell o cli de Azure 2.0.
- Java 8, que se incluye en Azure Cloud Shell.
- Maven 3, que se incluye en Azure Cloud Shell.
Configuración de la autenticación
La aplicación Java necesita leer y crear permisos en la suscripción de Azure para ejecutar el código de ejemplo en este tutorial. Cree una entidad de servicio y configure la aplicación para que se ejecute con sus credenciales. Las entidades de servicio proporcionan una manera de crear una cuenta no interactiva asociada a la identidad a la que solo se conceden los privilegios que necesita la aplicación.
Crear una entidad de servicio mediante la CLI de Azure 2.0y capturar la salida:
az ad sp create-for-rbac \
--name AzureJavaTest \
--role Contributor \
--scopes /subscriptions/<your-subscription-ID>
Este comando proporciona una respuesta en el formato siguiente:
{
"appId": "a487e0c1-82af-47d9-9a0b-af184eb87646d",
"displayName": "AzureJavaTest",
"name": "http://AzureJavaTest",
"password": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
"tenant": "tttttttt-tttt-tttt-tttt-tttttttttttt"
}
A continuación, configure las variables de entorno:
-
AZURE_SUBSCRIPTION_ID
: use el valor id de deaz account show
en la CLI de Azure 2.0. -
AZURE_CLIENT_ID
: use el valor appId de la salida tomada de una salida de entidad de servicio. -
AZURE_CLIENT_SECRET
: use el valor de contraseña de de la salida de la entidad de servicio. -
AZURE_TENANT_ID
: use el valor de de inquilino de de la salida de la entidad de servicio.
Para obtener más opciones de autenticación, consulte la biblioteca cliente de azure Identity para Java.
Nota
Microsoft recomienda usar el flujo de autenticación más seguro disponible. El flujo de autenticación descrito en este procedimiento, como para bases de datos, memorias caché, mensajería o servicios de inteligencia artificial, requiere un grado de confianza muy alto en la aplicación y conlleva riesgos que no están presentes en otros flujos. Use este flujo solo cuando las opciones más seguras, como las identidades administradas para conexiones sin contraseña o sin claves, no sean viables. En el caso de las operaciones de máquina local, prefiera identidades de usuario para conexiones sin contraseña o sin claves.
Utillaje
Creación de un nuevo proyecto de Maven
Nota
En este artículo se usa la herramienta de compilación de Maven para compilar y ejecutar el código de ejemplo. Otras herramientas de compilación, como Gradle, también funcionan con el SDK de Azure para Java.
Cree un proyecto de Maven desde la línea de comandos en un nuevo directorio del sistema.
mkdir java-azure-test
cd java-azure-test
mvn archetype:generate -DgroupId=com.fabrikam -DartifactId=AzureApp \
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Este paso crea un proyecto básico de Maven en el directorio testAzureApp. Agregue las siguientes entradas al archivo pom.xml del proyecto para importar las bibliotecas usadas en el código de ejemplo de este tutorial.
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.azure.resourcemanager</groupId>
<artifactId>azure-resourcemanager</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
<version>12.8.0</version>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>6.2.1.jre8</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.33</version>
</dependency>
Agregue una entrada build
en el elemento project
de nivel superior para usar el maven-exec-plugin para ejecutar los ejemplos.
maven-compiler-plugin se usa para configurar el código fuente y las clases generadas para Java 8.
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<mainClass>com.fabrikam.App</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
Creación de una máquina virtual Linux
Cree un nuevo archivo denominado App.java en el directorio src/main/java/com/fabrikam y pegue el siguiente bloque de código. Actualice las variables userName
y sshKey
con valores reales para la máquina. El código crea una nueva máquina virtual Linux con el nombre testLinuxVM
en el grupo de recursos sampleResourceGroup
que se ejecuta en la región de Azure Este de EE. UU.
package com.fabrikam;
import com.azure.core.credential.TokenCredential;
import com.azure.core.http.policy.HttpLogDetailLevel;
import com.azure.core.management.AzureEnvironment;
import com.azure.core.management.Region;
import com.azure.core.management.profile.AzureProfile;
import com.azure.identity.AzureAuthorityHosts;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.resourcemanager.AzureResourceManager;
import com.azure.resourcemanager.compute.models.KnownLinuxVirtualMachineImage;
import com.azure.resourcemanager.compute.models.VirtualMachine;
import com.azure.resourcemanager.compute.models.VirtualMachineSizeTypes;
public class App {
public static void main(String[] args) {
final String userName = "YOUR_VM_USERNAME";
final String sshKey = "YOUR_PUBLIC_SSH_KEY";
try {
TokenCredential credential = new DefaultAzureCredentialBuilder()
.authorityHost(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)
.build();
// If you don't set the tenant ID and subscription ID via environment variables,
// change to create the Azure profile with tenantId, subscriptionId, and Azure environment.
AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);
AzureResourceManager azureResourceManager = AzureResourceManager.configure()
.withLogLevel(HttpLogDetailLevel.BASIC)
.authenticate(credential, profile)
.withDefaultSubscription();
// Create an Ubuntu virtual machine in a new resource group.
VirtualMachine linuxVM = azureResourceManager.virtualMachines().define("testLinuxVM")
.withRegion(Region.US_EAST)
.withNewResourceGroup("sampleVmResourceGroup")
.withNewPrimaryNetwork("10.0.0.0/24")
.withPrimaryPrivateIPAddressDynamic()
.withoutPrimaryPublicIPAddress()
.withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_18_04_LTS)
.withRootUsername(userName)
.withSsh(sshKey)
.withSize(VirtualMachineSizeTypes.STANDARD_D3_V2)
.create();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
Ejecute el ejemplo desde la línea de comandos.
mvn compile exec:java
Verá algunas solicitudes rest y respuestas en la consola, ya que el SDK realiza las llamadas subyacentes a la API REST de Azure para configurar la máquina virtual y sus recursos. Una vez finalizado el programa, compruebe la máquina virtual de la suscripción con la CLI de Azure 2.0.
az vm list --resource-group sampleVmResourceGroup
Después de comprobar que el código funcionó, use la CLI para eliminar la máquina virtual y sus recursos.
az group delete --name sampleVmResourceGroup
Implementación de una aplicación web desde un repositorio de GitHub
Reemplace el método main en App.java por el siguiente. Actualice la variable appName
a un valor único antes de ejecutar el código. Este código implementa una aplicación web desde la rama master
en un repositorio público de GitHub en un nuevo aplicación web de Azure App Service que se ejecuta en el plan de tarifa gratuito.
public static void main(String[] args) {
try {
final String appName = "YOUR_APP_NAME";
TokenCredential credential = new DefaultAzureCredentialBuilder()
.authorityHost(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)
.build();
// If you don't set the tenant ID and subscription ID via environment variables,
// change to create the Azure profile with tenantId, subscriptionId, and Azure environment.
AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);
AzureResourceManager azureResourceManager = AzureResourceManager.configure()
.withLogLevel(HttpLogDetailLevel.BASIC)
.authenticate(credential, profile)
.withDefaultSubscription();
WebApp app = azureResourceManager.webApps().define(appName)
.withRegion(Region.US_WEST2)
.withNewResourceGroup("sampleWebResourceGroup")
.withNewWindowsPlan(PricingTier.FREE_F1)
.defineSourceControl()
.withPublicGitRepository(
"https://github.com/Azure-Samples/app-service-web-java-get-started")
.withBranch("master")
.attach()
.create();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Ejecute el código como antes de usar Maven.
mvn clean compile exec:java
Abra un explorador que apunte a la aplicación mediante la CLI.
az webapp browse --resource-group sampleWebResourceGroup --name YOUR_APP_NAME
Quite la aplicación web y el plan de la suscripción después de comprobar la implementación.
az group delete --name sampleWebResourceGroup
Conexión a una base de datos de Azure SQL
Reemplace el método main actual en App.java por el código siguiente. Establezca valores reales para las variables. Este código crea una nueva base de datos SQL con una regla de firewall que permite el acceso remoto. A continuación, el código se conecta a él mediante el controlador JBDC de SQL Database.
public static void main(String args[]) {
// Create the db using the management libraries.
try {
TokenCredential credential = new DefaultAzureCredentialBuilder()
.authorityHost(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)
.build();
// If you don't set the tenant ID and subscription ID via environment variables,
// change to create the Azure profile with tenantId, subscriptionId, and Azure environment.
AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);
AzureResourceManager azureResourceManager = AzureResourceManager.configure()
.withLogLevel(HttpLogDetailLevel.BASIC)
.authenticate(credential, profile)
.withDefaultSubscription();
final String adminUser = "YOUR_USERNAME_HERE";
final String sqlServerName = "YOUR_SERVER_NAME_HERE";
final String sqlDbName = "YOUR_DB_NAME_HERE";
final String dbPassword = "YOUR_PASSWORD_HERE";
final String firewallRuleName = "YOUR_RULE_NAME_HERE";
SqlServer sampleSQLServer = azureResourceManager.sqlServers().define(sqlServerName)
.withRegion(Region.US_EAST)
.withNewResourceGroup("sampleSqlResourceGroup")
.withAdministratorLogin(adminUser)
.withAdministratorPassword(dbPassword)
.defineFirewallRule(firewallRuleName)
.withIpAddressRange("0.0.0.0","255.255.255.255")
.attach()
.create();
SqlDatabase sampleSQLDb = sampleSQLServer.databases().define(sqlDbName).create();
// Assemble the connection string to the database.
final String domain = sampleSQLServer.fullyQualifiedDomainName();
String url = "jdbc:sqlserver://"+ domain + ":1433;" +
"database=" + sqlDbName +";" +
"user=" + adminUser+ "@" + sqlServerName + ";" +
"password=" + dbPassword + ";" +
"encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;";
// Connect to the database, create a table, and insert an entry into it.
try (Connection conn = DriverManager.getConnection(url)) {
String createTable = "CREATE TABLE CLOUD (name varchar(255), code int);";
String insertValues = "INSERT INTO CLOUD (name, code) VALUES ('Azure', 1);";
String selectValues = "SELECT * FROM CLOUD";
try (Statement createStatement = conn.createStatement()) {
createStatement.execute(createTable);
}
try (Statement insertStatement = conn.createStatement()) {
insertStatement.execute(insertValues);
}
try (Statement selectStatement = conn.createStatement();
ResultSet rst = selectStatement.executeQuery(selectValues)) {
while (rst.next()) {
System.out.println(rst.getString(1) + " " + rst.getString(2));
}
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println(e.getStackTrace().toString());
}
}
Ejecute el ejemplo desde la línea de comandos.
mvn clean compile exec:java
A continuación, limpie los recursos mediante la CLI.
az group delete --name sampleSqlResourceGroup
Escritura de un blob en una nueva cuenta de almacenamiento
Reemplace el método main actual en App.java por el código siguiente. Este código crea una cuenta de almacenamiento de Azure . A continuación, el código usa las bibliotecas de Azure Storage para Java para crear un nuevo archivo de texto en la nube.
public static void main(String[] args) {
try {
TokenCredential tokenCredential = new DefaultAzureCredentialBuilder()
.authorityHost(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)
.build();
// If you don't set the tenant ID and subscription ID via environment variables,
// change to create the Azure profile with tenantId, subscriptionId, and Azure environment.
AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);
AzureResourceManager azureResourceManager = AzureResourceManager.configure()
.withLogLevel(HttpLogDetailLevel.BASIC)
.authenticate(tokenCredential, profile)
.withDefaultSubscription();
// Create a new storage account.
String storageAccountName = "YOUR_STORAGE_ACCOUNT_NAME_HERE";
StorageAccount storage = azureResourceManager.storageAccounts().define(storageAccountName)
.withRegion(Region.US_WEST2)
.withNewResourceGroup("sampleStorageResourceGroup")
.create();
// Create a storage container to hold the file.
List<StorageAccountKey> keys = storage.getKeys();
PublicEndpoints endpoints = storage.endPoints();
String accountName = storage.name();
String accountKey = keys.get(0).value();
String endpoint = endpoints.primary().blob();
StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);
BlobServiceClient storageClient = new BlobServiceClientBuilder()
.endpoint(endpoint)
.credential(credential)
.buildClient();
// Container name must be lowercase.
BlobContainerClient blobContainerClient = storageClient.getBlobContainerClient("helloazure");
blobContainerClient.create();
// Make the container public.
blobContainerClient.setAccessPolicy(PublicAccessType.CONTAINER, null);
// Write a blob to the container.
String fileName = "helloazure.txt";
String textNew = "Hello Azure";
BlobClient blobClient = blobContainerClient.getBlobClient(fileName);
InputStream is = new ByteArrayInputStream(textNew.getBytes());
blobClient.upload(is, textNew.length());
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Ejecute el ejemplo desde la línea de comandos.
mvn clean compile exec:java
Puede buscar el archivo de helloazure.txt en la cuenta de almacenamiento a través de Azure Portal o con Explorador de Azure Storage.
Limpie la cuenta de almacenamiento mediante la CLI.
az group delete --name sampleStorageResourceGroup
Exploración de más ejemplos
Para obtener más información sobre cómo usar las bibliotecas de administración de Azure para Java para administrar recursos y automatizar tareas, consulte nuestro código de ejemplo para máquinas virtuales, aplicaciones weby base de datos SQL.
Referencia y notas de la versión
Hay disponible una de referencia de para todos los paquetes.
Obtener ayuda y enviar comentarios
Publique preguntas a la comunidad en Stack Overflow. Informe de errores y problemas abiertos en el SDK de Azure para Java en el repositorio de GitHub de .