Menyambungkan Azure Functions ke Azure SQL Database menggunakan Kode Visual Studio

Azure Functions memungkinkan Anda menghubungkan layanan Azure dan sumber daya lain ke fungsi tanpa harus menulis kode integrasi Anda sendiri. Pengikatanini, yang mewakili input dan output, dinyatakan dalam definisi fungsi. Data dari pengikatan diberikan ke fungsi sebagai parameter. Pemicu adalah jenis pengikatan input khusus. Meskipun fungsi hanya memiliki satu pemicu, fungsi dapat memiliki beberapa pengikatan input dan output. Untuk mempelajari selengkapnya, lihat konsep pemicu dan pengikatan Azure Functions.

Artikel ini memperlihatkan kepada Anda cara menggunakan Kode Visual Studio untuk menyambungkan Azure SQL Database ke fungsi yang Anda buat di artikel mulai cepat sebelumnya. Pengikatan output yang Anda tambahkan ke fungsi ini menulis data dari permintaan HTTP ke tabel di Azure SQL Database.

Sebelum memulai, Anda harus menyelesaikan quickstart: Membuat fungsi C# di Azure menggunakan Kode Visual Studio. 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 quickstart: Membuat fungsi JavaScript di Azure menggunakan Kode Visual Studio. 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 quickstart: Membuat fungsi Python di Azure menggunakan Kode Visual Studio. 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.

Detail selengkapnya tentang pengaturan untuk pengikatan Azure SQL dan pemicu untuk Azure Functions tersedia dalam dokumentasi Azure Functions.

Buat Azure SQL Database Anda

  1. Ikuti Azure SQL Database panduan memulai cepat untuk membuat Azure SQL Database tanpa server. Database dapat kosong atau dibuat dari himpunan data sampel AdventureWorksLT.

  2. Berikan informasi berikut pada permintaan:

    Cepat Seleksi
    Grup sumber daya Pilih grup sumber daya tempat Anda membuat aplikasi fungsi di artikel sebelumnya.
    Nama database Masukkan mySampleDatabase.
    Nama Server Masukkan nama yang unik untuk server Anda. Kami tidak dapat memberikan nama server yang tepat untuk digunakan karena nama server harus unik secara global untuk semua server di Azure, bukan hanya unik dalam langganan.
    Metode autentikasi Pilih autentikasi SQL Server.
    Proses masuk admin server Masukkan azureuser.
    Kata sandi Masukkan kata sandi yang memenuhi persyaratan kompleksitas.
    Perbolehkan layanan dan sumber daya Azure untuk access server ini Pilih Ya.

    Penting

    Artikel ini saat ini memperlihatkan cara menyambungkan ke Azure SQL Database dengan menggunakan autentikasi SQL Server. Untuk keamanan terbaik, Anda harus menggunakan identitas terkelola untuk koneksi Azure SQL Database. Untuk informasi selengkapnya, lihat Buat server Azure SQL Database dengan identitas terkelola yang ditetapkan pengguna.

  3. Setelah pembuatan selesai, navigasikan ke bilah database di Azure portal, dan, di bawah Settings, pilih String koneksi. Salin ADO.NET connection string untuk autentikasi SQL. Tempelkan connection string ke dalam dokumen sementara untuk digunakan nanti.

    Cuplikan layar dari menyalin string koneksi Azure SQL Database di portal Azure.

  4. Buat tabel untuk menyimpan data dari permintaan HTTP. Di Azure portal, navigasikan ke bilah database dan pilih Query editor. Masukkan kueri berikut untuk membuat tabel bernama dbo.ToDo:

    CREATE TABLE dbo.ToDo (
        [Id] UNIQUEIDENTIFIER PRIMARY KEY,
        [order] INT NULL,
        [title] NVARCHAR(200) NOT NULL,
        [url] NVARCHAR(200) NOT NULL,
        [completed] BIT NOT NULL
    );
    
  5. Verifikasi bahwa Fungsi Azure Anda dapat mengakses Azure SQL Database dengan memeriksa pengaturan firewall pada server. Navigasi ke bilah server pada Azure portal, dan di bawah Keamanan, pilih Jaringan. Pengecualian untuk Perbolehkan layanan dan sumber daya Azure mengakses server ini harus diperiksa.

    Screenshot memeriksa pengaturan firewall Azure SQL Database di Azure portal.

