Explorer et exécuter des charges de travail Linux et PostgreSQL

Effectué

Dans cette unité, vous allez :

  • Déployer un compte Stockage Blob Azure en utilisant un modèle Bicep.
  • Créez un conteneur Stockage Blob.
  • Migrer des images vers le compte de stockage Blob.
  • Chargez tailwind.sql sur le compte Stockage Blob.
  • Vous connecter à la machine virtuelle Azure en utilisant Azure CLI.
  • Téléchargez le fichier à partir du compte de stockage.
  • Vous connecter au serveur PostgreSQL en utilisant psql et importer un fichier SQL.
  • Exécutez l’application de manière interactive via la ligne de commande.
  • Vérifier que l’application s’exécute correctement.

Déployer un compte de stockage en utilisant deploy/vm-postgres.bicep

Exécutez la commande suivante sur votre ordinateur local :

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

Ajouter l’utilisateur actuel au rôle Propriétaire des données blob du stockage

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

Créer un conteneur appelé container1 dans le compte de stockage

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

Migrer des images vers le compte de stockage dans un sous-dossier

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

Vous obtenez la sortie suivante :

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

Charger l’application/les données/postgres/tailwind.sql sur le compte de stockage

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

Se connecter à la machine virtuelle Azure en utilisant la commande az ssh

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

Télécharger le fichier tailwind.sql à partir du compte de stockage

Définissez la variable Bash STORAGE_ACCOUNT_NAME sur le nom du compte de stockage :

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

echo "STORAGE_ACCOUNT_NAME: $STORAGE_ACCOUNT_NAME"

Téléchargez tailwind.sql sur la machine virtuelle Azure à l’aide de la commande 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

Définir les variables d’environnement pour psql sur l’ordinateur distant

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

Importer tailwind.sql en utilisant psql

psql -f tailwind.sql

Se connecter au serveur Postgres pour confirmer que l’importation a réussi

psql

Répertorier les tables

\dt

Vous obtenez la sortie suivante :

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)

Exécuter une requête SQL qui liste les tables

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

Vous obtenez la sortie suivante :

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)

Activer le mode développé et sélectionner dans la table des produits

À l’invite postgres=>, activez le mode développé :

\x

Sélectionnez depuis la table produits :

select * from products;

L’invite suivante s’affiche :

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

Un listing de produits s’affiche :

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

Sélectionnez la barre d’espace pour parcourir les résultats. Appuyez sur q pour quitter le sélecteur de pages.

Quitter psql

\q

Exécuter l’application de manière interactive via la ligne de commande

Sur l’ordinateur distant, accédez au répertoire qui contient l’application :

cd tailwind-traders-go/app

Exécutez l’application de manière interactive depuis la ligne de commande :

go run main.go app:serve

Vous obtenez la sortie suivante :

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

Rechercher l’adresse IP publique de la machine virtuelle

Obtenez l’adresse IP publique de la machine virtuelle :

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

Affichez l’URL dans le terminal :

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

Cette unité utilise le port 8080 à des fins interactives de développement/test. En production, vous utiliseriez le port 443 et exigeriez un certificat TLS pour permettre de sécuriser le trafic vers le point de terminaison.

Parcourir le point de terminaison de l'API publique

Ouvrez l’URL dans un navigateur web. Vous obtenez la sortie suivante :

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

Vous pouvez également effectuer une requête au point de terminaison de l’API en utilisant curl :

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

Ce point de terminaison affiche un produit aléatoire de la base de données.

Afficher les demandes enregistrées dans le terminal

Revenez au terminal où vous exécutez l’application de manière interactive. La sortie affiche la requête vers le point de terminaison de l’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 ces requêtes réussissent, vous avez correctement migré la charge de travail de l’application vers une machine virtuelle Azure et Azure Database pour PostgreSQL (serveur flexible).

Nettoyage des ressources Azure

Après avoir terminé d’explorer les charges de travail Linux et PostgreSQL, nettoyez les ressources pour économiser des coûts.

Vous pouvez supprimer le groupe de ressources 240900-linux-postgres manuellement via le Portail Azure ou exécuter la commande Azure CLI suivante :

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

Une autre option consiste à utiliser le modèle empty.bicep pour supprimer les ressources créées par le fichier vm-postgres.bicep. Exécuter az deployment group create avec --mode Complete supprime toutes les ressources que le modèle ne définit pas. empty.json n’ayant pas de ressources, la commande supprime chaque ressource.

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

Déployer empty.json laisse le groupe de ressources 240900-linux-postgres intact afin de pouvoir redéployer les ressources en n’utilisant qu’une seule commande.

Ressources