Managed Airflow (Generasi ke-3) | Managed Airflow (Generasi ke-2) | Managed Airflow (Generasi ke-1 Lama)
Halaman ini menunjukkan cara menggunakan Secret Manager untuk menyimpan koneksi dan secret Airflow secara aman.
Mengonfigurasi Secret Manager untuk lingkungan Anda
Bagian ini menjelaskan cara mengonfigurasi Secret Manager sehingga Anda dapat menggunakan secret dengan lingkungan Managed Airflow.
Mengaktifkan Secret Manager API
Konsol
Aktifkan Secret Manager API.
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan peran IAM Service Usage Admin
(roles/serviceusage.serviceUsageAdmin),
yang berisi izin serviceusage.services.enable. Pelajari cara memberikan
peran.
gcloud
Aktifkan Secret Manager API:
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan peran IAM Service Usage Admin (roles/serviceusage.serviceUsageAdmin), yang berisi izin
serviceusage.services.enable. Pelajari cara memberikan
peran.
gcloud services enable secretmanager.googleapis.com
Mengonfigurasi kontrol akses
Anda harus mengonfigurasi kontrol akses agar Airflow dapat mengakses secret yang disimpan di Secret Manager.
Untuk melakukannya, akun layanan yang mengakses secret harus memiliki peran dengan izin secretmanager.versions.access. Misalnya, peran Secret Manager Secret Accessor mencakup izin ini.
Anda dapat memberikan peran ini di tingkat Secret, Project, Folder, atau Org.
Gunakan salah satu opsi berikut:
(Direkomendasikan) Berikan peran ini ke akun layanan lingkungan Anda.
Ganti akun layanan yang digunakan Airflow untuk mengakses Secret Manager.
- Berikan peran ini ke akun layanan.
- Tetapkan parameter
gcp_key_pathdaribackend_kwargsopsi konfigurasi Airflow untuk mengarah ke file JSON dengan kredensial akun layanan.
Mengaktifkan dan mengonfigurasi backend Secret Manager
Ganti opsi konfigurasi Airflow berikut:
Bagian Kunci Nilai secretsbackendairflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend(Airflow 2.10.2 dan yang lebih baru) Pastikan opsi konfigurasi Airflow
[secrets]backends_ordermenentukan urutan penelusuran secret yang memiliki backend secretcustomdi dalamnya. Nilai default opsi ini sudah berisi nilai ini.Bagian Kunci Nilai secretsbackends_order(default) custom,environment_variable,metastoreTambahkan setelan opsional dengan mengganti opsi konfigurasi Airflow berikut:
Bagian Kunci Nilai secretsbackend_kwargsLihat deskripsi berikut. Nilai
backend_kwargsadalah representasi JSON dari objekbackend_kwargsdengan kolom berikut:connections_prefix: awalan nama secret yang akan dibaca untuk mendapatkan Koneksi. Defaultnya adalahairflow-connections.variables_prefix: awalan nama secret yang akan dibaca untuk mendapatkan Variabel. Defaultnya adalah:airflow-variables.gcp_key_path: jalur ke file JSON Kredensial (jika tidak disediakan, akun layanan default akan digunakan). Google Cloudgcp_keyfile_dict: Google Cloud kamus JSON Kredensial. Tidak dapat muncul bersamaan dengangcp_key_path.sep: pemisah yang digunakan untuk menggabungkanconnections_prefixdanconn_id. Defaultnya adalah-.project_id: Google Cloud Project ID tempat secret disimpan.
Misalnya, nilai
backend_kwargsdapat berupa:{"project_id": "<project id>", "connections_prefix":"example-connections", "variables_prefix":"example-variables", "sep":"-"}.
Menambahkan koneksi dan variabel di Secret Manager
Buat secret dengan mengikuti langkah-langkah yang diuraikan dalam Membuat secret dan versi.
Variabel
- Harus menggunakan format
[variables_prefix][sep][variable_name]. - Nilai default untuk
[variables_prefix]adalahairflow-variables. - Pemisah default
[sep]adalah-.
Misalnya, jika nama variabelnya adalah example-var, nama secret-nya
adalah airflow-variables-example-var.
Nama koneksi
- Harus menggunakan format
[connection_prefix][sep][connection_name]. - Nilai default untuk
[connection_prefix]adalahairflow-connections. - Pemisah default
[sep]adalah-.
Misalnya, jika nama koneksinya adalah exampleConnection, nama secret
nya adalah airflow-connections-exampleConnection.
Nilai koneksi
Harus menggunakan representasi URI. Misalnya,
postgresql://login:secret@examplehost:9000.URI harus berenkode URL (enkode persen). Misalnya, sandi yang memiliki simbol spasi di dalamnya harus berenkode URL sebagai berikut:
postgresql://login:secret%20password@examplehost:9000.
Airflow memiliki metode praktis untuk membuat koneksi URI. Contoh cara mengenkode URL kompleks dengan tambahan JSON tersedia dalam dokumentasi Airflow.
Menggunakan Secret Manager dengan Managed Airflow
Saat mengambil variabel dan koneksi, Managed Airflow akan memeriksa Secret Manager terlebih dahulu. Jika variabel atau koneksi yang diminta tidak ditemukan, Managed Airflow akan memeriksa variabel lingkungan dan database Airflow.
Membaca variabel menggunakan templating Jinja
Anda dapat menggunakan Secret Manager untuk membaca variabel dengan templating Jinja untuk kolom operator yang di-template (diselesaikan pada waktu eksekusi).
Untuk secret airflow-variables-secret_filename:
file_name = '{{var.value.secret_filename}}'
Membaca variabel menggunakan operator dan callback kustom
Anda juga dapat menggunakan Secret Manager untuk membaca variabel dalam operator kustom atau metode callback dari operator. Membaca variabel dari dalam DAG dapat berdampak negatif pada performa, jadi gunakan template Jinja jika Anda ingin menggunakan variabel di DAG.
Misalnya, untuk secret airflow-variables-secret_filename:
from airflow.models.variable import Variable
file_name = Variable.get('secret_filename')
Membaca koneksi
Kecuali jika Anda menulis operator kustom, Anda jarang perlu mengakses koneksi secara langsung. Sebagian besar hook mendapatkan nama koneksi sebagai parameter instansiasi, dan harus mengambil koneksi dari backend secret secara otomatis saat tugas dijalankan.
Membaca koneksi secara langsung mungkin berguna saat menulis hook Anda sendiri.
Misalnya, untuk koneksi airflow-connections-exampleConnection:
from airflow.hooks.base_hook import BaseHook
exampleConnection = BaseHook.get_connection('exampleConnection')
BaseHook.get_connection menampilkan objek Connection. Anda dapat memperoleh representasi string URI koneksi seperti ini:
exampleConnectionUri = BaseHook.get_connection('exampleConnection').get_uri()