Cloud Composer 1 | Cloud Composer 2
Halaman ini menunjukkan cara menggunakan Secret Manager untuk menyimpan koneksi dan secret Airflow dengan aman.
Sebelum memulai
- Untuk menggunakan Secret Manager, lingkungan Cloud Composer Anda harus menggunakan Airflow 1.10.10 atau yang lebih baru dan Python 3.6 atau yang lebih baru.
- Python 2 tidak didukung.
Mengonfigurasi Secret Manager untuk lingkungan Anda
Bagian ini menjelaskan cara mengonfigurasi Secret Manager sehingga Anda dapat menggunakan secret dengan lingkungan Cloud Composer.
Mengaktifkan Secret Manager API
Konsol
Aktifkan API Secret Manager.
gcloud
Aktifkan API Secret Manager:
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 Aksesor Rahasia Secret Manager menyertakan izin ini.
Anda dapat memberikan peran ini di tingkat Rahasia, Project, Folder, atau Org.
Gunakan salah satu opsi berikut:
(Direkomendasikan) Berikan peran ini ke akun layanan lingkungan Anda.
Ganti akun layanan tempat Airflow mengakses Secret Manager.
- Berikan peran ini ke akun layanan.
- Tetapkan parameter
gcp_key_path
dari opsi konfigurasi Airflowbackend_kwargs
agar mengarah ke file JSON dengan kredensial akun layanan.
Mengaktifkan serialisasi DAG
Secara umum, Anda hanya boleh menggunakan backend Secret Manager dari
dalam metode execute()
operator Anda, atau dengan
template Jinja.
Misalnya, Anda dapat mengambil variabel menggunakan var.value.example_var
.
Server web Airflow berjalan di akun layanan berbeda dengan izin terbatas, sehingga tidak dapat mengakses secret di Secret Manager. Jika kode DAG Anda mengakses secret selama pemrosesan DAG (bukan hanya dari tugas) dan sesuaikan untuk mengakses secret dari dalam metode execute()
, aktifkan serialisasi DAG. Setelah Anda melakukannya, server web Airflow akan mengambil DAG yang telah diproses dan tidak memerlukan akses ke secret.
Mengaktifkan dan mengonfigurasi backend Secret Manager
Ganti opsi konfigurasi Airflow berikut:
Bagian Kunci Nilai secrets
backend
airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
Tambahkan setelan opsional dengan mengganti opsi konfigurasi Airflow berikut:
Bagian Kunci Nilai secrets
backend_kwargs
Lihat deskripsi berikut. Nilai
backend_kwargs
adalah representasi JSON dari objekbackend_kwargs
dengan kolom berikut:connections_prefix
: Menentukan awalan nama rahasia yang akan dibaca untuk mendapatkan Koneksi. Defaultnya adalah:airflow-connections
.variables_prefix
: Menentukan awalan nama rahasia yang akan dibaca untuk mendapatkan Variabel. Defaultnya adalah:airflow-variables
.gcp_key_path
: Jalur ke file JSON Kredensial Google Cloud (jika tidak disediakan, akun layanan default akan digunakan).gcp_keyfile_dict
: Kamus JSON Kredensial Google Cloud. Saling eksklusif dengangcp_key_path
.sep
: pemisah yang digunakan untuk menyambungkanconnections_prefix
danconn_id
. Default:-
.project_id
: ID Project Google Cloud tempat rahasia disimpan.
Misalnya, nilai
backend_kwargs
dapat 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
[variable_prefix][sep][variable_name]
. - Nilai default untuk
[variable_prefix]
adalahairflow-variables
. - Pemisah default
[sep]
adalah-
.
Misalnya, jika nama variabel adalah example-var
, nama rahasianya 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 koneksi adalah exampleConnection
, nama rahasianya adalah airflow-connections-exampleConnection
.
Nilai koneksi
Harus menggunakan representasi URI. Misalnya,
mysql://login:password@examplehost:9000
.URI harus dienkode ke URL (dienkode persen). Misalnya, sandi yang memiliki simbol spasi di dalamnya harus dienkode ke URL sebagai berikut:
mysql://login:secret%20password@examplehost:9000
.
Airflow memiliki metode yang mudah untuk membuat URI koneksi. Contoh cara mengenkode URL yang kompleks dengan tambahan JSON tersedia dalam dokumentasi Airflow.
Menggunakan Secret Manager dengan Cloud Composer
Saat mengambil variabel dan koneksi, Cloud Composer akan memeriksa Secret Manager terlebih dahulu. Jika koneksi atau variabel yang diminta tidak ditemukan, Cloud Composer akan memeriksa variabel lingkungan dan database Airflow.
Membaca variabel menggunakan template Jinja
Anda dapat menggunakan Secret Manager untuk membaca variabel dengan template Jinja untuk kolom operator dengan template (diselesaikan pada waktu eksekusi).
Untuk rahasia 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 dalam DAG.
Misalnya, untuk rahasia 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 biasanya tidak perlu mengakses koneksi secara langsung. Sebagian besar hook mendapatkan nama koneksi sebagai parameter pembuatan instance, dan akan mengambil koneksi dari backend rahasia secara otomatis saat tugas dijalankan.
Membaca langsung koneksi dapat 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 dari koneksi seperti ini:
exampleConnectionUri = BaseHook.get_connection('exampleConnection').get_uri()