Memperbarui pengaturan aplikasi fungsi Anda

Di artikel pengantar cepat sebelumnya, Anda membuat aplikasi fungsi di Azure. Dalam artikel ini, Anda memperbarui aplikasi untuk menulis data ke Azure SQL Database yang baru saja Anda buat. Untuk menyambungkan ke Azure SQL Database, Anda harus menambahkan connection string ke pengaturan aplikasi Anda. Anda kemudian mengunduh pengaturan baru ke file local.settings.json sehingga Anda dapat tersambung ke Azure SQL Database saat berjalan secara lokal.

  1. Edit connection string dalam dokumen sementara yang Anda buat sebelumnya. Ganti nilai Password dengan kata sandi yang Anda gunakan saat membuat Azure SQL Database. Salin connection string yang diperbarui.

  2. Tekan Ctrl/Cmd+shift+P untuk membuka palet perintah, lalu cari dan jalankan perintah Azure Functions: Add New Setting....

  3. Pilih aplikasi fungsi yang Anda buat di artikel sebelumnya. Berikan informasi berikut pada permintaan:

    Cepat Seleksi
    Masukkan nama pengaturan aplikasi baru Ketik SqlConnectionString.
    Masukkan nilai untuk "SqlConnectionString" Tempelkan string sambungan Azure SQL Database yang baru saja Anda salin.

    Ini membuat pengaturan aplikasi bernama koneksi SqlConnectionString di aplikasi fungsi Anda di Azure. Sekarang, Anda dapat mengunduh pengaturan ini ke file local.settings.json.

  4. Tekan Ctrl/Cmd+shift+P lagi untuk membuka palet perintah, lalu cari dan jalankan perintah Azure Functions: Download Remote Settings....

  5. Pilih aplikasi fungsi yang Anda buat di artikel sebelumnya. Pilih Ya untuk semua untuk mengganti pengaturan lokal yang ada.

Ini mengunduh semua pengaturan dari Azure ke proyek lokal Anda, termasuk pengaturan connection string baru. Sebagian besar pengaturan yang diunduh tidak digunakan saat berjalan secara lokal.

Mendaftarkan ekstensi pengikatan

Karena Anda menggunakan pengikatan output Azure SQL, Anda harus menginstal ekstensi pengikatan yang sesuai sebelum menjalankan project.

Dengan pengecualian pemicu HTTP dan timer, pengikatan diimplementasikan sebagai paket ekstensi. Jalankan perintah dotnet add package berikut ini di jendela Terminal untuk menambahkan paket ekstensi Azure SQL ke project Anda.

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Sql

project Anda telah dikonfigurasi untuk menggunakan bundel extension, yang secara otomatis menginstal serangkaian paket ekstensi yang telah ditentukan sebelumnya.

Penggunaan bundel ekstensi diaktifkan dalam file host.json di akar project, yang muncul sebagai berikut:

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  },
  "concurrency": {
    "dynamicConcurrencyEnabled": true,
    "snapshotPersistenceEnabled": true
  }
}

:::

Sekarang, Anda dapat menambahkan pengikatan output Azure SQL ke project Anda.

Menambah pengikatan keluaran

Di Functions, setiap jenis pengikatan memerlukan direction, type, dan name yang unik agar dapat didefinisikan dalam file function.json. Cara Anda menentukan atribut ini tergantung pada bahasa komputer aplikasi fungsi Anda.

