Bagikan melalui


Menyambungkan Azure Functions ke Azure Storage menggunakan alat baris perintah

Dalam artikel ini, Anda mengintegrasikan antrean Azure Storage dengan fungsi dan akun penyimpanan yang Anda buat di artikel panduan cepat sebelumnya. Anda mencapai integrasi ini dengan menggunakan pengikatan output yang menulis data dari permintaan HTTP ke pesan dalam antrian. Menyelesaikan artikel ini tidak akan dikenakan biaya tambahan selain beberapa sen USD dari panduan cepat sebelumnya. Untuk mempelajari selengkapnya tentang pengikatan, lihat konsep pemicu dan pengikatan Azure Functions.

Mengonfigurasi lingkungan lokal Anda

Sebelum memulai, Anda harus menyelesaikan artikel, Quickstart: Membuat Azure Functions project dari baris perintah. Jika Anda sudah membersihkan sumber daya di akhir artikel tersebut, lakukan langkah-langkah lagi untuk membuat ulang aplikasi fungsi dan sumber daya terkait di Azure.

Sebelum memulai, Anda harus menyelesaikan artikel, Quickstart: Membuat Azure Functions project dari baris perintah. Jika Anda sudah membersihkan sumber daya di akhir artikel tersebut, lakukan langkah-langkah lagi untuk membuat ulang aplikasi fungsi dan sumber daya terkait di Azure.

Sebelum memulai, Anda harus menyelesaikan artikel, Quickstart: Membuat Azure Functions project dari baris perintah. Jika Anda sudah membersihkan sumber daya di akhir artikel tersebut, lakukan langkah-langkah lagi untuk membuat ulang aplikasi fungsi dan sumber daya terkait di Azure.

Sebelum memulai, Anda harus menyelesaikan artikel, Quickstart: Membuat Azure Functions project dari baris perintah. Jika Anda sudah membersihkan sumber daya di akhir artikel tersebut, lakukan langkah-langkah lagi untuk membuat ulang aplikasi fungsi dan sumber daya terkait di Azure.

Sebelum memulai, Anda harus menyelesaikan artikel, Quickstart: Membuat Azure Functions project dari baris perintah. Jika Anda sudah membersihkan sumber daya di akhir artikel tersebut, lakukan langkah-langkah lagi untuk membuat ulang aplikasi fungsi dan sumber daya terkait di Azure.

Sebelum memulai, Anda harus menyelesaikan artikel, Quickstart: Membuat Azure Functions project dari baris perintah. Jika Anda sudah membersihkan sumber daya di akhir artikel tersebut, lakukan langkah-langkah lagi untuk membuat ulang aplikasi fungsi dan sumber daya terkait di Azure.

Mengambil Azure Storage connection string

Penting

Artikel ini saat ini memperlihatkan cara menyambungkan ke akun Azure Storage Anda dengan menggunakan connection string, yang berisi kunci rahasia bersama. Menggunakan connection string memudahkan Anda memverifikasi pembaruan data di akun storage. Untuk keamanan terbaik, Anda harus menggunakan identitas terkelola saat menyambungkan ke akun storage Anda. Untuk informasi selengkapnya, lihat Koneksi di Panduan Pengembang.

Sebelumnya, Anda membuat akun Azure Storage untuk penggunaan aplikasi fungsi. String koneksi untuk akun ini disimpan dengan aman di pengaturan aplikasi di Azure. Dengan mengunduh pengaturan ke file local.settings.json, Anda dapat menggunakan koneksi untuk menulis ke antrean Storage di akun yang sama saat menjalankan fungsi secara lokal.

  1. Dari akar project, jalankan perintah berikut, ganti <APP_NAME> dengan nama aplikasi fungsi Anda dari langkah sebelumnya. Perintah ini akan menimpa setiap nilai yang ada pada file.

    func azure functionapp fetch-app-settings <APP_NAME>
    
  2. Buka file local.settings.json dan temukan nilai bernama AzureWebJobsStorage, yang merupakan connection string akun Storage. Anda menggunakan nama AzureWebJobsStorage dan string koneksi di bagian-bagian lain artikel ini.

