Baca dalam bahasa Inggris

Bagikan melalui


Memperbarui kode aplikasi untuk beban kerja alur kerja berbasis peristiwa (EDW)

Artikel ini menguraikan pembaruan kode aplikasi utama untuk mereplikasi beban kerja EDW di Azure menggunakan Azure SDK untuk bekerja dengan layanan Azure.

Kode akses data

Implementasi AWS

Beban kerja AWS bergantung pada layanan AWS dan SDK AWS akses data terkait. Kami sudah memetakan layanan AWS ke layanan Azure yang setara, sehingga kami sekarang dapat membuat kode untuk mengakses data untuk antrean produsen dan tabel database hasil konsumen di Python menggunakan Azure SDK.

Implementasi Azure

Untuk bidang data, isi pesan produsen (payload) adalah JSON, dan tidak memerlukan perubahan skema apa pun untuk Azure. Aplikasi konsumen asli menyimpan pesan yang diproses dalam tabel DynamoDB. Dengan modifikasi kecil pada kode aplikasi konsumen, kita dapat menyimpan pesan yang diproses dalam Tabel Azure Storage.

Kode autentikasi

Implementasi AWS

Beban kerja AWS menggunakan kebijakan peran IAM yang menentukan akses penuh ke sumber daya Amazon Simple Queue Service (SQS):

{
  "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sqs:*",
            "Resource": "*"
        }
    ]
}

Beban kerja AWS menggunakan kebijakan peran IAM yang menentukan akses penuh ke sumber daya Amazon DynamoDB:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": "dynamodb:*",
        "Resource": "*"
    }
  ]
}

Dalam beban kerja AWS, Anda menetapkan kebijakan ini menggunakan AWS CLI:

aws iam create-policy --policy-name sqs-sample-policy --policy-document <filepath/filename>.json
aws iam create-policy --policy-name dynamodb-sample-policy --policy-document <filepath/filename>.json
aws iam create-role --role-name keda-sample-iam-role  --assume-role-policy-document <filepath/filename>.json

aws iam attach-role-policy --role-name keda-sample-iam-role --policy-arn=arn:aws:iam::${<AWSAccountID>}:policy/sqs-sample-policy
aws iam attach-role-policy --role-name keda-sample-iam-role --policy-arn=arn:aws:iam::${<AWSAccountID>}:policy/dynamodb-sample-policy

# Set up trust relationship Kubernetes federated identity credential and map IAM role via kubectl annotate serviceaccount

Implementasi Azure

Mari kita jelajahi cara melakukan logika komunikasi layanan AWS serupa dalam lingkungan Azure menggunakan AKS.

Anda menerapkan dua definisi peran Azure RBAC untuk mengontrol akses bidang data ke Antrean Azure Storage dan Tabel Azure Storage. Peran ini seperti kebijakan peran IAM yang digunakan AWS untuk mengontrol akses ke SQS dan DynamoDB. Peran Azure RBAC tidak dibundel dengan sumber daya. Sebagai gantinya, Anda menetapkan peran ke perwakilan layanan yang terkait dengan sumber daya tertentu.

Dalam implementasi Azure dari beban kerja EDW, Anda menetapkan peran ke identitas terkelola yang ditetapkan pengguna yang ditautkan ke identitas beban kerja dalam pod AKS. Azure Python SDK untuk Azure Storage Queue dan Azure Storage Table secara otomatis menggunakan konteks prinsip keamanan untuk mengakses data di kedua sumber daya.

Anda menggunakan peran Kontributor Data Antrean Penyimpanan untuk memungkinkan penerima peran membaca, menulis, atau menghapus terhadap Antrean Azure Storage, dan peran Kontributor Data Tabel Penyimpanan untuk mengizinkan penerima tugas membaca, menulis, atau menghapus data terhadap Tabel Azure Storage.

Langkah-langkah berikut menunjukkan cara membuat identitas terkelola dan menetapkan peran Kontributor Data Antrean Penyimpanan dan Kontributor Data Tabel Penyimpanan menggunakan Azure CLI:

  1. Buat identitas terkelola menggunakan az identity create perintah .

    managedIdentity=$(az identity create \
        --resource-group $resourceGroup \
        --name $managedIdentityName
    
  2. Tetapkan peran Kontributor Data Antrean Penyimpanan ke identitas terkelola az role assignment create menggunakan perintah .

    principalId=$(echo $managedIdentity | jq -r `.principalId`)
    
    az role assignment create \
        --assignee-object-id $principalId \
        --assignee-principal-type ServicePrincipal
        --role "Storage Queue Data Contributor" \
        --scope $resourceId
    
  3. Tetapkan peran Kontributor Data Tabel Penyimpanan ke identitas terkelola menggunakan az role assignment create perintah .

    az role assignment create \
        --assignee-object-id $principalId \
        --assignee-principal-type ServicePrincipal
        --role "Storage Table Data Contributor" \
        --scope $resourceId
    

Untuk melihat contoh kerja, lihat deploy.sh skrip di repositori GitHub kami.

Kode produsen

Implementasi AWS

Beban kerja AWS menggunakan pustaka AWS boto3 Python untuk berinteraksi dengan antrean Amazon SQS untuk mengonfigurasi akses antrean penyimpanan. Kemampuan AWS IAM AssumeRole mengautentikasi ke titik akhir SQS menggunakan identitas IAM yang terkait dengan pod EKS yang menghosting aplikasi.

import boto3
# other imports removed for brevity
sqs_queue_url = "https://<region>.amazonaws.com/<queueid>/source-queue.fifo"
sqs_queue_client = boto3.client("sqs", region_name="<region>")    
response = sqs_client.send_message(
    QueueUrl = sqs_queue_url,
    MessageBody = 'messageBody1',
    MessageGroupId='messageGroup1')

Implementasi Azure

Implementasi Azure menggunakan Azure SDK untuk Python dan autentikasi OAuth tanpa kata sandi untuk berinteraksi dengan layanan Azure Storage Queue. Kelas DefaultAzureCredential Python mengetahui identitas beban kerja dan menggunakan identitas terkelola yang terkait dengan identitas beban kerja untuk mengautentikasi ke antrean penyimpanan.

Contoh berikut menunjukkan cara mengautentikasi ke Antrean Azure Storage menggunakan DefaultAzureCredential kelas :

from azure.identity import DefaultAzureCredential
from azure.storage.queue import QueueClient
# other imports removed for brevity

# authenticate to the storage queue.
account_url = "https://<storageaccountname>.queue.core.windows.net"
default_credential = DefaultAzureCredential()
aqs_queue_client = QueueClient(account_url, queue_name=queue_name ,credential=default_credential)

aqs_queue_client.create_queue()
aqs_queue_client.send_message('messageBody1')

Anda dapat meninjau kode untuk produsen antrean (aqs-producer.py) di repositori GitHub kami.

Kode konsumen

Implementasi AWS

Kode AWS asli untuk akses DynamoDB menggunakan pustaka AWS boto3 Python untuk berinteraksi dengan antrean Amazon SQS. Bagian konsumen dari beban kerja menggunakan kode yang sama dengan produsen untuk menyambungkan ke antrean Amazon SQS untuk membaca pesan. Konsumen juga berisi kode Python untuk terhubung ke DynamoDB menggunakan kemampuan AWS IAM AssumeRole untuk mengautentikasi ke titik akhir DynamoDB menggunakan identitas IAM yang terkait dengan pod EKS yang menghosting aplikasi.

# presumes policy deployment ahead of time such as: aws iam create-policy --policy-name <policy_name> --policy-document <policy_document.json>
dynamodb = boto3.resource('dynamodb', region_name='<region>')
table = dynamodb.Table('<dynamodb_table_name>')
table.put_item(
    Item = {
      'id':'<guid>',
      'data':jsonMessage["<message_data>"],
      'srcStamp':jsonMessage["<source_timestamp_from_message>"],
      'destStamp':'<current_timestamp_now>',
      'messageProcessingTime':'<duration>'
    }
)

Implementasi Azure

Implementasi Azure menggunakan Azure SDK untuk Python untuk berinteraksi dengan Tabel Azure Storage.

Sekarang Anda memerlukan kode produsen untuk mengautentikasi ke Tabel Azure Storage. Seperti yang dibahas sebelumnya, skema yang digunakan di bagian sebelumnya dengan DynamoDB tidak kompatibel dengan Tabel Azure Storage. Anda menggunakan skema tabel yang kompatibel dengan Azure Cosmos DB untuk menyimpan data yang sama dengan beban kerja AWS di DynamoDB.

Contoh berikut menunjukkan kode yang diperlukan untuk Azure:

from azure.storage.queue import QueueClient
from azure.data.tables import (TableServiceClient)

    creds = DefaultAzureCredential()
    table = TableServiceClient(
        endpoint=f"https://{storage_account_name}.table.core.windows.net/",  
        credential=creds).get_table_client(table_name=azure_table)

entity={
    'PartitionKey': _id,
    'RowKey': str(messageProcessingTime.total_seconds()),
    'data': jsonMessage['msg'],
    'srcStamp': jsonMessage['srcStamp'],
    'dateStamp': current_dateTime
}
        
response = table.insert_entity(
    table_name=azure_table,
    entity=entity,
    timeout=60
)

Tidak seperti DynamoDB, kode Tabel Azure Storage menentukan dan PartitionKey RowKey. PartitionKey mirip dengan ID uniqueidentifer di DynamoDB. PartitionKey adalah uniqueidentifier untuk partisi dalam kontainer logis di Tabel Azure Storage. RowKey adalah uniqueidentifier untuk semua baris dalam partisi tertentu.

Anda dapat meninjau kode produsen dan konsumen lengkap di repositori GitHub kami.

Membuat gambar kontainer dan mendorong ke Azure Container Registry

Sekarang, Anda dapat membangun gambar kontainer dan mendorongnya ke Azure Container Registry (ACR).

app Dalam direktori repositori kloning, skrip shell yang disebut docker-command.sh membangun gambar kontainer dan mendorongnya ke ACR. .sh Buka file dan tinjau kodenya. Skrip ini membangun gambar kontainer produsen dan konsumen dan mendorongnya ke ACR. Untuk informasi selengkapnya, lihat Pengenalan registri kontainer di Azure dan Mendorong dan menarik gambar di ACR.

Untuk membangun gambar kontainer dan mendorongnya ke ACR, pastikan variabel AZURE_CONTAINER_REGISTRY lingkungan diatur ke nama registri yang ingin Anda dorong gambarnya, lalu jalankan perintah berikut:

./app/docker-command.sh

Langkah berikutnya

Kontributor

Microsoft mempertahankan artikel ini. Kontributor berikut awalnya menulisnya:

  • Ken Kilty | TPM Utama
  • Russell de Pina | TPM Utama
  • Jenny Hayes | Pengembang Konten Senior
  • Carol Smith | Pengembang Konten Senior
  • Erin Schaffer | Pengembang Konten 2