Buka file HttpExample.cs project dan tambahkan kelas ToDoItem berikut, yang menentukan objek yang ditulis ke database:

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}

Dalam proyek pustaka kelas C#, pengikatan didefinisikan sebagai atribut pengikatan pada fungsi metode. File function.json yang diperlukan oleh Functions kemudian dibuat secara otomatis berdasarkan atribut ini.

Buka file HttpExample.cs project dan tambahkan kelas jenis output berikut, yang menentukan objek gabungan yang akan menjadi output dari fungsi kami untuk respons HTTP dan output SQL:

public static class OutputType
{
    [SqlOutput("dbo.ToDo", connectionStringSetting: "SqlConnectionString")]
    public ToDoItem ToDoItem { get; set; }
    public HttpResponseData HttpResponse { get; set; }
}

Tambahkan pernyataan penggunaan ke pustaka Microsoft.Azure.Functions.Worker.Extensions.Sql ke bagian atas file:

using Microsoft.Azure.Functions.Worker.Extensions.Sql;

Atribut pengikatan didefinisikan langsung dalam kode Anda. Konfigurasi output Azure SQL menjelaskan bidang yang diperlukan untuk pengikatan output Azure SQL.

Untuk skenario ini MultiResponse , Anda perlu menambahkan pengikatan extraOutputs output ke fungsi .

app.http('HttpExample', {
  methods: ['GET', 'POST'],
  extraOutputs: [sendToSql],
  handler: async (request, context) => {

Tambahkan properti berikut ke konfigurasi pengikatan:

const sendToSql = output.sql({
  commandText: 'dbo.ToDo',
  connectionStringSetting: 'SqlConnectionString',
});

Atribut pengikatan didefinisikan langsung dalam file function_app.py . Anda menggunakan dekorator generic_output_binding untuk menambahkan pengikatan output Azure SQL:

@app.generic_output_binding(arg_name="toDoItems", type="sql", CommandText="dbo.ToDo", ConnectionStringSetting="SqlConnectionString"
    data_type=DataType.STRING)

Dalam kode ini, arg_name mengidentifikasi parameter pengikatan yang dirujuk dalam kode Anda, type menunjukkan pengikatan output adalah pengikatan output SQL, CommandText adalah tabel yang ditulis pengikatan, dan ConnectionStringSetting adalah nama pengaturan aplikasi yang berisi Azure SQL connection string. connection string ada di pengaturan SqlConnectionString di file local.settings.json.

Tambahkan kode yang menggunakan pengikatan output

Ganti metode Eksekusi yang ada dengan kode berikut:

[Function("HttpExample")]
public static OutputType Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
    FunctionContext executionContext)
{
    var logger = executionContext.GetLogger("HttpExample");
    logger.LogInformation("C# HTTP trigger function processed a request.");

    var message = "Welcome to Azure Functions!";

    var response = req.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
    response.WriteString(message);

    // Return a response to both HTTP trigger and Azure SQL output binding.
    return new OutputType()
    {
         ToDoItem = new ToDoItem
        {
            id = System.Guid.NewGuid().ToString(),
            title = message,
            completed = false,
            url = ""
        },
        HttpResponse = response
    };
}

Tambahkan kode yang menggunakan extraInputs objek pengikatan output pada context untuk mengirim dokumen JSON ke fungsi pengikatan output bernama, sendToSql. Tambahkan kode ini sebelum pernyataan return.

const data = JSON.stringify([
  {
    // create a random ID
    Id: crypto.randomUUID(),
    title: name,
    completed: false,
    url: '',
  },
]);

// Output to Database
context.extraOutputs.set(sendToSql, data);

Untuk menggunakan crypto modul, tambahkan baris berikut ke bagian atas file:

const crypto = require("crypto");

Pada titik ini, fungsi Anda akan terlihat sebagai berikut:

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

const sendToSql = output.sql({
  commandText: 'dbo.ToDo',
  connectionStringSetting: 'SqlConnectionString',
});

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

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

      if (!name) {
        return { status: 404, body: 'Missing required data' };
      }

      // Stringified array of objects to be inserted into the database
      const data = JSON.stringify([
        {
          // create a random ID
          Id: crypto.randomUUID(),
          title: name,
          completed: false,
          url: '',
        },
      ]);

      // Output to Database
      context.extraOutputs.set(sendToSql, data);

      const responseMessage = name
        ? 'Hello, ' +
          name +
          '. This HTTP triggered function executed successfully.'
        : 'This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.';

      // Return to HTTP client
      return { body: responseMessage };
    } catch (error) {
      context.log(`Error: ${error}`);
      return { status: 500, body: 'Internal Server Error' };
    }
  },
});