Penting

Karena file local.settings.json berisi rahasia yang diunduh dari Azure, selalu kecualikan file ini dari kontrol sumber. File .gitignore yang dibuat dengan fungsi lokal project mengecualikan file secara default.

Mendaftarkan ekstensi pengikatan

Kecuali untuk pemicu HTTP dan timer, pengikatan diimplementasikan sebagai paket ekstensi. Jalankan perintah tambahkan paket dotnet berikut di jendela Terminal untuk menambahkan paket ekstensi Storage ke project Anda.

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues --prerelease

Sekarang, Anda dapat menambahkan pengikatan output storage ke project Anda.

Menambahkan definisi pengikatan output ke fungsi

Meskipun fungsi hanya dapat memiliki satu pemicu, fungsi dapat memiliki beberapa pengikatan input dan output, yang memungkinkan Anda terhubung ke layanan dan sumber daya Azure lainnya tanpa menulis kode integrasi kustom.

Saat menggunakan model pemrograman Node.js v4, atribut pengikatan didefinisikan langsung dalam file ./src/functions/HttpExample.js . Dari bagian mulai cepat sebelumnya, file Anda sudah berisi pengikatan HTTP yang ditentukan oleh metode app.http.

const { app } = require('@azure/functions');

app.http('httpTrigger', {
  methods: ['GET', 'POST'],
  authLevel: 'anonymous',
  handler: async (request, context) => {
    try {
      context.log(`Http function processed request for url "${request.url}"`);

      const name = request.query.get('name') || (await request.text());
      context.log(`Name: ${name}`);

      if (!name) {
        return { status: 404, body: 'Not Found' };
      }

      return { body: `Hello, ${name}!` };
    } catch (error) {
      context.log(`Error: ${error}`);
      return { status: 500, body: 'Internal Server Error' };
    }
  },
});

Saat menggunakan model pemrograman Node.js v4, atribut pengikatan didefinisikan langsung dalam file ./src/functions/HttpExample.js . Dari bagian mulai cepat sebelumnya, file Anda sudah berisi pengikatan HTTP yang ditentukan oleh metode app.http.

import {
  app,
  HttpRequest,
  HttpResponseInit,
  InvocationContext,
} from '@azure/functions';

export async function httpTrigger1(
  request: HttpRequest,
  context: InvocationContext,
): Promise<HttpResponseInit> {
  context.log(`Http function processed request for url "${request.url}"`);

  const name = request.query.get('name') || (await request.text()) || 'world';

  return { body: `Hello, ${name}!` };
}

app.http('httpTrigger1', {
  methods: ['GET', 'POST'],
  authLevel: 'anonymous',
  handler: httpTrigger1,
});

Anda mendeklarasikan pengikatan ini di file function.json di folder fungsi Anda. Dari quickstart sebelumnya, file function.json di folder HttpExample berisi dua binding dalam koleksi bindings:

Saat menggunakan model pemrograman Python v2, atribut pengikatan didefinisikan langsung dalam file function_app.py sebagai dekorator. Dari panduan awal sebelumnya, file function_app.py Anda sudah berisi satu pengikatan berbasis dekorator.

import azure.functions as func
import logging

app = func.FunctionApp()

@app.function_name(name="HttpTrigger1")
@app.route(route="hello", auth_level=func.AuthLevel.ANONYMOUS)

Dekorator route menambahkan pengikatan HttpTrigger dan HttpOutput ke fungsi, yang memungkinkan fungsi Anda dipicu ketika permintaan http mencapai rute yang ditentukan.

Untuk menulis ke antrean Azure Storage dari fungsi ini, tambahkan dekorator queue_output ke kode fungsi Anda:

@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")

Dalam dekorator, arg_name mengidentifikasi parameter pengikatan yang direferensikan dalam kode Anda, queue_name adalah nama antrean yang ditulis pengikatan, dan connection adalah nama pengaturan aplikasi yang berisi connection string untuk akun Storage. Dalam panduan memulai cepat, Anda menggunakan akun penyimpanan yang sama dengan aplikasi fungsi, yang terdapat dalam pengaturan AzureWebJobsStorage (dari file local.settings.json). Ketika queue_name tidak ada, ikatan akan membuatnya pada penggunaan pertama.

"bindings": [
  {
    "authLevel": "function",
    "type": "httpTrigger",
    "direction": "in",
    "name": "Request",
    "methods": [
      "get",
      "post"
    ]
  },
  {
    "type": "http",
    "direction": "out",
    "name": "Response"
  }
]

Untuk menulis ke antrean Azure Storage:

  • extraOutputs Menambahkan properti ke konfigurasi pengikatan

    {
        methods: ['GET', 'POST'],
        extraOutputs: [sendToQueue], // add output binding to HTTP trigger
        authLevel: 'anonymous',
        handler: () => {}
    }
    
  • Tambahkan fungsi output.storageQueue di atas panggilan app.http

    const sendToQueue: StorageQueueOutput = output.storageQueue({
      queueName: 'outqueue',
      connection: 'AzureWebJobsStorage',
    });
    

Pengikatan kedua dalam koleksi diberi nama res. Pengikatan http ini adalah pengikatan output (out) yang digunakan untuk menulis respons HTTP.

Untuk menulis ke antrian Azure Storage dari fungsi ini, tambahkan pemautan out jenis queue dengan nama msg, seperti yang ditunjukkan pada kode di bawah ini.

    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "msg",
      "queueName": "outqueue",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

Untuk jenis queue, Anda harus menentukan nama antrean di queueName dan menyediakan name koneksi Azure Storage (dari file local.settings.json) di connection.

Dalam project C#, pengikatan didefinisikan sebagai atribut pengikatan pada metode fungsi. Definisi tertentu bergantung pada apakah aplikasi Anda berjalan dalam proses (pustaka kelas C#) atau dalam proses pekerja yang terisolasi.

Buka file HttpExample.cs project dan tambahkan kelas MultiResponse berikut:

public class MultiResponse
{
    [QueueOutput("outqueue", Connection = "AzureWebJobsStorage")]
    public string[] Messages { get; set; }
    public IActionResult HttpResponse { get; set; }
}

Kelas MultiResponse memungkinkan Anda menulis ke antrean penyimpanan bernama outqueue dan pesan keberhasilan HTTP. Beberapa pesan dapat dikirim ke antrean tersebut karena atribut QueueOutput diterapkan ke array string.

Properti Connection mengatur string koneksi untuk akun penyimpanan. Dalam hal ini, Anda dapat menghilangkan Connection karena Anda sudah menggunakan akun storage default.

Dalam proyek Java, pengikatan didefinisikan sebagai anotasi pengikatan pada metode fungsi. Daftar file function.json kemudian dibuat secara otomatis berdasarkan anotasi ini.

Telusuri ke lokasi kode fungsi Anda di bawah src/main/java, buka file Function.java project, dan tambahkan parameter berikut ke definisi metode run:

@QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") OutputBinding<String> msg

Parameter adalah jenis /> outqueue. Connection string untuk akun Storage diatur oleh metode connection. Anda meneruskan pengaturan aplikasi yang berisi string koneksi akun Storage, alih-alih meneruskan string koneksi itu sendiri.

Definisi metode run sekarang harus terlihat seperti contoh berikut:

@FunctionName("HttpTrigger-Java")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION)  
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") 
        OutputBinding<String> msg, final ExecutionContext context) {
    ...
}

