Exploración y ejecución de cargas de trabajo de Linux y PostgreSQL

Completado

En esta unidad, aprenderá a:

  • Implemente una cuenta de Azure Blob Storage mediante una plantilla de Bicep.
  • Cree un contenedor de Blob Storage.
  • Migre imágenes a la cuenta de Blob Storage.
  • Cargue tailwind.sql en la cuenta de Blob Storage.
  • Conéctese a la máquina virtual de Azure mediante la CLI de Azure.
  • Descargue el archivo de la cuenta de almacenamiento.
  • Conéctese al servidor PostgreSQL mediante psql e importe un archivo SQL.
  • Ejecute la aplicación de forma interactiva a través de la línea de comandos.
  • Confirme que la aplicación se ejecute correctamente.

Implementación de una cuenta de almacenamiento mediante deploy/vm-postgres.bicep

Ejecute el siguiente comando en el equipo local:

az deployment group create \
    --resource-group 240900-linux-postgres \
    --template-file deploy/vm-postgres.bicep \
    --parameters \
        deployVm=false \
        deployPostgres=false \
        deployStorage=true

Agregue el usuario actual al rol Propietario de datos de blobs de almacenamiento

STORAGE_ACCOUNT_ID=$(az storage account list \
    --resource-group 240900-linux-postgres \
    --query '[0].id' \
    -o tsv)

USER_ID=$(az ad signed-in-user show \
    --query id \
    -o tsv)

az role assignment create \
    --role "Storage Blob Data Owner" \
    --assignee $USER_ID \
    --scope $STORAGE_ACCOUNT_ID

Cree un contenedor denominado "container1" en la cuenta de almacenamiento

STORAGE_ACCOUNT_NAME=$(az storage account list \
    --resource-group 240900-linux-postgres \
    --query '[0].name' \
    -o tsv)

echo "STORAGE_ACCOUNT_NAME: $STORAGE_ACCOUNT_NAME"

az storage container create \
    --account-name $STORAGE_ACCOUNT_NAME \
    --auth-mode login \
    --name container1

Migre de imágenes a la cuenta de almacenamiento en una subcarpeta

az storage blob upload-batch \
    --account-name $STORAGE_ACCOUNT_NAME \
    --auth-mode login \
    --overwrite \
    --destination container1/images \
    --source app/data/images

Se mostrará la siguiente salida:

[
  {
    "Blob": "https://storageji2dbe.blob.core.windows.net/container1/images/wrench_set.jpg",
    "Last Modified": "...",
    "Type": "image/jpeg",
    "eTag": "\"0x8DCE0CA938AF41B\""
  },
  {
    "Blob": "https://storageji2dbe.blob.core.windows.net/container1/images/planer.jpg",
    "Last Modified": "...",
    "Type": "image/jpeg",
    "eTag": "\"0x8DCE0CA939DF18B\""
  },
  ...
]

Carga de app/data/postgres/tailwind.sql en la cuenta de almacenamiento

az storage blob upload \
    --account-name $STORAGE_ACCOUNT_NAME \
    --auth-mode login \
    --container-name container1 \
    --file app/data/postgres/tailwind.sql \
    --name tailwind.sql

Conecte la máquina virtual de Azure mediante el comando az de SSH

az ssh vm \
    --resource-group 240900-linux-postgres \
    --name vm-1

Descargue el archivo tailwind.sql de la cuenta de almacenamiento

Establezca la variable de Bash STORAGE_ACCOUNT_NAME en el nombre de la cuenta de almacenamiento:

STORAGE_ACCOUNT_NAME=$(az storage account list \
    --resource-group 240900-linux-postgres \
    --query '[0].name' \
    -o tsv)

echo "STORAGE_ACCOUNT_NAME: $STORAGE_ACCOUNT_NAME"

Descargue tailwind.sql en la máquina virtual de Azure mediante el comando az storage blob download:

az storage blob download \
    --account-name $STORAGE_ACCOUNT_NAME \
    --auth-mode login \
    --container-name container1 \
    --file tailwind.sql \
    --name tailwind.sql

Establecimiento de las variables de entorno para psql en el equipo remoto

MANAGED_IDENTITY_NAME=240900-linux-postgres-identity
export AZURE_CLIENT_ID=$(az identity show --resource-group 240900-linux-postgres --name $MANAGED_IDENTITY_NAME --query "clientId" -o tsv)
PG_NAME=$(az postgres flexible-server list --resource-group 240900-linux-postgres --query "[0].name" -o tsv)

# Set psql environment variables
export PGHOST="${PG_NAME}.privatelink.postgres.database.azure.com"
export PGPASSWORD=$(curl -s "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fossrdbms-aad.database.windows.net&client_id=${AZURE_CLIENT_ID}" -H Metadata:true | jq -r .access_token)
export PGUSER=$MANAGED_IDENTITY_NAME
export PGDATABASE=postgres

Importe tailwind.sql mediante psql

psql -f tailwind.sql

Conéctese al servidor Postgres para confirmar que la importación se realizó correctamente

psql

Enumeración de las tablas

\dt

Se mostrará la siguiente salida:

postgres=> \dt
                           List of relations
 Schema |         Name         | Type  |             Owner              
--------+----------------------+-------+--------------------------------
 public | cart_items           | table | 240900-linux-postgres-identity
 public | checkouts            | table | 240900-linux-postgres-identity
 public | collections          | table | 240900-linux-postgres-identity
 public | collections_products | table | 240900-linux-postgres-identity
 public | customers            | table | 240900-linux-postgres-identity
 public | delivery_methods     | table | 240900-linux-postgres-identity
 public | product_types        | table | 240900-linux-postgres-identity
 public | products             | table | 240900-linux-postgres-identity
 public | shipment_items       | table | 240900-linux-postgres-identity
 public | shipments            | table | 240900-linux-postgres-identity
 public | store_inventory      | table | 240900-linux-postgres-identity
 public | stores               | table | 240900-linux-postgres-identity
 public | suppliers            | table | 240900-linux-postgres-identity
 public | supply_orders        | table | 240900-linux-postgres-identity
(14 rows)

Ejecute una consulta SQL que enumere las tablas

SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public';

Se mostrará la siguiente salida:

postgres=> SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public';
      table_name      
----------------------
 collections
 stores
 customers
 cart_items
 product_types
 products
 suppliers
 collections_products
 checkouts
 shipments
 delivery_methods
 shipment_items
 store_inventory
 supply_orders
(14 rows)

Active el modo expandido y seleccione de la tabla de productos

En el símbolo del sistema de postgres=>, active el modo expandido:

\x

Seleccione de la tabla de productos:

select * from products;

Aparece el siguiente símbolo del sistema:

postgres=> \x
Expanded display is on.
postgres=> select * from products;

Aparece una lista de productos:

id                 | 1
product_type_id    | 1
supplier_id        | 2
sku                | brush_cleaner
name               | Meltdown Brush Cleaner
price              | 12.99
description        | We all leave our brushes sitting around, full of old dry paint. Don't worry! The Meltdown Brush Cleaner can remove just about anything.
image              | brush_cleaner.jpg
digital            | f
unit_description   | 1 - 10oz Jar
package_dimensions | 4x8x2
weight_in_pounds   | 3.2
reorder_amount     | 10
status             | in-stock
requires_shipping  | t
warehouse_location | Zone 1, Shelf 12, Slot 6
created_at         | ...
updated_at         | ...
...

Seleccione la barra espaciadora para pasar las páginas de resultados. Escriba q para salir de la paginación.

Salir de psql

\q

Ejecución de la aplicación de forma interactiva a través de la línea de comandos

En el equipo remoto, cambie al directorio que contiene la aplicación:

cd tailwind-traders-go/app

Ejecute la aplicación de forma interactiva desde la línea de comandos:

go run main.go app:serve

Se mostrará la siguiente salida:

$ go run main.go app:serve
Listening on :8080

Búsqueda de la dirección IP pública de la máquina virtual

Obtenga la dirección IP pública de la máquina virtual:

IP_ADDRESS=$(az network public-ip show \
    --resource-group 240900-linux-postgres \
    --name vm-1-ip \
    --query ipAddress \
    --out tsv)

Muestre la dirección URL en el terminal:

echo "Your URL is: http://${IP_ADDRESS}:8080"

Esta unidad usa el puerto 8080 para fines de desarrollo/pruebas interactivos. En producción, usaría el puerto 443 y requeriría un certificado TLS para ayudar a proteger el tráfico hacia el punto de conexión.

Examinar el punto de conexión de la API pública

Abra la dirección URL en un explorador web. Se mostrará la siguiente salida:

{
  "id": 5,
  "product_type_id": 1,
  "supplier_id": 2,
  "sku": "drafting_tools",
  "name": "Bespoke Drafting Set",
  "price": 45,
  "description": "Build your next bridge (or tunnel) using our Bespoke Drafting Set. Everyone drives across *regular* bridges everyday - but they'll rememeber yours - because it's _bespoke_.",
  "image": "drafting_tools.jpg",
  "digital": false,
  "unit_description": "Tools and carrying case",
  "package_dimensions": "5x10x3",
  "weight_in_pounds": "1.2",
  "reorder_amount": 10,
  "status": "in-stock",
  "requires_shipping": true,
  "warehouse_location": "Zone 1, Shelf 4, Slot 1",
  "created_at": "...",
  "updated_at": "..."
}

Como alternativa, puede realizar una solicitud al punto de conexión de API mediante curl:

curl "http://${IP_ADDRESS}:8080"

Este punto de conexión muestra un producto aleatorio de la base de datos.

Visualización de las solicitudes registradas en el terminal

Vuelva al terminal donde se ejecuta la aplicación de forma interactiva. La salida muestra la solicitud al punto de conexión de API:

{"time":"...","level":"INFO","msg":"httpLog","remoteAddr":"[::1]:58592","method":"GET","url":"/"}
{"time":"...","level":"INFO","msg":"httpLog","remoteAddr":"[::1]:59414","method":"GET","url":"/"}
{"time":"...","level":"INFO","msg":"httpLog","remoteAddr":"[::1]:59414","method":"GET","url":"/favicon.ico"}

Si estas solicitudes se realizan correctamente, ha migrado correctamente la carga de trabajo de la aplicación a una máquina virtual de Azure y Azure Database for PostgreSQL (servidor flexible).

Limpieza de los recursos de Azure

Después de que termine de explorar las cargas de trabajo de Linux y PostgreSQL, limpie los recursos para ahorrar costos.

Puede eliminar el grupo de recursos 240900-linux-postgres manualmente a través de Azure Portal o ejecutar el siguiente comando de la CLI de Azure:

az group delete \
    --name 240900-linux-postgres \
    --yes \
    --no-wait

Otra opción es usar la plantilla de empty.bicep para eliminar los recursos que creó el archivo vm-postgres.bicep. Ejecutar az deployment group create con --mode Complete quita los recursos que la plantilla no define. Dado que empty.json no tiene recursos, el comando elimina todos los recursos.

az deployment group create \
    --resource-group 240900-linux-postgres \
    --template-file deploy/empty.bicep \
    --mode Complete

La implementación de empty.json deja intacto el grupo de recursos 240900-linux-postgres, por lo que puede volver a implementar los recursos con un solo comando.

Recursos