Esplorare ed eseguire carichi di lavoro Linux e PostgreSQL
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.sqlnell'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
psqle 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.