Mengonfigurasi Secret Manager untuk lingkungan Anda

Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3

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 agar Anda dapat menggunakan secret dengan lingkungan Cloud Composer.

Mengaktifkan Secret Manager API

Konsol

Enable the Secret Manager API.

Enable the API

gcloud

Enable the Secret Manager API:

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:

Mengaktifkan serialisasi DAG

Secara umum, Anda hanya boleh menggunakan backend Secret Manager dari dalam metode execute() operator, atau dengan template Jinja. Misalnya, Anda dapat mengambil variabel menggunakan var.value.example_var.

Server web Airflow berjalan di akun layanan lain 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 tidak dapat disesuaikan untuk mengakses secret dari dalam metode execute(), aktifkan serialisasi DAG. Setelah Anda melakukannya, server web Airflow akan mengambil DAG yang diproses dan tidak memerlukan akses ke secret.

Mengaktifkan dan mengonfigurasi backend Secret Manager

  1. Ganti opsi konfigurasi Airflow berikut:

    Bagian Kunci Nilai
    secrets backend airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
  2. 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 objek backend_kwargs dengan kolom berikut:

    • connections_prefix: awalan nama secret yang akan dibaca untuk mendapatkan Koneksi. Defaultnya adalah airflow-connections.
    • variables_prefix: awalan nama secret yang akan dibaca untuk mendapatkan Variabel. Default-nya adalah: airflow-variables.
    • gcp_key_path: jalur ke file JSON Kredensial Google Cloud (jika tidak diberikan, akun layanan default akan digunakan).
    • gcp_keyfile_dict: Kamus JSON Kredensial Google Cloud. Tidak dapat muncul bersama-sama dengan gcp_key_path.
    • sep: pemisah yang digunakan untuk menyambungkan connections_prefix dan conn_id. Defaultnya adalah -.
    • project_id: Project ID Google Cloud tempat secret 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 [variables_prefix][sep][variable_name].
  • Nilai default untuk [variables_prefix] adalah airflow-variables.
  • Pemisah default [sep] adalah -.

Misalnya, jika nama variabel 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] adalah airflow-connections.
  • Pemisah default [sep] adalah -.

Misalnya, jika nama koneksi adalah exampleConnection, nama secret-nya adalah airflow-connections-exampleConnection.

Nilai koneksi

  • Harus menggunakan representasi URI. Contoh, postgresql://login:secret@examplehost:9000.

  • URI harus dienkode ke URL (dienkode persen). Misalnya, sandi yang memiliki simbol spasi di dalamnya harus dienkode URL sebagai berikut: postgresql://login:secret%20password@examplehost:9000.

Airflow memiliki metode praktis untuk membuat URI koneksi. Contoh cara mengenkode URL kompleks dengan tambahan JSON tersedia di dokumentasi Airflow.

Menggunakan Secret Manager dengan Cloud Composer

Saat mengambil variabel dan koneksi, Cloud Composer akan memeriksa Secret Manager terlebih dahulu. Jika variabel atau koneksi 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 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 dalam 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 pembuatan instance, dan harus mengambil koneksi dari backend secret secara otomatis saat tugas dieksekusi.

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 mendapatkan representasi string URI koneksi seperti ini:

exampleConnectionUri = BaseHook.get_connection('exampleConnection').get_uri()

Langkah selanjutnya