Perbarui function_app.py agar sesuai dengan kode berikut. Tambahkan parameter toDoItems ke definisi fungsi dan toDoItems.set() di bawah pernyataan if name:.

import azure.functions as func
import logging
from azure.functions.decorators.core import DataType
import uuid

app = func.FunctionApp()

@app.function_name(name="HttpTrigger1")
@app.route(route="hello", auth_level=func.AuthLevel.FUNCTION)
@app.generic_output_binding(arg_name="toDoItems", type="sql", CommandText="dbo.ToDo", ConnectionStringSetting="SqlConnectionString",data_type=DataType.STRING)
def test_function(req: func.HttpRequest, toDoItems: func.Out[func.SqlRow]) -> func.HttpResponse:
     logging.info('Python HTTP trigger function processed a request.')
     name = req.get_json().get('name')
     if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

     if name:
        toDoItems.set(func.SqlRow({"Id": str(uuid.uuid4()), "title": name, "completed": False, "url": ""}))
        return func.HttpResponse(f"Hello {name}!")
     else:
        return func.HttpResponse(
                    "Please pass a name on the query string or in the request body",
                    status_code=400
                )

Jalankan fungsi secara lokal

Visual Studio Code terintegrasi dengan alat Azure Functions Core untuk memungkinkan Anda menjalankan project ini di komputer pengembangan lokal anda sebelum menerbitkan ke Azure. Jika Anda belum menginstal Core Tools secara lokal, Anda akan diminta untuk menginstalnya saat pertama kali menjalankan project Anda.

  1. Untuk memanggil fungsi Anda, tekan F5 untuk memulai aplikasi fungsi proyek. Panel Terminal menampilkan output dari Core Tools. Aplikasi Anda dimulai di panel Terminal. Anda dapat melihat titik akhir URL dari fungsi yang dipicu HTTP berjalan secara lokal.

    Screenshot dari output fungsi Local di Visual Studio Code.

    Jika Anda belum menginstal Core Tools, pilih Install untuk menginstal Core Tools saat diminta untuk melakukannya.
    Jika Anda mengalami masalah saat berjalan di Windows, pastikan terminal default untuk kode Visual Studio tidak diatur ke WSL Bash.

  2. Dengan Core Tools berjalan, buka area Azure: Functions. Di bawah Functions, perluas Local Project>Functions. Klik kanan (Windows) atau Ctrl - klik (macOS) fungsi HttpExample dan pilih Jalankan Fungsi Sekarang....

    Cuplikan layar dari fungsi eksekusi di Visual Studio Code saat ini.

  3. Di Masukkan isi permintaan, tekan Enter untuk mengirim pesan permintaan ke fungsi Anda.

  4. Saat fungsi dijalankan secara lokal dan mengembalikan respons, pemberitahuan dinaikkan dalam Kode Visual Studio. Informasi tentang eksekusi fungsi ditampilkan di panel Terminal.

  5. Tekan Ctrl + C untuk menghentikan Azure Functions Core Tools dan putuskan sambungan debugger.

