Erkunden und Ausführen von Linux- und PostgreSQL-Workloads

Abgeschlossen

In dieser Einheit lernen Sie Folgendes:

  • Stellen Sie ein Azure Blob Storage-Konto mithilfe einer Bicep-Vorlage bereit.
  • Erstellen eines Blob Storage-Containers
  • Migrieren Sie Bilder zum Blob Storage-Konto.
  • Laden Sie tailwind.sql in das Blob Storage-Konto hoch.
  • Stellen Sie mithilfe der Azure-Befehlszeilenschnittstelle eine Verbindung mit der Azure-VM her.
  • Laden Sie die Datei aus dem Speicherkonto herunter.
  • Stellen Sie mit psql eine Verbindung mit dem PostgreSQL-Server her, und importieren Sie eine SQL-Datei.
  • Führen Sie die Anwendung interaktiv über die Befehlszeile aus.
  • Vergewissern Sie sich, dass die Anwendung ordnungsgemäß ausgeführt wird.

Bereitstellen eines Speicherkontos mithilfe von „deploy/vm-postgres.bicep“

Führen Sie auf dem lokalen Computer den folgenden Befehl aus:

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

Hinzufügen des aktuellen Benutzers zur Rolle „Besitzer von Speicherblobdaten“

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

Erstellen des Containers „container1“ im Speicherkonto

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

Migrieren von Bildern zu einem Unterordner im Speicherkonto

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

Die folgende Ausgabe wird angezeigt:

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

Hochladen von „app/data/postgres/tailwind.sql“ in das Speicherkonto

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

Herstellen einer Verbindung mit der Azure-VM mithilfe des Befehls „az ssh“

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

Herunterladen der Datei „tailwind.sql“ aus dem Speicherkonto

Legen Sie die Bash-Variable STORAGE_ACCOUNT_NAME auf den Namen des Speicherkontos fest:

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

echo "STORAGE_ACCOUNT_NAME: $STORAGE_ACCOUNT_NAME"

Laden Sie tailwind.sql mit dem Befehl az storage blob download auf die Azure-VM herunter:

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

Festlegen der Umgebungsvariablen für psql auf dem Remotecomputer

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

Importieren von „tailwind.sql“ mithilfe von psql

psql -f tailwind.sql

Herstellen einer Verbindung mit dem Postgres-Server zum Bestätigen des erfolgreichen Imports

psql

Auflisten der Tabellen

\dt

Die folgende Ausgabe wird angezeigt:

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)

Ausführen einer SQL-Abfrage zum Auflisten der Tabellen

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

Die folgende Ausgabe wird angezeigt:

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)

Aktivieren des erweiterten Modus und Auswählen aus der Tabelle „products“

Aktivieren Sie an der Eingabeaufforderung postgres=> den erweiterten Modus:

\x

Wählen Sie etwas aus der Produkttabelle (products) aus:

select * from products;

Die folgende Aufforderung wird angezeigt:

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

Es wird eine Liste der Produkte angezeigt:

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

Drücken Sie die LEERTASTE, um die Ergebnisse seitenweise zu durchlaufen. Drücken Sie q, um die Seitenauswahl zu schließen.

Beenden von psql

\q

Interaktives Ausführen der Anwendung über die Befehlszeile

Wechseln Sie auf dem Remotecomputer in das Verzeichnis mit der Anwendung:

cd tailwind-traders-go/app

Führen Sie die Anwendung interaktiv über die Befehlszeile aus:

go run main.go app:serve

Die folgende Ausgabe wird angezeigt:

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

Suchen der öffentlichen IP-Adresse der VM

Rufen Sie die öffentliche IP-Adresse der VM ab:

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

Geben Sie die URL am Terminal aus:

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

In dieser Lerneinheit wird Port 8080 für interaktive Dev/Test-Zwecke verwendet. In der Produktion würden Sie Port 443 verwenden und ein TLS-Zertifikat erzwingen, um den Datenverkehr an den Endpunkt zu schützen.

Durchsuchen des öffentlichen API-Endpunkts

Öffnen Sie die URL in einem Webbrowser. Die folgende Ausgabe wird angezeigt:

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

Alternativ können Sie mithilfe von curl eine Anforderung an den API-Endpunkt übermitteln:

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

Dieser Endpunkt zeigt ein zufälliges Produkt aus der Datenbank an.

Anzeigen von Anforderungen, die am Terminal protokolliert wurden

Navigieren Sie zum Terminal zurück, an dem Sie die Anwendung interaktiv ausführen. Die Ausgabe enthält die Anforderung an den API-Endpunkt:

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

Wenn diese Anforderungen erfolgreich waren, haben Sie die Anwendungsworkload erfolgreich zu einer Azure-VM und Azure Database for PostgreSQL (Flexibler Server) migriert.

Bereinigen von Azure-Ressourcen

Nachdem Sie die Linux- und PostgreSQL-Workloads erkundet haben, bereinigen Sie die Ressourcen, um Kosten zu sparen.

Sie können die Ressourcengruppe 240900-linux-postgres manuell über das Azure-Portal löschen oder den folgenden Azure CLI-Befehl ausführen:

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

Eine weitere Option besteht darin, die Vorlage empty.bicep zum Löschen der von der Datei vm-postgres.bicep erstellten Ressourcen zu verwenden. Wenn Sie az deployment group create mit --mode Complete ausführen, werden alle Ressourcen entfernt, die nicht von der Vorlage definiert wurden. Da empty.json keine Ressourcen enthält, werden mit diesem Befehl alle Ressourcen gelöscht.

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

Bei der Bereitstellung von empty.json bleibt die Ressourcengruppe 240900-linux-postgres erhalten, sodass Sie die Ressourcen erneut mit einem einzigen Befehl bereitstellen können.

Ressourcen