Untuk informasi selengkapnya tentang detail pengikatan, lihat konsep pemicu dan pengikatan Azure Functions dan konfigurasi keluaran antrean.

Tambahkan kode untuk menggunakan pengikatan output

Dengan pengikatan antrean telah ditentukan, Anda sekarang dapat memperbarui fungsi Anda sehingga dapat menerima parameter output msg dan menambahkan pesan ke dalam antrean.

Perbarui HttpExample\function_app.py agar sesuai dengan kode berikut, tambahkan msg parameter ke definisi fungsi dan msg.set(name) di bawah if name: pernyataan:

import azure.functions as func
import logging

app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@app.route(route="HttpExample")
@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")
def HttpExample(req: func.HttpRequest, msg: func.Out [func.QueueMessage]) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        msg.set(name)
        return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.")
    else:
        return func.HttpResponse(
             "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.",
             status_code=200
        )

Parameter msg adalah contoh dari azure.functions.Out class. Metode set menuliskan pesan string pada antrean. Dalam hal ini, name diteruskan ke fungsi dalam string kueri URL.

Tambahkan kode yang menggunakan objek pengikatan output pada context.extraOutputs untuk membuat pesan antrean. Tambahkan kode ini sebelum pernyataan pengembalian.

context.extraOutputs.set(sendToQueue, [msg]);

Pada titik ini, fungsi Anda dapat terlihat sebagai berikut:

const { app, output } = require('@azure/functions');

const sendToQueue = output.storageQueue({
  queueName: 'outqueue',
  connection: 'AzureWebJobsStorage',
});

app.http('HttpExample', {
  methods: ['GET', 'POST'],
  authLevel: 'anonymous',
  extraOutputs: [sendToQueue],
  handler: async (request, context) => {
    try {
      context.log(`Http function processed request for url "${request.url}"`);

      const name = request.query.get('name') || (await request.text());
      context.log(`Name: ${name}`);

      if (name) {
        const msg = `Name passed to the function ${name}`;
        context.extraOutputs.set(sendToQueue, [msg]);
        return { body: msg };
      } else {
        context.log('Missing required data');
        return { status: 404, body: 'Missing required data' };
      }
    } catch (error) {
      context.log(`Error: ${error}`);
      return { status: 500, body: 'Internal Server Error' };
    }
  },
});

Tambahkan kode yang menggunakan objek pengikatan output pada context.extraOutputs untuk membuat pesan antrean. Tambahkan kode ini sebelum pernyataan pengembalian.

context.extraOutputs.set(sendToQueue, [msg]);

Pada titik ini, fungsi Anda dapat terlihat sebagai berikut:

import {
  app,
  output,
  HttpRequest,
  HttpResponseInit,
  InvocationContext,
  StorageQueueOutput,
} from '@azure/functions';

const sendToQueue: StorageQueueOutput = output.storageQueue({
  queueName: 'outqueue',
  connection: 'AzureWebJobsStorage',
});

export async function HttpExample(
  request: HttpRequest,
  context: InvocationContext,
): Promise<HttpResponseInit> {
  try {
    context.log(`Http function processed request for url "${request.url}"`);

    const name = request.query.get('name') || (await request.text());
    context.log(`Name: ${name}`);

    if (name) {
      const msg = `Name passed to the function ${name}`;
      context.extraOutputs.set(sendToQueue, [msg]);
      return { body: msg };
    } else {
      context.log('Missing required data');
      return { status: 404, body: 'Missing required data' };
    }
  } catch (error) {
    context.log(`Error: ${error}`);
    return { status: 500, body: 'Internal Server Error' };
  }
}

app.http('HttpExample', {
  methods: ['GET', 'POST'],
  authLevel: 'anonymous',
  handler: HttpExample,
});

Tambahkan kode yang menggunakan cmdlet Push-OutputBinding untuk menulis teks ke antrian dengan pengikatan output msg. Tambahkan kode ini sebelum Anda mengatur status OK dalam pernyataan if.