Jalankan fungsi secara lokal

  1. Seperti pada artikel sebelumnya, tekan F5 untuk memulai proyek aplikasi fungsi dan Core Tools.

  2. Dengan Core Tools berjalan, buka area Azure: Functions. Di bawah Functions, perluas Local Project>Functions. Klik kanan (klik Ctrl di Mac) fungsi HttpExample dan pilih Jalankan Fungsi Sekarang....

    Screenshot dari item menu fungsi 'execute now' di Visual Studio Code.

  3. Di dalam Enter request body, Anda melihat nilai dari isi pesan permintaan { "name": "Azure" }. Tekan Masukkan untuk mengirim pesan permintaan ini ke fungsi Anda.

  4. Setelah respons dikembalikan, tekan Ctrl + C untuk menghentikan Core Tools.

Verifikasi bahwa informasi telah ditulis ke database

  1. Pada Azure portal, kembali ke Azure SQL Database Anda dan pilih Query editor.

    Screenshot dari masuk ke editor kueri pada Portal Azure.

  2. Sambungkan ke database Anda dan perluas simpul Tables di object explorer di sebelah kiri. Klik kanan pada dbo.ToDo tabel dan pilih Pilih 1000 Baris Teratas.

  3. Verifikasi bahwa informasi baru telah ditulis ke database oleh pengikatan output.

Menyebarkan ulang dan memverifikasi aplikasi yang diperbarui

  1. Di kode Visual Studio, tekan F1 untuk membuka palet perintah. Di palet perintah, cari dan pilih Azure Functions: Deploy to function app....

  2. Pilih aplikasi fungsi yang Anda buat di artikel pertama. Karena Anda mendeploy ulang project ke aplikasi yang sama, pilih Deploy untuk mengabaikan peringatan tentang penimpaan file.

  3. Setelah penyebaran selesai, Anda dapat kembali menggunakan fitur Execute Function Now... untuk memicu fungsi di Azure. Perintah ini secara otomatis mengambil kunci access fungsi dan menggunakannya saat memanggil titik akhir pemicu HTTP.

  4. Sekali lagi periksa data yang ditulis ke Azure SQL Database untuk memverifikasi bahwa pengikatan output kembali menghasilkan dokumen JSON baru.

Membersihkan sumber daya

Dalam Azure, resources merujuk pada aplikasi fungsi, fungsi, akun penyimpanan, dan sebagainya. Sumber daya tersebut dikelompokkan ke dalamgrup sumber daya, dan Anda dapat menghapus semuanya dalam grup dengan menghapus grup.

Anda telah membuat sumber daya untuk menyelesaikan mulai cepat ini. Anda dapat ditagih untuk sumber daya ini, tergantung pada status akun dan harga layanan. Jika Anda tidak memerlukan sumber daya lagi, berikut cara menghapusnya:

  1. Di Kode Visual Studio, tekan F1 untuk membuka palet perintah. Di palet perintah, cari dan pilih Azure: Open in portal.

  2. Pilih aplikasi fungsi Anda dan tekan Enter. Halaman aplikasi fungsi terbuka di Azure portal.

  3. Di tab Ringkasan, pilih tautan bernama di samping Grup sumber daya.

    Cuplikan layar pemilihan grup sumber daya yang akan dihapus dari halaman aplikasi fungsi.

  4. Di halaman Grup sumber daya, tinjau daftar sumber daya yang disertakan, dan pastikan sumber daya tersebut adalah sumber daya yang ingin Anda hapus.

  5. Pilih Hapus grup sumber daya, dan ikuti instruksinya.

    Penghapusan mungkin perlu waktu beberapa menit. Setelah selesai, pemberitahuan akan muncul selama beberapa detik. Anda juga dapat memilih ikon bel di bagian atas halaman untuk melihat pemberitahuan.

Langkah berikutnya

Anda telah memperbarui fungsi yang dipicu HTTP untuk menulis data ke Azure SQL Database. Sekarang Anda dapat mempelajari selengkapnya tentang mengembangkan Functions menggunakan kode Visual Studio: