Esplorare ed eseguire carichi di lavoro Linux e PostgreSQL

Completato

In questa unità si apprenderà come:

  • Distribuire un account di Archiviazione BLOB di Azure usando un modello Bicep.
  • Creare un contenitore di archiviazione BLOB.
  • Eseguire la migrazione delle immagini all'account di archiviazione BLOB.
  • Caricare tailwind.sql nell'account di Blob Storage.
  • Connettersi alla macchina virtuale di Azure usando l'interfaccia della riga di comando di Azure.
  • Scaricare il file dall'account di archiviazione.
  • Connettersi al server PostgreSQL usando psql e importare un file SQL.
  • Eseguire l'applicazione in modo interattivo tramite la riga di comando.
  • Confermare che l'applicazione venga eseguita correttamente.

Implementare un account di archiviazione usando deploy/vm-postgres.bicep

Eseguire il comando seguente nel computer locale:

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

Aggiungere l'utente corrente al ruolo Proprietario dati BLOB di archiviazione

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

Creare un contenitore denominato container1 nell'account di archiviazione

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

Eseguire la migrazione delle immagini all'account di archiviazione in una sottocartella

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

Viene visualizzato l'output seguente:

[
  {
    "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\""
  },
  ...
]

Caricare app/data/postgres/tailwind.sql nell'account di archiviazione

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

Connettersi alla macchina virtuale di Azure usando il comando az ssh

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

Scaricare il file tailwind.sql dall'account di archiviazione

Impostare la variabile Bash STORAGE_ACCOUNT_NAME sul nome dell'account di archiviazione:

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

echo "STORAGE_ACCOUNT_NAME: $STORAGE_ACCOUNT_NAME"

Scaricare tailwind.sql nella macchina virtuale di Azure usando il 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

Impostare le variabili di ambiente per psql nel computer 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

Importare tailwind.sql con psql

psql -f tailwind.sql

Connettersi al server Postgres per confermare che l'importazione sia riuscita

psql

Elencare le tabelle

\dt

Viene visualizzato l'output seguente:

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)

Eseguire una query SQL che elenca le tabelle

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

Viene visualizzato l'output seguente:

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)

Attivare la modalità espansa e selezionare dalla tabella prodotti

Al prompt postgres=> abilitare la modalità espansa:

\x

Selezionare dalla tabella prodotti

select * from products;

Viene visualizzato il prompt seguente:

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

Viene visualizzato un elenco di prodotti:

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         | ...
...

Selezionare la barra spaziatrice per scorrere i risultati. Digitare q per uscire dal paginatore.

Uscire da psql

\q

Eseguire l'applicazione in modo interattivo tramite la riga di comando

Nel computer remoto passare alla directory che contiene l'applicazione:

cd tailwind-traders-go/app

Eseguire l'applicazione in modo interattivo dalla riga di comando:

go run main.go app:serve

Viene visualizzato l'output seguente:

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

Trovare l'indirizzo IP pubblico della macchina virtuale

Ottenere l'indirizzo IP pubblico della macchina virtuale:

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

Restituire l'URL al terminale:

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

Questa unità usa la porta 8080 a scopo di sviluppo/test interattivo. Nell'ambiente di produzione si userebbe la porta 443 e si richiederebbe un certificato TLS per proteggere il traffico verso l'endpoint.

Esplorare l'endpoint API pubblico

Aprire l'URL in un Web browser. Viene visualizzato l'output seguente:

{
  "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": "..."
}

In alternativa, è possibile effettuare una richiesta all'endpoint API usando curl:

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

Questo endpoint visualizza un prodotto casuale dal database.

Visualizzare le richieste registrate nel terminale

Tornare al terminale in cui si esegue l'applicazione in modo interattivo. L'output mostra la richiesta all'endpoint 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"}

Se queste richieste hanno esito positivo, è stata eseguita la migrazione del carico di lavoro dell'applicazione a una macchina virtuale di Azure e al Database di Azure per PostgreSQL (server flessibile).

Pulire le risorse di Azure

Al termine dell'esplorazione dei carichi di lavoro Linux e PostgreSQL, pulire le risorse per risparmiare sui costi.

È possibile eliminare il gruppo di risorse 240900-linux-postgres manualmente tramite il portale di Azure oppure eseguire il seguente comando dell'interfaccia della riga di comando di Azure:

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

Un'altra opzione consiste nell'usare il modello empty.bicep per eliminare le risorse create dal file vm-postgres.bicep. L'esecuzione di az deployment group create con --mode Complete rimuove tutte le risorse che il modello non definisce. Poiché empty.json non dispone di risorse, il comando elimina ogni risorsa.

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

L'implementazione empty.json lascia intatto il gruppo di risorse 240900-linux-postgres, quindi è possibile implementare di nuovo le risorse usando un singolo comando.

Risorse