$outputMsg = $name
Push-OutputBinding -name msg -Value $outputMsg

Pada titik ini, fungsi Anda akan ditampilkan sebagai berikut:

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

# Interact with query parameters or the body of the request.
$name = $Request.Query.Name
if (-not $name) {
    $name = $Request.Body.Name
}

if ($name) {
    # Write the $name value to the queue, 
    # which is the name passed to the function.
    $outputMsg = $name
    Push-OutputBinding -name msg -Value $outputMsg

    $status = [HttpStatusCode]::OK
    $body = "Hello $name"
}
else {
    $status = [HttpStatusCode]::BadRequest
    $body = "Please pass a name on the query string or in the request body."
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = $status
    Body = $body
})

Ganti metode Run yang ada dengan kode berikut:

[Function("HttpExample")]
public MultiResponse Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req)
{
    _logger.LogInformation("C# HTTP trigger function processed a request.");

    var message = "Welcome to Azure Functions!";

    // Return a response to both HTTP trigger and storage output binding.
    return new MultiResponse()
    {
        // Write a single message.
        Messages = new string[] { message },
        HttpResponse = new OkObjectResult(message)
    };
}

Sekarang, Anda dapat menggunakan parameter msg baru untuk menulis ke pengikatan output dari kode fungsi Anda. Tambahkan garis kode berikut sebelum respons keberhasilan untuk menambahkan nilai name ke pengikatan output msg.

msg.setValue(name);

Saat menggunakan pengikatan output, Anda tidak perlu menggunakan kode SDK Azure Storage untuk autentikasi, mendapatkan referensi antrean, atau menulis data. Runtime Functions dan pengikatan output antrean akan melakukan tugas-tugas tersebut untuk Anda.

Metode run Anda sekarang harus terlihat seperti contoh berikut:

public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) 
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", 
        connection = "AzureWebJobsStorage") OutputBinding<String> msg, 
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

    // Parse query parameter
    String query = request.getQueryParameters().get("name");
    String name = request.getBody().orElse(query);

    if (name == null) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
        .body("Please pass a name on the query string or in the request body").build();
    } else {
        // Write the name to the message queue. 
        msg.setValue(name);

        return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
    }
}

Perbarui uji coba

Karena arketipe juga membuat kumpulan pengujian, Anda perlu memperbarui pengujian ini untuk menangani parameter msg baru di tanda tangan metode run.

Telusuri ke lokasi kode pengujian Anda di bawah src/test/java, buka file Function.java project, dan ganti baris kode di bawah //Invoke dengan kode berikut:

@SuppressWarnings("unchecked")
final OutputBinding<String> msg = (OutputBinding<String>)mock(OutputBinding.class);
final HttpResponseMessage ret = new Function().run(req, msg, context);

Amati bahwa Anda tidak perlu menulis kode apa pun untuk autentikasi, mendapatkan referensi antrean, atau menulis data. Semua tugas integrasi ini ditangani dengan mudah di runtime Azure Functions dan pengikatan output antrean.

Jalankan fungsi secara lokal

  1. Jalankan fungsi Anda dengan memulai host runtime Azure Functions lokal dari folder LocalFunctionProj.

    func start
    

    Menjelang akhir output, baris berikut harus muncul:

    Screenshot output jendela terminal saat menjalankan fungsi secara lokal.

    Catatan

    Jika HttpExample tidak muncul seperti yang ditunjukkan di atas, Anda mungkin memulai host dari luar folder akar project. Dalam hal ini, gunakan Ctrl+C untuk menghentikan host, buka folder akar project, dan jalankan perintah sebelumnya lagi.

  2. Salin URL fungsi HTTP Anda dari output ini ke browser dan tambahkan string ?name=<YOUR_NAME>kueri , membuat URL lengkap seperti http://localhost:7071/api/HttpExample?name=Functions. Browser akan menampilkan pesan tanggapan yang mengulang nilai string kueri Anda. Terminal tempat Anda memulai project juga menampilkan output log saat Anda membuat permintaan.

  3. Setelah selesai, tekan Ctrl + C dan ketik y untuk menghentikan pengelola fungsi.

Lihat pesan dalam antrean Azure Storage

Anda dapat melihat antrean di Azure portal atau di Microsoft Azure Storage Explorer. Anda juga dapat melihat antrean di Azure CLI, seperti yang dijelaskan dalam langkah-langkah berikut:

  1. Buka file local.setting.json proyek fungsi dan salin nilai string koneksi. Di terminal atau jendela perintah, jalankan perintah berikut untuk membuat variabel lingkungan bernama AZURE_STORAGE_CONNECTION_STRING, dan tempelkan connection string spesifik Anda sebagai ganti <MY_CONNECTION_STRING>. (Variabel lingkungan ini berarti Anda tidak perlu menyediakan connection string ke setiap perintah berikutnya menggunakan argumen --connection-string.)

    export AZURE_STORAGE_CONNECTION_STRING="<MY_CONNECTION_STRING>"
    
  2. (Opsional) Gunakan perintah az storage queue list untuk melihat antrean Storage di akun Anda. Output dari perintah ini harus mencakup antrian bernama outqueue, yang dibuat ketika fungsi menulis pesan pertamanya pada antrean tersebut.

    az storage queue list --output tsv
    
  3. Gunakan perintah az storage message get untuk membaca pesan dari antrean ini, yang seharusnya menjadi nilai yang Anda berikan saat menguji fungsi sebelumnya. Perintah ini membaca dan menghapus pesan yang pertama dari antrean.

    echo `echo $(az storage message get --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --decode`
    

    Karena isi pesan disimpan base64 dikodekan, pesan harus didekodekan sebelum ditampilkan. Setelah Anda menjalankan az storage message get, pesan dihapus dari antrean. Jika hanya ada satu pesan dalam outqueue, Anda tidak akan mengambil pesan saat menjalankan perintah ini untuk kedua kalinya dan sebaliknya mendapatkan kesalahan.

Menyebarkan ulang project ke Azure

Setelah Anda memverifikasi secara lokal bahwa fungsi menuliskan pesan ke antrean Azure Storage, Anda dapat menyebarkan ulang proyek untuk memperbarui titik akhir berjalan di Azure.

Di folder LocalFunctionsProj, gunakan perintah func azure functionapp publish untuk menyebarkan ulang project, mengganti<APP_NAME> dengan nama aplikasi Anda.

func azure functionapp publish <APP_NAME>

Di folder project lokal, gunakan perintah Maven berikut untuk menerbitkan ulang project Anda:

mvn azure-functions:deploy

Verifikasi di Azure

  1. Seperti pada panduan memulai cepat sebelumnya, gunakan browser atau CURL untuk menguji fungsi yang telah diterapkan ulang.

    Salin Invoke URL lengkap yang ditampilkan dalam output perintah publish ke bilah alamat browser, menambahkan parameter query &name=Functions. Browser harus menampilkan output yang sama seperti saat Anda menjalankan fungsi secara lokal.

  2. Periksa kembali antrean Storage, seperti yang dijelaskan di bagian sebelumnya, untuk memverifikasi bahwa antrean tersebut berisi pesan baru yang ditulis ke dalamnya.

Membersihkan sumber daya

Setelah selesai, gunakan perintah berikut untuk menghapus grup sumber daya dan semua sumber daya yang terkandung untuk menghindari timbulnya biaya lebih lanjut.

az group delete --name AzureFunctionsQuickstart-rg

Langkah berikutnya

Anda telah memperbarui fungsi yang dipicu HTTP untuk menulis data ke antrean Penyimpanan. Sekarang Anda dapat mempelajari selengkapnya tentang mengembangkan Functions dari baris perintah menggunakan Core Tools dan Azure CLI: